Subversion Repositories svnkaklik

Compare Revisions

No changes between revisions

Ignore whitespace Rev 35 → Rev 36

/web/kaklik's_web/torrentflux/AliasFile.php
0,0 → 1,170
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
class AliasFile
{
var $theFile;
 
// File Properties
var $running = "1";
var $percent_done = "0.0";
var $time_left = "";
var $down_speed = "";
var $up_speed = "";
var $sharing = "";
var $torrentowner = "";
var $seeds = "";
var $peers = "";
var $seedlimit = "";
var $uptotal = "";
var $downtotal = "";
var $size = "";
var $errors = array();
 
function AliasFile( $inFile, $user="" )
{
$this->theFile = $inFile;
if ($user != "")
{
$this->torrentowner = $user;
}
 
if(file_exists($inFile))
{
// read the alias file
$arStatus = file($inFile);
$this->running = trim($arStatus[0]);
$this->percent_done = trim($arStatus[1]);
$this->time_left = trim($arStatus[2]);
$this->down_speed = trim($arStatus[3]);
$this->up_speed = trim($arStatus[4]);
$this->torrentowner = trim($arStatus[5]);
$this->seeds = trim($arStatus[6]);
$this->peers = trim($arStatus[7]);
$this->sharing = trim($arStatus[8]);
$this->seedlimit = trim($arStatus[9]);
$this->uptotal = trim($arStatus[10]);
$this->downtotal = trim($arStatus[11]);
$this->size = trim($arStatus[12]);
 
if (sizeof($arStatus) > 13)
{
for ($inx = 13; $inx < sizeof($arStatus); $inx++)
{
array_push($this->errors, $arStatus[$inx]);
}
}
}
else
{
// this file does not exist (yet)
}
}
 
//----------------------------------------------------------------
// Call this when wanting to create a new alias and/or starting it
function StartTorrentFile()
{
// Reset all the var to new state (all but torrentowner)
$this->running = "1";
$this->percent_done = "0.0";
$this->time_left = "Starting...";
$this->down_speed = "";
$this->up_speed = "";
$this->sharing = "";
$this->seeds = "";
$this->peers = "";
$this->seedlimit = "";
$this->uptotal = "";
$this->downtotal = "";
$this->errors = array();
 
// Write to file
$this->WriteFile();
}
 
//----------------------------------------------------------------
// Call this when wanting to create a new alias and/or starting it
function QueueTorrentFile()
{
// Reset all the var to new state (all but torrentowner)
$this->running = "3";
$this->time_left = "Waiting...";
$this->down_speed = "";
$this->up_speed = "";
$this->seeds = "";
$this->peers = "";
$this->errors = array();
 
// Write to file
$this->WriteFile();
}
 
 
//----------------------------------------------------------------
// Common WriteFile Method
function WriteFile()
{
$fw = fopen($this->theFile,"w");
fwrite($fw, $this->BuildOutput());
fclose($fw);
}
 
//----------------------------------------------------------------
// Private Function to put the variables into a string for writing to file
function BuildOutput()
{
$output = $this->running."\n";
$output .= $this->percent_done."\n";
$output .= $this->time_left."\n";
$output .= $this->down_speed."\n";
$output .= $this->up_speed."\n";
$output .= $this->torrentowner."\n";
$output .= $this->seeds."\n";
$output .= $this->peers."\n";
$output .= $this->sharing."\n";
$output .= $this->seedlimit."\n";
$output .= $this->uptotal."\n";
$output .= $this->downtotal."\n";
$output .= $this->size;
for ($inx = 0; $inx < sizeof($this->errors); $inx++)
{
if ($this->errors[$inx] != "")
{
$output .= "\n".$this->errors[$inx];
}
}
return $output;
}
 
//----------------------------------------------------------------
// Public Function to display real total download in MB
function GetRealDownloadTotal()
{
return (($this->percent_done * $this->size)/100)/(1024*1024);
}
}
 
?>
/web/kaklik's_web/torrentflux/BDecode.php
0,0 → 1,268
<?php
 
/*
 
Programming info
 
All functions output a small array, which we'll call $return for now.
 
$return[0] is the data expected of the function
$return[1] is the offset over the whole bencoded data of the next
piece of data.
 
numberdecode returns [0] as the integer read, and [1]-1 points to the
symbol that was interprented as the end of the interger (either "e" or
":").
numberdecode is used for integer decodes both for i11e and 11:hello there
so it is tolerant of the ending symbol.
 
decodelist returns $return[0] as an integer indexed array like you would use in C
for all the entries. $return[1]-1 is the "e" that ends the list, so [1] is the next
useful byte.
 
decodeDict returns $return[0] as an array of text-indexed entries. For example,
$return[0]["announce"] = "http://www.whatever.com:6969/announce";
$return[1]-1 again points to the "e" that ends the dictionary.
 
decodeEntry returns [0] as an integer in the case $offset points to
i12345e or a string if $offset points to 11:hello there style strings.
It also calls decodeDict or decodeList if it encounters a d or an l.
 
 
Known bugs:
- The program doesn't pay attention to the string it's working on.
A zero-sized or truncated data block will cause string offset errors
before they get rejected by the decoder. This is worked around by
suppressing errors.
 
*/
 
// Protect our namespace using a class
class BDecode
{
 
function numberdecode($wholefile, $start)
{
$ret[0] = 0;
$offset = $start;
 
// Funky handling of negative numbers and zero
$negative = false;
if ($wholefile[$offset] == '-')
{
$negative = true;
$offset++;
}
if ($wholefile[$offset] == '0')
{
$offset++;
if ($negative)
{
return array(false);
}
if ($wholefile[$offset] == ':' || $wholefile[$offset] == 'e')
{
$offset++;
$ret[0] = 0;
$ret[1] = $offset;
return $ret;
}
return array(false);
}
while (true)
{
if ($wholefile[$offset] >= '0' && $wholefile[$offset] <= '9')
{
$ret[0] *= 10;
//Added 2005.02.21 - VisiGod
//Changing the type of variable from integer to double to prevent a numeric overflow
settype($ret[0],"double");
//Added 2005.02.21 - VisiGod
$ret[0] += ord($wholefile[$offset]) - ord("0");
$offset++;
}
// Tolerate : or e because this is a multiuse function
else if ($wholefile[$offset] == 'e' || $wholefile[$offset] == ':')
{
$ret[1] = $offset+1;
if ($negative)
{
if ($ret[0] == 0)
{
return array(false);
}
$ret[0] = - $ret[0];
}
return $ret;
}
else
{
return array(false);
}
}
return array(false);
}
 
function decodeEntry($wholefile, $offset=0)
{
if ($wholefile[$offset] == 'd')
{
return $this->decodeDict($wholefile, $offset);
}
if ($wholefile[$offset] == 'l')
{
return $this->decodelist($wholefile, $offset);
}
if ($wholefile[$offset] == "i")
{
$offset++;
return $this->numberdecode($wholefile, $offset);
}
// String value: decode number, then grab substring
$info = $this->numberdecode($wholefile, $offset);
 
if ($info[0] === false)
{
return array(false);
}
 
$ret[0] = substr($wholefile, $info[1], $info[0]);
$ret[1] = $info[1]+strlen($ret[0]);
 
return $ret;
}
 
function decodeList($wholefile, $start)
{
$offset = $start+1;
$i = 0;
if ($wholefile[$start] != 'l')
{
return array(false);
}
 
$ret = array();
 
while (true)
{
if ($wholefile[$offset] == 'e')
{
break;
}
 
$value = $this->decodeEntry($wholefile, $offset);
 
if ($value[0] === false)
{
return array(false);
}
 
$ret[$i] = $value[0];
$offset = $value[1];
$i ++;
}
 
// The empy list is an empty array. Seems fine.
$final[0] = $ret;
$final[1] = $offset+1;
 
return $final;
}
 
// Tries to construct an array
function decodeDict($wholefile, $start=0)
{
$offset = $start;
 
if ($wholefile[$offset] == 'l')
{
return $this->decodeList($wholefile, $start);
}
if ($wholefile[$offset] != 'd')
{
return false;
}
 
$ret = array();
$offset++;
 
while (true)
{
if ($wholefile[$offset] == 'e')
{
$offset++;
break;
}
$left = $this->decodeEntry($wholefile, $offset);
if (!$left[0])
{
return false;
}
$offset = $left[1];
if ($wholefile[$offset] == 'd')
{
// Recurse
 
$value = $this->decodedict($wholefile, $offset);
 
if (!$value[0])
{
return false;
}
 
$ret[addslashes($left[0])] = $value[0];
$offset= $value[1];
 
continue;
}
else if ($wholefile[$offset] == 'l')
{
$value = $this->decodeList($wholefile, $offset);
 
if (!$value[0] && is_bool($value[0]))
{
return false;
}
 
$ret[addslashes($left[0])] = $value[0];
$offset = $value[1];
}
else
{
$value = $this->decodeEntry($wholefile, $offset);
 
if ($value[0] === false)
{
return false;
}
 
$ret[addslashes($left[0])] = $value[0];
$offset = $value[1];
}
}
if (empty($ret))
{
$final[0] = true;
}
else
{
$final[0] = $ret;
}
 
$final[1] = $offset;
 
return $final;
}
 
} // End of class declaration.
 
// Use this function. eg: BDecode("d8:announce44:http://www. ... e");
function BDecode($wholefile)
{
$decoder = new BDecode;
$return = $decoder->decodeEntry($wholefile);
 
return $return[0];
}
 
?>
/web/kaklik's_web/torrentflux/RunningTorrent.php
0,0 → 1,131
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
class RunningTorrent
{
var $statFile = "";
var $torrentFile = "";
var $filePath = "";
var $torrentOwner = "";
var $processId = "";
var $args = "";
 
function RunningTorrent( $psLine )
{
global $cfg;
if (strlen($psLine) > 0)
{
while (strpos($psLine," ") > 0)
{
$psLine = str_replace(" ",' ',trim($psLine));
}
 
$arr = split(' ',$psLine);
 
$this->processId = $arr[0];
 
foreach($arr as $key =>$value)
{
if ($key == 0)
{
$startArgs = false;
}
if ($value == $cfg["btphpbin"])
{
$offset = 2;
if(!strpos($arr[$key+$offset],"/",1) > 0)
{
$offset += 1;
}
if(!strpos($arr[$key+$offset],"/",1) > 0)
{
$offset += 1;
}
$this->filePath = substr($arr[$key+$offset],0,strrpos($arr[$key+$offset],"/")+1);
$this->statFile = str_replace($this->filePath,'',$arr[$key+$offset]);
$this->torrentOwner = $arr[$key+$offset+1];
}
if ($value == '--display_interval')
{
$startArgs = true;
}
if ($startArgs)
{
if (!empty($value))
{
if (strpos($value,"-",1) > 0)
{
if(array_key_exists($key+1,$arr))
{
if(strpos($value,"priority") > 0)
{
$this->args .= "\n file ".$value." set";
}
else
{
$this->args .= $value.":".$arr[$key+1].",";
}
}
else
{
$this->args .= "";
}
}
}
}
if ($value == '--responsefile')
{
$this->torrentFile = str_replace($this->filePath,'',$arr[$key+1]);
}
}
$this->args = str_replace("--","",$this->args);
$this->args = substr($this->args,0,strlen($this->args));
}
}
 
//----------------------------------------------------------------
// Private Function to put the variables into a string for writing to file
function BuildAdminOutput()
{
$output = "<tr>";
$output .= "<td><div class=\"tiny\">";
$output .= $this->torrentOwner;
$output .= "</div></td>";
$output .= "<td><div align=center><div class=\"tiny\" align=\"left\">";
$output .= str_replace(array(".stat"),"",$this->statFile);
$output .= "<br>".$this->args."</div></td>";
$output .= "<td><a href=\"index.php?alias_file=".$this->statFile;
$output .= "&kill=".$this->processId;
$output .= "&kill_torrent=".urlencode($this->torrentFile);
$output .= "&return=admin\">";
$output .= "<img src=\"images/kill.gif\" width=16 height=16 title=\""._FORCESTOP."\" border=0></a></td>";
$output .= "</tr>";
$output .= "\n";
 
return $output;
 
}
}
 
?>
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/Entries
0,0 → 1,24
/.cvsignore/1.1/Tue Feb 24 17:22:05 2004//
/Choker.py/1.14/Wed Jan 5 23:22:41 2005//
/DownloaderFeedback.py/1.13/Mon Dec 13 04:26:32 2004//
/Filter.py/1.1/Wed Dec 22 05:34:31 2004//
/HTTPDownloader.py/1.16/Wed Jan 26 23:17:04 2005//
/NatCheck.py/1.2/Sun Mar 28 16:35:29 2004//
/Statistics.py/1.21/Tue Apr 26 17:56:25 2005//
/Storage.py/1.25/Mon Dec 13 01:35:02 2004//
/StreamCheck.py/1.1/Sat May 15 18:15:02 2004//
/T2T.py/1.5/Wed Jan 26 23:17:04 2005//
/Uploader.py/1.10/Thu Apr 14 17:59:27 2005//
/__init__.py/1.4/Tue Feb 24 21:29:22 2004//
/btformats.py/1.3/Tue May 25 19:00:58 2004//
/fakeopen.py/1.1/Tue Feb 24 17:22:05 2004//
/makemetafile.py/1.6/Tue Jan 4 04:49:28 2005//
/Connecter.py/1.21/Fri Mar 3 04:08:36 2006//
/Encrypter.py/1.34/Fri Mar 3 04:08:37 2006//
/PiecePicker.py/1.27/Fri Mar 3 04:08:37 2006//
/Downloader.py/1.45/Sat Mar 4 20:28:22 2006//
/FileSelector.py/1.24/Sat Mar 4 20:28:22 2006//
/Rerequester.py/1.24/Sat Mar 4 20:28:22 2006//
/StorageWrapper.py/1.56/Sat Mar 4 20:28:22 2006//
/track.py/1.60/Sat Mar 4 20:28:23 2006//
D
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/Entries.Extra
0,0 → 1,23
/.cvsignore////*///
/Choker.py////*///
/DownloaderFeedback.py////*///
/Filter.py////*///
/HTTPDownloader.py////*///
/NatCheck.py////*///
/Statistics.py////*///
/Storage.py////*///
/StreamCheck.py////*///
/T2T.py////*///
/Uploader.py////*///
/__init__.py////*///
/btformats.py////*///
/fakeopen.py////*///
/makemetafile.py////*///
/Connecter.py////*///
/Encrypter.py////*///
/PiecePicker.py////*///
/Downloader.py////*///
/FileSelector.py////*///
/Rerequester.py////*///
/StorageWrapper.py////*///
/track.py////*///
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/Entries.Extra.Old
0,0 → 1,23
/.cvsignore////*///
/Choker.py////*///
/DownloaderFeedback.py////*///
/Filter.py////*///
/HTTPDownloader.py////*///
/NatCheck.py////*///
/Statistics.py////*///
/Storage.py////*///
/StorageWrapper.py////*///
/StreamCheck.py////*///
/T2T.py////*///
/Uploader.py////*///
/__init__.py////*///
/btformats.py////*///
/fakeopen.py////*///
/makemetafile.py////*///
/Connecter.py////*///
/Downloader.py////*///
/Encrypter.py////*///
/FileSelector.py////*///
/PiecePicker.py////*///
/Rerequester.py////*///
/track.py////*///
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/Entries.Old
0,0 → 1,24
/.cvsignore/1.1/Tue Feb 24 17:22:05 2004//
/Choker.py/1.14/Wed Jan 5 23:22:41 2005//
/DownloaderFeedback.py/1.13/Mon Dec 13 04:26:32 2004//
/Filter.py/1.1/Wed Dec 22 05:34:31 2004//
/HTTPDownloader.py/1.16/Wed Jan 26 23:17:04 2005//
/NatCheck.py/1.2/Sun Mar 28 16:35:29 2004//
/Statistics.py/1.21/Tue Apr 26 17:56:25 2005//
/Storage.py/1.25/Mon Dec 13 01:35:02 2004//
/StorageWrapper.py/1.55/Thu Apr 14 17:59:27 2005//
/StreamCheck.py/1.1/Sat May 15 18:15:02 2004//
/T2T.py/1.5/Wed Jan 26 23:17:04 2005//
/Uploader.py/1.10/Thu Apr 14 17:59:27 2005//
/__init__.py/1.4/Tue Feb 24 21:29:22 2004//
/btformats.py/1.3/Tue May 25 19:00:58 2004//
/fakeopen.py/1.1/Tue Feb 24 17:22:05 2004//
/makemetafile.py/1.6/Tue Jan 4 04:49:28 2005//
/Connecter.py/1.21/Fri Mar 3 04:08:36 2006//
/Downloader.py/1.44/Fri Mar 3 04:08:36 2006//
/Encrypter.py/1.34/Fri Mar 3 04:08:37 2006//
/FileSelector.py/1.23/Fri Mar 3 04:08:37 2006//
/PiecePicker.py/1.27/Fri Mar 3 04:08:37 2006//
/Rerequester.py/1.23/Fri Mar 3 04:08:37 2006//
/track.py/1.59/Fri Mar 3 04:08:37 2006//
D
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/Repository
0,0 → 1,0
bittornado/BitTornado/BT1
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/Root
0,0 → 1,0
:ext:theshadow@cvs.degreez.net:/home/cvs/bittorrent
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/Template
--- kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/index.html (nonexistent)
+++ kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/CVS/index.html (revision 36)
@@ -0,0 +1 @@
+<html></html>
\ No newline at end of file
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Choker.py
0,0 → 1,128
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from random import randrange, shuffle
from BitTornado.clock import clock
try:
True
except:
True = 1
False = 0
 
class Choker:
def __init__(self, config, schedule, picker, done = lambda: False):
self.config = config
self.round_robin_period = config['round_robin_period']
self.schedule = schedule
self.picker = picker
self.connections = []
self.last_preferred = 0
self.last_round_robin = clock()
self.done = done
self.super_seed = False
self.paused = False
schedule(self._round_robin, 5)
 
def set_round_robin_period(self, x):
self.round_robin_period = x
 
def _round_robin(self):
self.schedule(self._round_robin, 5)
if self.super_seed:
cons = range(len(self.connections))
to_close = []
count = self.config['min_uploads']-self.last_preferred
if count > 0: # optimization
shuffle(cons)
for c in cons:
i = self.picker.next_have(self.connections[c], count > 0)
if i is None:
continue
if i < 0:
to_close.append(self.connections[c])
continue
self.connections[c].send_have(i)
count -= 1
for c in to_close:
c.close()
if self.last_round_robin + self.round_robin_period < clock():
self.last_round_robin = clock()
for i in xrange(1, len(self.connections)):
c = self.connections[i]
u = c.get_upload()
if u.is_choked() and u.is_interested():
self.connections = self.connections[i:] + self.connections[:i]
break
self._rechoke()
 
def _rechoke(self):
preferred = []
maxuploads = self.config['max_uploads']
if self.paused:
for c in self.connections:
c.get_upload().choke()
return
if maxuploads > 1:
for c in self.connections:
u = c.get_upload()
if not u.is_interested():
continue
if self.done():
r = u.get_rate()
else:
d = c.get_download()
r = d.get_rate()
if r < 1000 or d.is_snubbed():
continue
preferred.append((-r, c))
self.last_preferred = len(preferred)
preferred.sort()
del preferred[maxuploads-1:]
preferred = [x[1] for x in preferred]
count = len(preferred)
hit = False
to_unchoke = []
for c in self.connections:
u = c.get_upload()
if c in preferred:
to_unchoke.append(u)
else:
if count < maxuploads or not hit:
to_unchoke.append(u)
if u.is_interested():
count += 1
hit = True
else:
u.choke()
for u in to_unchoke:
u.unchoke()
 
def connection_made(self, connection, p = None):
if p is None:
p = randrange(-2, len(self.connections) + 1)
self.connections.insert(max(p, 0), connection)
self._rechoke()
 
def connection_lost(self, connection):
self.connections.remove(connection)
self.picker.lost_peer(connection)
if connection.get_upload().is_interested() and not connection.get_upload().is_choked():
self._rechoke()
 
def interested(self, connection):
if not connection.get_upload().is_choked():
self._rechoke()
 
def not_interested(self, connection):
if not connection.get_upload().is_choked():
self._rechoke()
 
def set_super_seed(self):
while self.connections: # close all connections
self.connections[0].close()
self.picker.set_superseed()
self.super_seed = True
 
def pause(self, flag):
self.paused = flag
self._rechoke()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Connecter.py
0,0 → 1,288
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from BitTornado.bitfield import Bitfield
from BitTornado.clock import clock
from binascii import b2a_hex
 
try:
True
except:
True = 1
False = 0
 
DEBUG = False
 
def toint(s):
return long(b2a_hex(s), 16)
 
def tobinary(i):
return (chr(i >> 24) + chr((i >> 16) & 0xFF) +
chr((i >> 8) & 0xFF) + chr(i & 0xFF))
 
CHOKE = chr(0)
UNCHOKE = chr(1)
INTERESTED = chr(2)
NOT_INTERESTED = chr(3)
# index
HAVE = chr(4)
# index, bitfield
BITFIELD = chr(5)
# index, begin, length
REQUEST = chr(6)
# index, begin, piece
PIECE = chr(7)
# index, begin, piece
CANCEL = chr(8)
 
class Connection:
def __init__(self, connection, connecter):
self.connection = connection
self.connecter = connecter
self.got_anything = False
self.next_upload = None
self.outqueue = []
self.partial_message = None
self.download = None
self.send_choke_queued = False
self.just_unchoked = None
 
def get_ip(self, real=False):
return self.connection.get_ip(real)
 
def get_id(self):
return self.connection.get_id()
 
def get_readable_id(self):
return self.connection.get_readable_id()
 
def close(self):
if DEBUG:
print 'connection closed'
self.connection.close()
 
def is_locally_initiated(self):
return self.connection.is_locally_initiated()
 
def send_interested(self):
self._send_message(INTERESTED)
 
def send_not_interested(self):
self._send_message(NOT_INTERESTED)
 
def send_choke(self):
if self.partial_message:
self.send_choke_queued = True
else:
self._send_message(CHOKE)
self.upload.choke_sent()
self.just_unchoked = 0
 
def send_unchoke(self):
if self.send_choke_queued:
self.send_choke_queued = False
if DEBUG:
print 'CHOKE SUPPRESSED'
else:
self._send_message(UNCHOKE)
if ( self.partial_message or self.just_unchoked is None
or not self.upload.interested or self.download.active_requests ):
self.just_unchoked = 0
else:
self.just_unchoked = clock()
 
def send_request(self, index, begin, length):
self._send_message(REQUEST + tobinary(index) +
tobinary(begin) + tobinary(length))
if DEBUG:
print 'sent request: '+str(index)+': '+str(begin)+'-'+str(begin+length)
 
def send_cancel(self, index, begin, length):
self._send_message(CANCEL + tobinary(index) +
tobinary(begin) + tobinary(length))
if DEBUG:
print 'sent cancel: '+str(index)+': '+str(begin)+'-'+str(begin+length)
 
def send_bitfield(self, bitfield):
self._send_message(BITFIELD + bitfield)
 
def send_have(self, index):
self._send_message(HAVE + tobinary(index))
 
def send_keepalive(self):
self._send_message('')
 
def _send_message(self, s):
s = tobinary(len(s))+s
if self.partial_message:
self.outqueue.append(s)
else:
self.connection.send_message_raw(s)
 
def send_partial(self, bytes):
if self.connection.closed:
return 0
if self.partial_message is None:
s = self.upload.get_upload_chunk()
if s is None:
return 0
index, begin, piece = s
self.partial_message = ''.join((
tobinary(len(piece) + 9), PIECE,
tobinary(index), tobinary(begin), piece.tostring() ))
if DEBUG:
print 'sending chunk: '+str(index)+': '+str(begin)+'-'+str(begin+len(piece))
 
if bytes < len(self.partial_message):
self.connection.send_message_raw(self.partial_message[:bytes])
self.partial_message = self.partial_message[bytes:]
return bytes
 
q = [self.partial_message]
self.partial_message = None
if self.send_choke_queued:
self.send_choke_queued = False
self.outqueue.append(tobinary(1)+CHOKE)
self.upload.choke_sent()
self.just_unchoked = 0
q.extend(self.outqueue)
self.outqueue = []
q = ''.join(q)
self.connection.send_message_raw(q)
return len(q)
 
def get_upload(self):
return self.upload
 
def get_download(self):
return self.download
 
def set_download(self, download):
self.download = download
 
def backlogged(self):
return not self.connection.is_flushed()
 
def got_request(self, i, p, l):
self.upload.got_request(i, p, l)
if self.just_unchoked:
self.connecter.ratelimiter.ping(clock() - self.just_unchoked)
self.just_unchoked = 0
 
 
 
class Connecter:
def __init__(self, make_upload, downloader, choker, numpieces,
totalup, config, ratelimiter, sched = None):
self.downloader = downloader
self.make_upload = make_upload
self.choker = choker
self.numpieces = numpieces
self.config = config
self.ratelimiter = ratelimiter
self.rate_capped = False
self.sched = sched
self.totalup = totalup
self.rate_capped = False
self.connections = {}
self.external_connection_made = 0
 
def how_many_connections(self):
return len(self.connections)
 
def connection_made(self, connection):
c = Connection(connection, self)
self.connections[connection] = c
c.upload = self.make_upload(c, self.ratelimiter, self.totalup)
c.download = self.downloader.make_download(c)
self.choker.connection_made(c)
return c
 
def connection_lost(self, connection):
c = self.connections[connection]
del self.connections[connection]
if c.download:
c.download.disconnected()
self.choker.connection_lost(c)
 
def connection_flushed(self, connection):
conn = self.connections[connection]
if conn.next_upload is None and (conn.partial_message is not None
or len(conn.upload.buffer) > 0):
self.ratelimiter.queue(conn)
def got_piece(self, i):
for co in self.connections.values():
co.send_have(i)
 
def got_message(self, connection, message):
c = self.connections[connection]
t = message[0]
if t == BITFIELD and c.got_anything:
connection.close()
return
c.got_anything = True
if (t in [CHOKE, UNCHOKE, INTERESTED, NOT_INTERESTED] and
len(message) != 1):
connection.close()
return
if t == CHOKE:
c.download.got_choke()
elif t == UNCHOKE:
c.download.got_unchoke()
elif t == INTERESTED:
if not c.download.have.complete():
c.upload.got_interested()
elif t == NOT_INTERESTED:
c.upload.got_not_interested()
elif t == HAVE:
if len(message) != 5:
connection.close()
return
i = toint(message[1:])
if i >= self.numpieces:
connection.close()
return
if c.download.got_have(i):
c.upload.got_not_interested()
elif t == BITFIELD:
try:
b = Bitfield(self.numpieces, message[1:])
except ValueError:
connection.close()
return
if c.download.got_have_bitfield(b):
c.upload.got_not_interested()
elif t == REQUEST:
if len(message) != 13:
connection.close()
return
i = toint(message[1:5])
if i >= self.numpieces:
connection.close()
return
c.got_request(i, toint(message[5:9]),
toint(message[9:]))
elif t == CANCEL:
if len(message) != 13:
connection.close()
return
i = toint(message[1:5])
if i >= self.numpieces:
connection.close()
return
c.upload.got_cancel(i, toint(message[5:9]),
toint(message[9:]))
elif t == PIECE:
if len(message) <= 9:
connection.close()
return
i = toint(message[1:5])
if i >= self.numpieces:
connection.close()
return
if c.download.got_piece(i, toint(message[5:9]), message[9:]):
self.got_piece(i)
else:
connection.close()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Downloader.py
0,0 → 1,594
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from BitTornado.CurrentRateMeasure import Measure
from BitTornado.bitfield import Bitfield
from random import shuffle
from BitTornado.clock import clock
try:
True
except:
True = 1
False = 0
 
EXPIRE_TIME = 60 * 60
 
class PerIPStats:
def __init__(self, ip):
self.numgood = 0
self.bad = {}
self.numconnections = 0
self.lastdownload = None
self.peerid = None
 
class BadDataGuard:
def __init__(self, download):
self.download = download
self.ip = download.ip
self.downloader = download.downloader
self.stats = self.downloader.perip[self.ip]
self.lastindex = None
 
def failed(self, index, bump = False):
self.stats.bad.setdefault(index, 0)
self.downloader.gotbaddata[self.ip] = 1
self.stats.bad[index] += 1
if len(self.stats.bad) > 1:
if self.download is not None:
self.downloader.try_kick(self.download)
elif self.stats.numconnections == 1 and self.stats.lastdownload is not None:
self.downloader.try_kick(self.stats.lastdownload)
if len(self.stats.bad) >= 3 and len(self.stats.bad) > int(self.stats.numgood/30):
self.downloader.try_ban(self.ip)
elif bump:
self.downloader.picker.bump(index)
 
def good(self, index):
# lastindex is a hack to only increase numgood by one for each good
# piece, however many chunks come from the connection(s) from this IP
if index != self.lastindex:
self.stats.numgood += 1
self.lastindex = index
 
class SingleDownload:
def __init__(self, downloader, connection):
self.downloader = downloader
self.connection = connection
self.choked = True
self.interested = False
self.active_requests = []
self.measure = Measure(downloader.max_rate_period)
self.peermeasure = Measure(downloader.max_rate_period)
self.have = Bitfield(downloader.numpieces)
self.last = -1000
self.last2 = -1000
self.example_interest = None
self.backlog = 2
self.ip = connection.get_ip()
self.guard = BadDataGuard(self)
 
def _backlog(self, just_unchoked):
self.backlog = min(
2+int(4*self.measure.get_rate()/self.downloader.chunksize),
(2*just_unchoked)+self.downloader.queue_limit() )
if self.backlog > 50:
self.backlog = max(50, self.backlog * 0.075)
return self.backlog
def disconnected(self):
self.downloader.lost_peer(self)
if self.have.complete():
self.downloader.picker.lost_seed()
else:
for i in xrange(len(self.have)):
if self.have[i]:
self.downloader.picker.lost_have(i)
if self.have.complete() and self.downloader.storage.is_endgame():
self.downloader.add_disconnected_seed(self.connection.get_readable_id())
self._letgo()
self.guard.download = None
 
def _letgo(self):
if self.downloader.queued_out.has_key(self):
del self.downloader.queued_out[self]
if not self.active_requests:
return
if self.downloader.endgamemode:
self.active_requests = []
return
lost = {}
for index, begin, length in self.active_requests:
self.downloader.storage.request_lost(index, begin, length)
lost[index] = 1
lost = lost.keys()
self.active_requests = []
if self.downloader.paused:
return
ds = [d for d in self.downloader.downloads if not d.choked]
shuffle(ds)
for d in ds:
d._request_more()
for d in self.downloader.downloads:
if d.choked and not d.interested:
for l in lost:
if d.have[l] and self.downloader.storage.do_I_have_requests(l):
d.send_interested()
break
 
def got_choke(self):
if not self.choked:
self.choked = True
self._letgo()
 
def got_unchoke(self):
if self.choked:
self.choked = False
if self.interested:
self._request_more(new_unchoke = True)
self.last2 = clock()
 
def is_choked(self):
return self.choked
 
def is_interested(self):
return self.interested
 
def send_interested(self):
if not self.interested:
self.interested = True
self.connection.send_interested()
if not self.choked:
self.last2 = clock()
 
def send_not_interested(self):
if self.interested:
self.interested = False
self.connection.send_not_interested()
 
def got_piece(self, index, begin, piece):
length = len(piece)
try:
self.active_requests.remove((index, begin, length))
except ValueError:
self.downloader.discarded += length
return False
if self.downloader.endgamemode:
self.downloader.all_requests.remove((index, begin, length))
self.last = clock()
self.last2 = clock()
self.measure.update_rate(length)
self.downloader.measurefunc(length)
if not self.downloader.storage.piece_came_in(index, begin, piece, self.guard):
self.downloader.piece_flunked(index)
return False
if self.downloader.storage.do_I_have(index):
self.downloader.picker.complete(index)
if self.downloader.endgamemode:
for d in self.downloader.downloads:
if d is not self:
if d.interested:
if d.choked:
assert not d.active_requests
d.fix_download_endgame()
else:
try:
d.active_requests.remove((index, begin, length))
except ValueError:
continue
d.connection.send_cancel(index, begin, length)
d.fix_download_endgame()
else:
assert not d.active_requests
self._request_more()
self.downloader.check_complete(index)
return self.downloader.storage.do_I_have(index)
 
def _request_more(self, new_unchoke = False):
assert not self.choked
if self.downloader.endgamemode:
self.fix_download_endgame(new_unchoke)
return
if self.downloader.paused:
return
if len(self.active_requests) >= self._backlog(new_unchoke):
if not (self.active_requests or self.backlog):
self.downloader.queued_out[self] = 1
return
lost_interests = []
while len(self.active_requests) < self.backlog:
interest = self.downloader.picker.next(self.have,
self.downloader.storage.do_I_have_requests,
self.downloader.too_many_partials())
if interest is None:
break
self.example_interest = interest
self.send_interested()
loop = True
while len(self.active_requests) < self.backlog and loop:
begin, length = self.downloader.storage.new_request(interest)
self.downloader.picker.requested(interest)
self.active_requests.append((interest, begin, length))
self.connection.send_request(interest, begin, length)
self.downloader.chunk_requested(length)
if not self.downloader.storage.do_I_have_requests(interest):
loop = False
lost_interests.append(interest)
if not self.active_requests:
self.send_not_interested()
if lost_interests:
for d in self.downloader.downloads:
if d.active_requests or not d.interested:
continue
if d.example_interest is not None and self.downloader.storage.do_I_have_requests(d.example_interest):
continue
for lost in lost_interests:
if d.have[lost]:
break
else:
continue
interest = self.downloader.picker.next(d.have,
self.downloader.storage.do_I_have_requests,
self.downloader.too_many_partials())
if interest is None:
d.send_not_interested()
else:
d.example_interest = interest
if self.downloader.storage.is_endgame():
self.downloader.start_endgame()
 
 
def fix_download_endgame(self, new_unchoke = False):
if self.downloader.paused:
return
if len(self.active_requests) >= self._backlog(new_unchoke):
if not (self.active_requests or self.backlog) and not self.choked:
self.downloader.queued_out[self] = 1
return
want = [a for a in self.downloader.all_requests if self.have[a[0]] and a not in self.active_requests]
if not (self.active_requests or want):
self.send_not_interested()
return
if want:
self.send_interested()
if self.choked:
return
shuffle(want)
del want[self.backlog - len(self.active_requests):]
self.active_requests.extend(want)
for piece, begin, length in want:
self.connection.send_request(piece, begin, length)
self.downloader.chunk_requested(length)
 
def got_have(self, index):
if index == self.downloader.numpieces-1:
self.downloader.totalmeasure.update_rate(self.downloader.storage.total_length-(self.downloader.numpieces-1)*self.downloader.storage.piece_length)
self.peermeasure.update_rate(self.downloader.storage.total_length-(self.downloader.numpieces-1)*self.downloader.storage.piece_length)
else:
self.downloader.totalmeasure.update_rate(self.downloader.storage.piece_length)
self.peermeasure.update_rate(self.downloader.storage.piece_length)
if not self.have[index]:
self.have[index] = True
self.downloader.picker.got_have(index)
if self.have.complete():
self.downloader.picker.became_seed()
if self.downloader.storage.am_I_complete():
self.downloader.add_disconnected_seed(self.connection.get_readable_id())
self.connection.close()
elif self.downloader.endgamemode:
self.fix_download_endgame()
elif ( not self.downloader.paused
and not self.downloader.picker.is_blocked(index)
and self.downloader.storage.do_I_have_requests(index) ):
if not self.choked:
self._request_more()
else:
self.send_interested()
return self.have.complete()
 
def _check_interests(self):
if self.interested or self.downloader.paused:
return
for i in xrange(len(self.have)):
if ( self.have[i] and not self.downloader.picker.is_blocked(i)
and ( self.downloader.endgamemode
or self.downloader.storage.do_I_have_requests(i) ) ):
self.send_interested()
return
 
def got_have_bitfield(self, have):
if self.downloader.storage.am_I_complete() and have.complete():
if self.downloader.super_seeding:
self.connection.send_bitfield(have.tostring()) # be nice, show you're a seed too
self.connection.close()
self.downloader.add_disconnected_seed(self.connection.get_readable_id())
return False
self.have = have
if have.complete():
self.downloader.picker.got_seed()
else:
for i in xrange(len(have)):
if have[i]:
self.downloader.picker.got_have(i)
if self.downloader.endgamemode and not self.downloader.paused:
for piece, begin, length in self.downloader.all_requests:
if self.have[piece]:
self.send_interested()
break
else:
self._check_interests()
return have.complete()
 
def get_rate(self):
return self.measure.get_rate()
 
def is_snubbed(self):
if ( self.interested and not self.choked
and clock() - self.last2 > self.downloader.snub_time ):
for index, begin, length in self.active_requests:
self.connection.send_cancel(index, begin, length)
self.got_choke() # treat it just like a choke
return clock() - self.last > self.downloader.snub_time
 
 
class Downloader:
def __init__(self, storage, picker, backlog, max_rate_period,
numpieces, chunksize, measurefunc, snub_time,
kickbans_ok, kickfunc, banfunc):
self.storage = storage
self.picker = picker
self.backlog = backlog
self.max_rate_period = max_rate_period
self.measurefunc = measurefunc
self.totalmeasure = Measure(max_rate_period*storage.piece_length/storage.request_size)
self.numpieces = numpieces
self.chunksize = chunksize
self.snub_time = snub_time
self.kickfunc = kickfunc
self.banfunc = banfunc
self.disconnectedseeds = {}
self.downloads = []
self.perip = {}
self.gotbaddata = {}
self.kicked = {}
self.banned = {}
self.kickbans_ok = kickbans_ok
self.kickbans_halted = False
self.super_seeding = False
self.endgamemode = False
self.endgame_queued_pieces = []
self.all_requests = []
self.discarded = 0L
# self.download_rate = 25000 # 25K/s test rate
self.download_rate = 0
self.bytes_requested = 0
self.last_time = clock()
self.queued_out = {}
self.requeueing = False
self.paused = False
 
def set_download_rate(self, rate):
self.download_rate = rate * 1000
self.bytes_requested = 0
 
def queue_limit(self):
if not self.download_rate:
return 10e10 # that's a big queue!
t = clock()
self.bytes_requested -= (t - self.last_time) * self.download_rate
self.last_time = t
if not self.requeueing and self.queued_out and self.bytes_requested < 0:
self.requeueing = True
q = self.queued_out.keys()
shuffle(q)
self.queued_out = {}
for d in q:
d._request_more()
self.requeueing = False
if -self.bytes_requested > 5*self.download_rate:
self.bytes_requested = -5*self.download_rate
return max(int(-self.bytes_requested/self.chunksize),0)
 
def chunk_requested(self, size):
self.bytes_requested += size
 
external_data_received = chunk_requested
 
def make_download(self, connection):
ip = connection.get_ip()
if self.perip.has_key(ip):
perip = self.perip[ip]
else:
perip = self.perip.setdefault(ip, PerIPStats(ip))
perip.peerid = connection.get_readable_id()
perip.numconnections += 1
d = SingleDownload(self, connection)
perip.lastdownload = d
self.downloads.append(d)
return d
 
def piece_flunked(self, index):
if self.paused:
return
if self.endgamemode:
if self.downloads:
while self.storage.do_I_have_requests(index):
nb, nl = self.storage.new_request(index)
self.all_requests.append((index, nb, nl))
for d in self.downloads:
d.fix_download_endgame()
return
self._reset_endgame()
return
ds = [d for d in self.downloads if not d.choked]
shuffle(ds)
for d in ds:
d._request_more()
ds = [d for d in self.downloads if not d.interested and d.have[index]]
for d in ds:
d.example_interest = index
d.send_interested()
 
def has_downloaders(self):
return len(self.downloads)
 
def lost_peer(self, download):
ip = download.ip
self.perip[ip].numconnections -= 1
if self.perip[ip].lastdownload == download:
self.perip[ip].lastdownload = None
self.downloads.remove(download)
if self.endgamemode and not self.downloads: # all peers gone
self._reset_endgame()
 
def _reset_endgame(self):
self.storage.reset_endgame(self.all_requests)
self.endgamemode = False
self.all_requests = []
self.endgame_queued_pieces = []
 
 
def add_disconnected_seed(self, id):
# if not self.disconnectedseeds.has_key(id):
# self.picker.seed_seen_recently()
self.disconnectedseeds[id]=clock()
 
# def expire_disconnected_seeds(self):
 
def num_disconnected_seeds(self):
# first expire old ones
expired = []
for id,t in self.disconnectedseeds.items():
if clock() - t > EXPIRE_TIME: #Expire old seeds after so long
expired.append(id)
for id in expired:
# self.picker.seed_disappeared()
del self.disconnectedseeds[id]
return len(self.disconnectedseeds)
# if this isn't called by a stats-gathering function
# it should be scheduled to run every minute or two.
 
def _check_kicks_ok(self):
if len(self.gotbaddata) > 10:
self.kickbans_ok = False
self.kickbans_halted = True
return self.kickbans_ok and len(self.downloads) > 2
 
def try_kick(self, download):
if self._check_kicks_ok():
download.guard.download = None
ip = download.ip
id = download.connection.get_readable_id()
self.kicked[ip] = id
self.perip[ip].peerid = id
self.kickfunc(download.connection)
def try_ban(self, ip):
if self._check_kicks_ok():
self.banfunc(ip)
self.banned[ip] = self.perip[ip].peerid
if self.kicked.has_key(ip):
del self.kicked[ip]
 
def set_super_seed(self):
self.super_seeding = True
 
def check_complete(self, index):
if self.endgamemode and not self.all_requests:
self.endgamemode = False
if self.endgame_queued_pieces and not self.endgamemode:
self.requeue_piece_download()
if self.storage.am_I_complete():
assert not self.all_requests
assert not self.endgamemode
for d in [i for i in self.downloads if i.have.complete()]:
d.connection.send_have(index) # be nice, tell the other seed you completed
self.add_disconnected_seed(d.connection.get_readable_id())
d.connection.close()
return True
return False
 
def too_many_partials(self):
return len(self.storage.dirty) > (len(self.downloads)/2)
 
 
def cancel_piece_download(self, pieces):
if self.endgamemode:
if self.endgame_queued_pieces:
for piece in pieces:
try:
self.endgame_queued_pieces.remove(piece)
except:
pass
new_all_requests = []
for index, nb, nl in self.all_requests:
if index in pieces:
self.storage.request_lost(index, nb, nl)
else:
new_all_requests.append((index, nb, nl))
self.all_requests = new_all_requests
 
for d in self.downloads:
hit = False
for index, nb, nl in d.active_requests:
if index in pieces:
hit = True
d.connection.send_cancel(index, nb, nl)
if not self.endgamemode:
self.storage.request_lost(index, nb, nl)
if hit:
d.active_requests = [ r for r in d.active_requests
if r[0] not in pieces ]
d._request_more()
if not self.endgamemode and d.choked:
d._check_interests()
 
def requeue_piece_download(self, pieces = []):
if self.endgame_queued_pieces:
for piece in pieces:
if not piece in self.endgame_queued_pieces:
self.endgame_queued_pieces.append(piece)
pieces = self.endgame_queued_pieces
if self.endgamemode:
if self.all_requests:
self.endgame_queued_pieces = pieces
return
self.endgamemode = False
self.endgame_queued_pieces = None
ds = [d for d in self.downloads]
shuffle(ds)
for d in ds:
if d.choked:
d._check_interests()
else:
d._request_more()
 
def start_endgame(self):
assert not self.endgamemode
self.endgamemode = True
assert not self.all_requests
for d in self.downloads:
if d.active_requests:
assert d.interested and not d.choked
for request in d.active_requests:
assert not request in self.all_requests
self.all_requests.append(request)
for d in self.downloads:
d.fix_download_endgame()
 
def pause(self, flag):
self.paused = flag
if flag:
for d in self.downloads:
for index, begin, length in d.active_requests:
d.connection.send_cancel(index, begin, length)
d._letgo()
d.send_not_interested()
if self.endgamemode:
self._reset_endgame()
else:
shuffle(self.downloads)
for d in self.downloads:
d._check_interests()
if d.interested and not d.choked:
d._request_more()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/DownloaderFeedback.py
0,0 → 1,155
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from cStringIO import StringIO
from urllib import quote
from threading import Event
 
try:
True
except:
True = 1
False = 0
 
class DownloaderFeedback:
def __init__(self, choker, httpdl, add_task, upfunc, downfunc,
ratemeasure, leftfunc, file_length, finflag, sp, statistics,
statusfunc = None, interval = None):
self.choker = choker
self.httpdl = httpdl
self.add_task = add_task
self.upfunc = upfunc
self.downfunc = downfunc
self.ratemeasure = ratemeasure
self.leftfunc = leftfunc
self.file_length = file_length
self.finflag = finflag
self.sp = sp
self.statistics = statistics
self.lastids = []
self.spewdata = None
self.doneprocessing = Event()
self.doneprocessing.set()
if statusfunc:
self.autodisplay(statusfunc, interval)
 
def _rotate(self):
cs = self.choker.connections
for id in self.lastids:
for i in xrange(len(cs)):
if cs[i].get_id() == id:
return cs[i:] + cs[:i]
return cs
 
def spews(self):
l = []
cs = self._rotate()
self.lastids = [c.get_id() for c in cs]
for c in cs:
a = {}
a['id'] = c.get_readable_id()
a['ip'] = c.get_ip()
a['optimistic'] = (c is self.choker.connections[0])
if c.is_locally_initiated():
a['direction'] = 'L'
else:
a['direction'] = 'R'
u = c.get_upload()
a['uprate'] = int(u.measure.get_rate())
a['uinterested'] = u.is_interested()
a['uchoked'] = u.is_choked()
d = c.get_download()
a['downrate'] = int(d.measure.get_rate())
a['dinterested'] = d.is_interested()
a['dchoked'] = d.is_choked()
a['snubbed'] = d.is_snubbed()
a['utotal'] = d.connection.upload.measure.get_total()
a['dtotal'] = d.connection.download.measure.get_total()
if len(d.connection.download.have) > 0:
a['completed'] = float(len(d.connection.download.have)-d.connection.download.have.numfalse)/float(len(d.connection.download.have))
else:
a['completed'] = 1.0
a['speed'] = d.connection.download.peermeasure.get_rate()
 
l.append(a)
 
for dl in self.httpdl.get_downloads():
if dl.goodseed:
a = {}
a['id'] = 'http seed'
a['ip'] = dl.baseurl
a['optimistic'] = False
a['direction'] = 'L'
a['uprate'] = 0
a['uinterested'] = False
a['uchoked'] = False
a['downrate'] = int(dl.measure.get_rate())
a['dinterested'] = True
a['dchoked'] = not dl.active
a['snubbed'] = not dl.active
a['utotal'] = None
a['dtotal'] = dl.measure.get_total()
a['completed'] = 1.0
a['speed'] = None
 
l.append(a)
 
return l
 
 
def gather(self, displayfunc = None):
s = {'stats': self.statistics.update()}
if self.sp.isSet():
s['spew'] = self.spews()
else:
s['spew'] = None
s['up'] = self.upfunc()
if self.finflag.isSet():
s['done'] = self.file_length
return s
s['down'] = self.downfunc()
obtained, desired = self.leftfunc()
s['done'] = obtained
s['wanted'] = desired
if desired > 0:
s['frac'] = float(obtained)/desired
else:
s['frac'] = 1.0
if desired == obtained:
s['time'] = 0
else:
s['time'] = self.ratemeasure.get_time_left(desired-obtained)
return s
 
 
def display(self, displayfunc):
if not self.doneprocessing.isSet():
return
self.doneprocessing.clear()
stats = self.gather()
if self.finflag.isSet():
displayfunc(dpflag = self.doneprocessing,
upRate = stats['up'],
statistics = stats['stats'], spew = stats['spew'])
elif stats['time'] is not None:
displayfunc(dpflag = self.doneprocessing,
fractionDone = stats['frac'], sizeDone = stats['done'],
downRate = stats['down'], upRate = stats['up'],
statistics = stats['stats'], spew = stats['spew'],
timeEst = stats['time'])
else:
displayfunc(dpflag = self.doneprocessing,
fractionDone = stats['frac'], sizeDone = stats['done'],
downRate = stats['down'], upRate = stats['up'],
statistics = stats['stats'], spew = stats['spew'])
 
 
def autodisplay(self, displayfunc, interval):
self.displayfunc = displayfunc
self.interval = interval
self._autodisplay()
 
def _autodisplay(self):
self.add_task(self._autodisplay, self.interval)
self.display(self.displayfunc)
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Encrypter.py
0,0 → 1,333
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from cStringIO import StringIO
from binascii import b2a_hex
from socket import error as socketerror
from urllib import quote
from traceback import print_exc
try:
True
except:
True = 1
False = 0
 
MAX_INCOMPLETE = 8
 
protocol_name = 'BitTorrent protocol'
option_pattern = chr(0)*8
 
def toint(s):
return long(b2a_hex(s), 16)
 
def tobinary(i):
return (chr(i >> 24) + chr((i >> 16) & 0xFF) +
chr((i >> 8) & 0xFF) + chr(i & 0xFF))
 
hexchars = '0123456789ABCDEF'
hexmap = []
for i in xrange(256):
hexmap.append(hexchars[(i&0xF0)/16]+hexchars[i&0x0F])
 
def tohex(s):
r = []
for c in s:
r.append(hexmap[ord(c)])
return ''.join(r)
 
def make_readable(s):
if not s:
return ''
if quote(s).find('%') >= 0:
return tohex(s)
return '"'+s+'"'
 
class IncompleteCounter:
def __init__(self):
self.c = 0
def increment(self):
self.c += 1
def decrement(self):
self.c -= 1
def toomany(self):
return self.c >= MAX_INCOMPLETE
incompletecounter = IncompleteCounter()
 
 
# header, reserved, download id, my id, [length, message]
 
class Connection:
def __init__(self, Encoder, connection, id, ext_handshake=False):
self.Encoder = Encoder
self.connection = connection
self.connecter = Encoder.connecter
self.id = id
self.readable_id = make_readable(id)
self.locally_initiated = (id != None)
self.complete = False
self.keepalive = lambda: None
self.closed = False
self.buffer = StringIO()
if self.locally_initiated:
incompletecounter.increment()
if self.locally_initiated or ext_handshake:
self.connection.write(chr(len(protocol_name)) + protocol_name +
option_pattern + self.Encoder.download_id)
if ext_handshake:
self.Encoder.connecter.external_connection_made += 1
self.connection.write(self.Encoder.my_id)
self.next_len, self.next_func = 20, self.read_peer_id
else:
self.next_len, self.next_func = 1, self.read_header_len
self.Encoder.raw_server.add_task(self._auto_close, 15)
 
def get_ip(self, real=False):
return self.connection.get_ip(real)
 
def get_id(self):
return self.id
 
def get_readable_id(self):
return self.readable_id
 
def is_locally_initiated(self):
return self.locally_initiated
 
def is_flushed(self):
return self.connection.is_flushed()
 
def read_header_len(self, s):
if ord(s) != len(protocol_name):
return None
return len(protocol_name), self.read_header
 
def read_header(self, s):
if s != protocol_name:
return None
return 8, self.read_reserved
 
def read_reserved(self, s):
return 20, self.read_download_id
 
def read_download_id(self, s):
if s != self.Encoder.download_id:
return None
if not self.locally_initiated:
self.Encoder.connecter.external_connection_made += 1
self.connection.write(chr(len(protocol_name)) + protocol_name +
option_pattern + self.Encoder.download_id + self.Encoder.my_id)
return 20, self.read_peer_id
 
def read_peer_id(self, s):
if not self.id:
self.id = s
self.readable_id = make_readable(s)
else:
if s != self.id:
return None
self.complete = self.Encoder.got_id(self)
if not self.complete:
return None
if self.locally_initiated:
self.connection.write(self.Encoder.my_id)
incompletecounter.decrement()
c = self.Encoder.connecter.connection_made(self)
self.keepalive = c.send_keepalive
return 4, self.read_len
 
def read_len(self, s):
l = toint(s)
if l > self.Encoder.max_len:
return None
return l, self.read_message
 
def read_message(self, s):
if s != '':
self.connecter.got_message(self, s)
return 4, self.read_len
 
def read_dead(self, s):
return None
 
def _auto_close(self):
if not self.complete:
self.close()
 
def close(self):
if not self.closed:
self.connection.close()
self.sever()
 
def sever(self):
self.closed = True
del self.Encoder.connections[self.connection]
if self.complete:
self.connecter.connection_lost(self)
elif self.locally_initiated:
incompletecounter.decrement()
 
def send_message_raw(self, message):
if not self.closed:
self.connection.write(message)
 
def data_came_in(self, connection, s):
self.Encoder.measurefunc(len(s))
while True:
if self.closed:
return
i = self.next_len - self.buffer.tell()
if i > len(s):
self.buffer.write(s)
return
self.buffer.write(s[:i])
s = s[i:]
m = self.buffer.getvalue()
self.buffer.reset()
self.buffer.truncate()
try:
x = self.next_func(m)
except:
self.next_len, self.next_func = 1, self.read_dead
raise
if x is None:
self.close()
return
self.next_len, self.next_func = x
 
def connection_flushed(self, connection):
if self.complete:
self.connecter.connection_flushed(self)
 
def connection_lost(self, connection):
if self.Encoder.connections.has_key(connection):
self.sever()
 
 
class Encoder:
def __init__(self, connecter, raw_server, my_id, max_len,
schedulefunc, keepalive_delay, download_id,
measurefunc, config):
self.raw_server = raw_server
self.connecter = connecter
self.my_id = my_id
self.max_len = max_len
self.schedulefunc = schedulefunc
self.keepalive_delay = keepalive_delay
self.download_id = download_id
self.measurefunc = measurefunc
self.config = config
self.connections = {}
self.banned = {}
self.to_connect = []
self.paused = False
if self.config['max_connections'] == 0:
self.max_connections = 2 ** 30
else:
self.max_connections = self.config['max_connections']
schedulefunc(self.send_keepalives, keepalive_delay)
 
def send_keepalives(self):
self.schedulefunc(self.send_keepalives, self.keepalive_delay)
if self.paused:
return
for c in self.connections.values():
c.keepalive()
 
def start_connections(self, list):
if not self.to_connect:
self.raw_server.add_task(self._start_connection_from_queue)
self.to_connect = list
 
def _start_connection_from_queue(self):
if self.connecter.external_connection_made:
max_initiate = self.config['max_initiate']
else:
max_initiate = int(self.config['max_initiate']*1.5)
cons = len(self.connections)
if cons >= self.max_connections or cons >= max_initiate:
delay = 60
elif self.paused or incompletecounter.toomany():
delay = 1
else:
delay = 0
dns, id = self.to_connect.pop(0)
self.start_connection(dns, id)
if self.to_connect:
self.raw_server.add_task(self._start_connection_from_queue, delay)
 
def start_connection(self, dns, id):
if ( self.paused
or len(self.connections) >= self.max_connections
or id == self.my_id
or self.banned.has_key(dns[0]) ):
return True
for v in self.connections.values():
if v is None:
continue
if id and v.id == id:
return True
ip = v.get_ip(True)
if self.config['security'] and ip != 'unknown' and ip == dns[0]:
return True
try:
c = self.raw_server.start_connection(dns)
con = Connection(self, c, id)
self.connections[c] = con
c.set_handler(con)
except socketerror:
return False
return True
 
def _start_connection(self, dns, id):
def foo(self=self, dns=dns, id=id):
self.start_connection(dns, id)
self.schedulefunc(foo, 0)
 
def got_id(self, connection):
if connection.id == self.my_id:
self.connecter.external_connection_made -= 1
return False
ip = connection.get_ip(True)
if self.config['security'] and self.banned.has_key(ip):
return False
for v in self.connections.values():
if connection is not v:
if connection.id == v.id:
return False
if self.config['security'] and ip != 'unknown' and ip == v.get_ip(True):
v.close()
return True
 
def external_connection_made(self, connection):
if self.paused or len(self.connections) >= self.max_connections:
connection.close()
return False
con = Connection(self, connection, None)
self.connections[connection] = con
connection.set_handler(con)
return True
 
def externally_handshaked_connection_made(self, connection, options, already_read):
if self.paused or len(self.connections) >= self.max_connections:
connection.close()
return False
con = Connection(self, connection, None, True)
self.connections[connection] = con
connection.set_handler(con)
if already_read:
con.data_came_in(con, already_read)
return True
 
def close_all(self):
for c in self.connections.values():
c.close()
self.connections = {}
 
def ban(self, ip):
self.banned[ip] = 1
 
def pause(self, flag):
self.paused = flag
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/FileSelector.py
0,0 → 1,245
# Written by John Hoffman
# see LICENSE.txt for license information
 
from random import shuffle
from traceback import print_exc
try:
True
except:
True = 1
False = 0
 
 
class FileSelector:
def __init__(self, files, piece_length, bufferdir,
storage, storagewrapper, sched, failfunc):
self.files = files
self.storage = storage
self.storagewrapper = storagewrapper
self.sched = sched
self.failfunc = failfunc
self.downloader = None
self.picker = None
 
storage.set_bufferdir(bufferdir)
self.numfiles = len(files)
self.priority = [1] * self.numfiles
self.new_priority = None
self.new_partials = None
self.filepieces = []
total = 0L
for file, length in files:
if not length:
self.filepieces.append(())
else:
pieces = range( int(total/piece_length),
int((total+length-1)/piece_length)+1 )
self.filepieces.append(tuple(pieces))
total += length
self.numpieces = int((total+piece_length-1)/piece_length)
self.piece_priority = [1] * self.numpieces
 
 
def init_priority(self, new_priority):
try:
assert len(new_priority) == self.numfiles
for v in new_priority:
assert type(v) in (type(0),type(0L))
assert v >= -1
assert v <= 2
except:
# print_exc()
return False
try:
files_updated = False
for f in xrange(self.numfiles):
if new_priority[f] < 0:
self.storage.disable_file(f)
files_updated = True
if files_updated:
self.storage.reset_file_status()
self.new_priority = new_priority
except (IOError, OSError), e:
self.failfunc("can't open partial file for "
+ self.files[f][0] + ': ' + str(e))
return False
return True
 
'''
d['priority'] = [file #1 priority [,file #2 priority...] ]
a list of download priorities for each file.
Priority may be -1, 0, 1, 2. -1 = download disabled,
0 = highest, 1 = normal, 2 = lowest.
Also see Storage.pickle and StorageWrapper.pickle for additional keys.
'''
def unpickle(self, d):
if d.has_key('priority'):
if not self.init_priority(d['priority']):
return
pieces = self.storage.unpickle(d)
if not pieces: # don't bother, nothing restoreable
return
new_piece_priority = self._get_piece_priority_list(self.new_priority)
self.storagewrapper.reblock([i == -1 for i in new_piece_priority])
self.new_partials = self.storagewrapper.unpickle(d, pieces)
 
 
def tie_in(self, picker, cancelfunc, requestmorefunc, rerequestfunc):
self.picker = picker
self.cancelfunc = cancelfunc
self.requestmorefunc = requestmorefunc
self.rerequestfunc = rerequestfunc
 
if self.new_priority:
self.priority = self.new_priority
self.new_priority = None
self.new_piece_priority = self._set_piece_priority(self.priority)
 
if self.new_partials:
shuffle(self.new_partials)
for p in self.new_partials:
self.picker.requested(p)
self.new_partials = None
 
def _set_files_disabled(self, old_priority, new_priority):
old_disabled = [p == -1 for p in old_priority]
new_disabled = [p == -1 for p in new_priority]
data_to_update = []
for f in xrange(self.numfiles):
if new_disabled[f] != old_disabled[f]:
data_to_update.extend(self.storage.get_piece_update_list(f))
buffer = []
for piece, start, length in data_to_update:
if self.storagewrapper.has_data(piece):
data = self.storagewrapper.read_raw(piece, start, length)
if data is None:
return False
buffer.append((piece, start, data))
 
files_updated = False
try:
for f in xrange(self.numfiles):
if new_disabled[f] and not old_disabled[f]:
self.storage.disable_file(f)
files_updated = True
if old_disabled[f] and not new_disabled[f]:
self.storage.enable_file(f)
files_updated = True
except (IOError, OSError), e:
if new_disabled[f]:
msg = "can't open partial file for "
else:
msg = 'unable to open '
self.failfunc(msg + self.files[f][0] + ': ' + str(e))
return False
if files_updated:
self.storage.reset_file_status()
 
changed_pieces = {}
for piece, start, data in buffer:
if not self.storagewrapper.write_raw(piece, start, data):
return False
data.release()
changed_pieces[piece] = 1
if not self.storagewrapper.doublecheck_data(changed_pieces):
return False
 
return True
 
 
def _get_piece_priority_list(self, file_priority_list):
l = [-1] * self.numpieces
for f in xrange(self.numfiles):
if file_priority_list[f] == -1:
continue
for i in self.filepieces[f]:
if l[i] == -1:
l[i] = file_priority_list[f]
continue
l[i] = min(l[i],file_priority_list[f])
return l
 
def _set_piece_priority(self, new_priority):
was_complete = self.storagewrapper.am_I_complete()
new_piece_priority = self._get_piece_priority_list(new_priority)
pieces = range(self.numpieces)
shuffle(pieces)
new_blocked = []
new_unblocked = []
for piece in pieces:
self.picker.set_priority(piece,new_piece_priority[piece])
o = self.piece_priority[piece] == -1
n = new_piece_priority[piece] == -1
if n and not o:
new_blocked.append(piece)
if o and not n:
new_unblocked.append(piece)
if new_blocked:
self.cancelfunc(new_blocked)
self.storagewrapper.reblock([i == -1 for i in new_piece_priority])
if new_unblocked:
self.requestmorefunc(new_unblocked)
if was_complete and not self.storagewrapper.am_I_complete():
self.rerequestfunc()
 
return new_piece_priority
 
 
def set_priorities_now(self, new_priority = None):
if not new_priority:
new_priority = self.new_priority
self.new_priority = None # potential race condition
if not new_priority:
return
old_priority = self.priority
self.priority = new_priority
if not self._set_files_disabled(old_priority, new_priority):
return
self.piece_priority = self._set_piece_priority(new_priority)
 
def set_priorities(self, new_priority):
self.new_priority = new_priority
self.sched(self.set_priorities_now)
def set_priority(self, f, p):
new_priority = self.get_priorities()
new_priority[f] = p
self.set_priorities(new_priority)
 
def get_priorities(self):
priority = self.new_priority
if not priority:
priority = self.priority # potential race condition
return [i for i in priority]
 
def __setitem__(self, index, val):
self.set_priority(index, val)
 
def __getitem__(self, index):
try:
return self.new_priority[index]
except:
return self.priority[index]
 
 
def finish(self):
for f in xrange(self.numfiles):
if self.priority[f] == -1:
self.storage.delete_file(f)
 
def pickle(self):
d = {'priority': self.priority}
try:
s = self.storage.pickle()
sw = self.storagewrapper.pickle()
for k in s.keys():
d[k] = s[k]
for k in sw.keys():
d[k] = sw[k]
except (IOError, OSError):
pass
return d
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Filter.py
0,0 → 1,12
class Filter:
def __init__(self, callback):
self.callback = callback
 
def check(self, ip, paramslist, headers):
 
def params(key, default = None, l = paramslist):
if l.has_key(key):
return l[key][0]
return default
 
return None
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/HTTPDownloader.py
0,0 → 1,251
# Written by John Hoffman
# see LICENSE.txt for license information
 
from BitTornado.CurrentRateMeasure import Measure
from random import randint
from urlparse import urlparse
from httplib import HTTPConnection
from urllib import quote
from threading import Thread
from BitTornado.__init__ import product_name,version_short
try:
True
except:
True = 1
False = 0
 
EXPIRE_TIME = 60 * 60
 
VERSION = product_name+'/'+version_short
 
class haveComplete:
def complete(self):
return True
def __getitem__(self, x):
return True
haveall = haveComplete()
 
class SingleDownload:
def __init__(self, downloader, url):
self.downloader = downloader
self.baseurl = url
try:
(scheme, self.netloc, path, pars, query, fragment) = urlparse(url)
except:
self.downloader.errorfunc('cannot parse http seed address: '+url)
return
if scheme != 'http':
self.downloader.errorfunc('http seed url not http: '+url)
return
try:
self.connection = HTTPConnection(self.netloc)
except:
self.downloader.errorfunc('cannot connect to http seed: '+url)
return
self.seedurl = path
if pars:
self.seedurl += ';'+pars
self.seedurl += '?'
if query:
self.seedurl += query+'&'
self.seedurl += 'info_hash='+quote(self.downloader.infohash)
 
self.measure = Measure(downloader.max_rate_period)
self.index = None
self.url = ''
self.requests = []
self.request_size = 0
self.endflag = False
self.error = None
self.retry_period = 30
self._retry_period = None
self.errorcount = 0
self.goodseed = False
self.active = False
self.cancelled = False
self.resched(randint(2,10))
 
def resched(self, len = None):
if len is None:
len = self.retry_period
if self.errorcount > 3:
len = len * (self.errorcount - 2)
self.downloader.rawserver.add_task(self.download, len)
 
def _want(self, index):
if self.endflag:
return self.downloader.storage.do_I_have_requests(index)
else:
return self.downloader.storage.is_unstarted(index)
 
def download(self):
self.cancelled = False
if self.downloader.picker.am_I_complete():
self.downloader.downloads.remove(self)
return
self.index = self.downloader.picker.next(haveall, self._want)
if ( self.index is None and not self.endflag
and not self.downloader.peerdownloader.has_downloaders() ):
self.endflag = True
self.index = self.downloader.picker.next(haveall, self._want)
if self.index is None:
self.endflag = True
self.resched()
else:
self.url = ( self.seedurl+'&piece='+str(self.index) )
self._get_requests()
if self.request_size < self.downloader.storage._piecelen(self.index):
self.url += '&ranges='+self._request_ranges()
rq = Thread(target = self._request)
rq.setDaemon(False)
rq.start()
self.active = True
 
def _request(self):
import encodings.ascii
import encodings.punycode
import encodings.idna
self.error = None
self.received_data = None
try:
self.connection.request('GET',self.url, None,
{'User-Agent': VERSION})
r = self.connection.getresponse()
self.connection_status = r.status
self.received_data = r.read()
except Exception, e:
self.error = 'error accessing http seed: '+str(e)
try:
self.connection.close()
except:
pass
try:
self.connection = HTTPConnection(self.netloc)
except:
self.connection = None # will cause an exception and retry next cycle
self.downloader.rawserver.add_task(self.request_finished)
 
def request_finished(self):
self.active = False
if self.error is not None:
if self.goodseed:
self.downloader.errorfunc(self.error)
self.errorcount += 1
if self.received_data:
self.errorcount = 0
if not self._got_data():
self.received_data = None
if not self.received_data:
self._release_requests()
self.downloader.peerdownloader.piece_flunked(self.index)
if self._retry_period:
self.resched(self._retry_period)
self._retry_period = None
return
self.resched()
 
def _got_data(self):
if self.connection_status == 503: # seed is busy
try:
self.retry_period = max(int(self.received_data),5)
except:
pass
return False
if self.connection_status != 200:
self.errorcount += 1
return False
self._retry_period = 1
if len(self.received_data) != self.request_size:
if self.goodseed:
self.downloader.errorfunc('corrupt data from http seed - redownloading')
return False
self.measure.update_rate(len(self.received_data))
self.downloader.measurefunc(len(self.received_data))
if self.cancelled:
return False
if not self._fulfill_requests():
return False
if not self.goodseed:
self.goodseed = True
self.downloader.seedsfound += 1
if self.downloader.storage.do_I_have(self.index):
self.downloader.picker.complete(self.index)
self.downloader.peerdownloader.check_complete(self.index)
self.downloader.gotpiecefunc(self.index)
return True
def _get_requests(self):
self.requests = []
self.request_size = 0L
while self.downloader.storage.do_I_have_requests(self.index):
r = self.downloader.storage.new_request(self.index)
self.requests.append(r)
self.request_size += r[1]
self.requests.sort()
 
def _fulfill_requests(self):
start = 0L
success = True
while self.requests:
begin, length = self.requests.pop(0)
if not self.downloader.storage.piece_came_in(self.index, begin,
self.received_data[start:start+length]):
success = False
break
start += length
return success
 
def _release_requests(self):
for begin, length in self.requests:
self.downloader.storage.request_lost(self.index, begin, length)
self.requests = []
 
def _request_ranges(self):
s = ''
begin, length = self.requests[0]
for begin1, length1 in self.requests[1:]:
if begin + length == begin1:
length += length1
continue
else:
if s:
s += ','
s += str(begin)+'-'+str(begin+length-1)
begin, length = begin1, length1
if s:
s += ','
s += str(begin)+'-'+str(begin+length-1)
return s
class HTTPDownloader:
def __init__(self, storage, picker, rawserver,
finflag, errorfunc, peerdownloader,
max_rate_period, infohash, measurefunc, gotpiecefunc):
self.storage = storage
self.picker = picker
self.rawserver = rawserver
self.finflag = finflag
self.errorfunc = errorfunc
self.peerdownloader = peerdownloader
self.infohash = infohash
self.max_rate_period = max_rate_period
self.gotpiecefunc = gotpiecefunc
self.measurefunc = measurefunc
self.downloads = []
self.seedsfound = 0
 
def make_download(self, url):
self.downloads.append(SingleDownload(self, url))
return self.downloads[-1]
 
def get_downloads(self):
if self.finflag.isSet():
return []
return self.downloads
 
def cancel_piece_download(self, pieces):
for d in self.downloads:
if d.active and d.index in pieces:
d.cancelled = True
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/NatCheck.py
0,0 → 1,95
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from cStringIO import StringIO
from socket import error as socketerror
from traceback import print_exc
try:
True
except:
True = 1
False = 0
 
protocol_name = 'BitTorrent protocol'
 
# header, reserved, download id, my id, [length, message]
 
class NatCheck:
def __init__(self, resultfunc, downloadid, peerid, ip, port, rawserver):
self.resultfunc = resultfunc
self.downloadid = downloadid
self.peerid = peerid
self.ip = ip
self.port = port
self.closed = False
self.buffer = StringIO()
self.next_len = 1
self.next_func = self.read_header_len
try:
self.connection = rawserver.start_connection((ip, port), self)
self.connection.write(chr(len(protocol_name)) + protocol_name +
(chr(0) * 8) + downloadid)
except socketerror:
self.answer(False)
except IOError:
self.answer(False)
 
def answer(self, result):
self.closed = True
try:
self.connection.close()
except AttributeError:
pass
self.resultfunc(result, self.downloadid, self.peerid, self.ip, self.port)
 
def read_header_len(self, s):
if ord(s) != len(protocol_name):
return None
return len(protocol_name), self.read_header
 
def read_header(self, s):
if s != protocol_name:
return None
return 8, self.read_reserved
 
def read_reserved(self, s):
return 20, self.read_download_id
 
def read_download_id(self, s):
if s != self.downloadid:
return None
return 20, self.read_peer_id
 
def read_peer_id(self, s):
if s != self.peerid:
return None
self.answer(True)
return None
 
def data_came_in(self, connection, s):
while True:
if self.closed:
return
i = self.next_len - self.buffer.tell()
if i > len(s):
self.buffer.write(s)
return
self.buffer.write(s[:i])
s = s[i:]
m = self.buffer.getvalue()
self.buffer.reset()
self.buffer.truncate()
x = self.next_func(m)
if x is None:
if not self.closed:
self.answer(False)
return
self.next_len, self.next_func = x
 
def connection_lost(self, connection):
if not self.closed:
self.closed = True
self.resultfunc(False, self.downloadid, self.peerid, self.ip, self.port)
 
def connection_flushed(self, connection):
pass
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/PiecePicker.py
0,0 → 1,319
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from random import randrange, shuffle
from BitTornado.clock import clock
try:
True
except:
True = 1
False = 0
 
class PiecePicker:
def __init__(self, numpieces,
rarest_first_cutoff = 1, rarest_first_priority_cutoff = 3,
priority_step = 20):
self.rarest_first_cutoff = rarest_first_cutoff
self.rarest_first_priority_cutoff = rarest_first_priority_cutoff + priority_step
self.priority_step = priority_step
self.cutoff = rarest_first_priority_cutoff
self.numpieces = numpieces
self.started = []
self.totalcount = 0
self.numhaves = [0] * numpieces
self.priority = [1] * numpieces
self.removed_partials = {}
self.crosscount = [numpieces]
self.crosscount2 = [numpieces]
self.has = [0] * numpieces
self.numgot = 0
self.done = False
self.seed_connections = {}
self.past_ips = {}
self.seed_time = None
self.superseed = False
self.seeds_connected = 0
self._init_interests()
 
def _init_interests(self):
self.interests = [[] for x in xrange(self.priority_step)]
self.level_in_interests = [self.priority_step] * self.numpieces
interests = range(self.numpieces)
shuffle(interests)
self.pos_in_interests = [0] * self.numpieces
for i in xrange(self.numpieces):
self.pos_in_interests[interests[i]] = i
self.interests.append(interests)
 
 
def got_have(self, piece):
self.totalcount+=1
numint = self.numhaves[piece]
self.numhaves[piece] += 1
self.crosscount[numint] -= 1
if numint+1==len(self.crosscount):
self.crosscount.append(0)
self.crosscount[numint+1] += 1
if not self.done:
numintplus = numint+self.has[piece]
self.crosscount2[numintplus] -= 1
if numintplus+1 == len(self.crosscount2):
self.crosscount2.append(0)
self.crosscount2[numintplus+1] += 1
numint = self.level_in_interests[piece]
self.level_in_interests[piece] += 1
if self.superseed:
self.seed_got_haves[piece] += 1
numint = self.level_in_interests[piece]
self.level_in_interests[piece] += 1
elif self.has[piece] or self.priority[piece] == -1:
return
if numint == len(self.interests) - 1:
self.interests.append([])
self._shift_over(piece, self.interests[numint], self.interests[numint + 1])
 
def lost_have(self, piece):
self.totalcount-=1
numint = self.numhaves[piece]
self.numhaves[piece] -= 1
self.crosscount[numint] -= 1
self.crosscount[numint-1] += 1
if not self.done:
numintplus = numint+self.has[piece]
self.crosscount2[numintplus] -= 1
self.crosscount2[numintplus-1] += 1
numint = self.level_in_interests[piece]
self.level_in_interests[piece] -= 1
if self.superseed:
numint = self.level_in_interests[piece]
self.level_in_interests[piece] -= 1
elif self.has[piece] or self.priority[piece] == -1:
return
self._shift_over(piece, self.interests[numint], self.interests[numint - 1])
 
def _shift_over(self, piece, l1, l2):
assert self.superseed or (not self.has[piece] and self.priority[piece] >= 0)
parray = self.pos_in_interests
p = parray[piece]
assert l1[p] == piece
q = l1[-1]
l1[p] = q
parray[q] = p
del l1[-1]
newp = randrange(len(l2)+1)
if newp == len(l2):
parray[piece] = len(l2)
l2.append(piece)
else:
old = l2[newp]
parray[old] = len(l2)
l2.append(old)
l2[newp] = piece
parray[piece] = newp
 
 
def got_seed(self):
self.seeds_connected += 1
self.cutoff = max(self.rarest_first_priority_cutoff-self.seeds_connected,0)
 
def became_seed(self):
self.got_seed()
self.totalcount -= self.numpieces
self.numhaves = [i-1 for i in self.numhaves]
if self.superseed or not self.done:
self.level_in_interests = [i-1 for i in self.level_in_interests]
del self.interests[0]
del self.crosscount[0]
if not self.done:
del self.crosscount2[0]
 
def lost_seed(self):
self.seeds_connected -= 1
self.cutoff = max(self.rarest_first_priority_cutoff-self.seeds_connected,0)
 
 
def requested(self, piece):
if piece not in self.started:
self.started.append(piece)
 
def _remove_from_interests(self, piece, keep_partial = False):
l = self.interests[self.level_in_interests[piece]]
p = self.pos_in_interests[piece]
assert l[p] == piece
q = l[-1]
l[p] = q
self.pos_in_interests[q] = p
del l[-1]
try:
self.started.remove(piece)
if keep_partial:
self.removed_partials[piece] = 1
except ValueError:
pass
 
def complete(self, piece):
assert not self.has[piece]
self.has[piece] = 1
self.numgot += 1
if self.numgot == self.numpieces:
self.done = True
self.crosscount2 = self.crosscount
else:
numhaves = self.numhaves[piece]
self.crosscount2[numhaves] -= 1
if numhaves+1 == len(self.crosscount2):
self.crosscount2.append(0)
self.crosscount2[numhaves+1] += 1
self._remove_from_interests(piece)
 
 
def next(self, haves, wantfunc, complete_first = False):
cutoff = self.numgot < self.rarest_first_cutoff
complete_first = (complete_first or cutoff) and not haves.complete()
best = None
bestnum = 2 ** 30
for i in self.started:
if haves[i] and wantfunc(i):
if self.level_in_interests[i] < bestnum:
best = i
bestnum = self.level_in_interests[i]
if best is not None:
if complete_first or (cutoff and len(self.interests) > self.cutoff):
return best
if haves.complete():
r = [ (0, min(bestnum,len(self.interests))) ]
elif cutoff and len(self.interests) > self.cutoff:
r = [ (self.cutoff, min(bestnum,len(self.interests))),
(0, self.cutoff) ]
else:
r = [ (0, min(bestnum,len(self.interests))) ]
for lo,hi in r:
for i in xrange(lo,hi):
for j in self.interests[i]:
if haves[j] and wantfunc(j):
return j
if best is not None:
return best
return None
 
 
def am_I_complete(self):
return self.done
def bump(self, piece):
l = self.interests[self.level_in_interests[piece]]
pos = self.pos_in_interests[piece]
del l[pos]
l.append(piece)
for i in range(pos,len(l)):
self.pos_in_interests[l[i]] = i
try:
self.started.remove(piece)
except:
pass
 
def set_priority(self, piece, p):
if self.superseed:
return False # don't muck with this if you're a superseed
oldp = self.priority[piece]
if oldp == p:
return False
self.priority[piece] = p
if p == -1:
# when setting priority -1,
# make sure to cancel any downloads for this piece
if not self.has[piece]:
self._remove_from_interests(piece, True)
return True
if oldp == -1:
level = self.numhaves[piece] + (self.priority_step * p)
self.level_in_interests[piece] = level
if self.has[piece]:
return True
while len(self.interests) < level+1:
self.interests.append([])
l2 = self.interests[level]
parray = self.pos_in_interests
newp = randrange(len(l2)+1)
if newp == len(l2):
parray[piece] = len(l2)
l2.append(piece)
else:
old = l2[newp]
parray[old] = len(l2)
l2.append(old)
l2[newp] = piece
parray[piece] = newp
if self.removed_partials.has_key(piece):
del self.removed_partials[piece]
self.started.append(piece)
# now go to downloader and try requesting more
return True
numint = self.level_in_interests[piece]
newint = numint + ((p - oldp) * self.priority_step)
self.level_in_interests[piece] = newint
if self.has[piece]:
return False
while len(self.interests) < newint+1:
self.interests.append([])
self._shift_over(piece, self.interests[numint], self.interests[newint])
return False
 
def is_blocked(self, piece):
return self.priority[piece] < 0
 
 
def set_superseed(self):
assert self.done
self.superseed = True
self.seed_got_haves = [0] * self.numpieces
self._init_interests() # assume everyone is disconnected
 
def next_have(self, connection, looser_upload):
if self.seed_time is None:
self.seed_time = clock()
return None
if clock() < self.seed_time+10: # wait 10 seconds after seeing the first peers
return None # to give time to grab have lists
if not connection.upload.super_seeding:
return None
olddl = self.seed_connections.get(connection)
if olddl is not None:
ip = connection.get_ip()
olddl = self.past_ips.get(ip)
if olddl is not None: # peer reconnected
self.seed_connections[connection] = olddl
if olddl is not None:
if looser_upload:
num = 1 # send a new have even if it hasn't spread that piece elsewhere
else:
num = 2
if self.seed_got_haves[olddl] < num:
return None
if not connection.upload.was_ever_interested: # it never downloaded it?
connection.upload.skipped_count += 1
if connection.upload.skipped_count >= 3: # probably another stealthed seed
return -1 # signal to close it
for tier in self.interests:
for piece in tier:
if not connection.download.have[piece]:
seedint = self.level_in_interests[piece]
self.level_in_interests[piece] += 1 # tweak it up one, so you don't duplicate effort
if seedint == len(self.interests) - 1:
self.interests.append([])
self._shift_over(piece,
self.interests[seedint], self.interests[seedint + 1])
self.seed_got_haves[piece] = 0 # reset this
self.seed_connections[connection] = piece
connection.upload.seed_have_list.append(piece)
return piece
return -1 # something screwy; terminate connection
 
def lost_peer(self, connection):
olddl = self.seed_connections.get(connection)
if olddl is None:
return
del self.seed_connections[connection]
self.past_ips[connection.get_ip()] = olddl
if self.seed_got_haves[olddl] == 1:
self.seed_got_haves[olddl] = 0
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Rerequester.py
0,0 → 1,425
# Written by Bram Cohen
# modified for multitracker operation by John Hoffman
# see LICENSE.txt for license information
 
from BitTornado.zurllib import urlopen, quote
from urlparse import urlparse, urlunparse
from socket import gethostbyname
from btformats import check_peers
from BitTornado.bencode import bdecode
from threading import Thread, Lock
from cStringIO import StringIO
from traceback import print_exc
from socket import error, gethostbyname
from random import shuffle
from sha import sha
from time import time
try:
from os import getpid
except ImportError:
def getpid():
return 1
try:
True
except:
True = 1
False = 0
 
mapbase64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-'
keys = {}
basekeydata = str(getpid()) + repr(time()) + 'tracker'
 
def add_key(tracker):
key = ''
for i in sha(basekeydata+tracker).digest()[-6:]:
key += mapbase64[ord(i) & 0x3F]
keys[tracker] = key
 
def get_key(tracker):
try:
return "&key="+keys[tracker]
except:
add_key(tracker)
return "&key="+keys[tracker]
 
class fakeflag:
def __init__(self, state=False):
self.state = state
def wait(self):
pass
def isSet(self):
return self.state
 
class Rerequester:
def __init__(self, trackerlist, interval, sched, howmany, minpeers,
connect, externalsched, amount_left, up, down,
port, ip, myid, infohash, timeout, errorfunc, excfunc,
maxpeers, doneflag, upratefunc, downratefunc,
unpauseflag = fakeflag(True),
seed_id = '', seededfunc = None, force_rapid_update = False ):
 
self.excfunc = excfunc
newtrackerlist = []
for tier in trackerlist:
if len(tier)>1:
shuffle(tier)
newtrackerlist += [tier]
self.trackerlist = newtrackerlist
self.lastsuccessful = ''
self.rejectedmessage = 'rejected by tracker - '
self.url = ('?info_hash=%s&peer_id=%s&port=%s' %
(quote(infohash), quote(myid), str(port)))
self.ip = ip
self.interval = interval
self.last = None
self.trackerid = None
self.announce_interval = 30 * 60
self.sched = sched
self.howmany = howmany
self.minpeers = minpeers
self.connect = connect
self.externalsched = externalsched
self.amount_left = amount_left
self.up = up
self.down = down
self.timeout = timeout
self.errorfunc = errorfunc
self.maxpeers = maxpeers
self.doneflag = doneflag
self.upratefunc = upratefunc
self.downratefunc = downratefunc
self.unpauseflag = unpauseflag
if seed_id:
self.url += '&seed_id='+quote(seed_id)
self.seededfunc = seededfunc
if seededfunc:
self.url += '&check_seeded=1'
self.force_rapid_update = force_rapid_update
self.last_failed = True
self.never_succeeded = True
self.errorcodes = {}
self.lock = SuccessLock()
self.special = None
self.stopped = False
 
def start(self):
self.sched(self.c, self.interval/2)
self.d(0)
 
def c(self):
if self.stopped:
return
if not self.unpauseflag.isSet() and (
self.howmany() < self.minpeers or self.force_rapid_update ):
self.announce(3, self._c)
else:
self._c()
 
def _c(self):
self.sched(self.c, self.interval)
 
def d(self, event = 3):
if self.stopped:
return
if not self.unpauseflag.isSet():
self._d()
return
self.announce(event, self._d)
 
def _d(self):
if self.never_succeeded:
self.sched(self.d, 60) # retry in 60 seconds
elif self.force_rapid_update:
return
else:
self.sched(self.d, self.announce_interval)
 
 
def hit(self, event = 3):
if not self.unpauseflag.isSet() and (
self.howmany() < self.minpeers or self.force_rapid_update ):
self.announce(event)
 
def announce(self, event = 3, callback = lambda: None, specialurl = None):
 
if specialurl is not None:
s = self.url+'&uploaded=0&downloaded=0&left=1' # don't add to statistics
if self.howmany() >= self.maxpeers:
s += '&numwant=0'
else:
s += '&no_peer_id=1&compact=1'
self.last_failed = True # force true, so will display an error
self.special = specialurl
self.rerequest(s, callback)
return
else:
s = ('%s&uploaded=%s&downloaded=%s&left=%s' %
(self.url, str(self.up()), str(self.down()),
str(self.amount_left())))
if self.last is not None:
s += '&last=' + quote(str(self.last))
if self.trackerid is not None:
s += '&trackerid=' + quote(str(self.trackerid))
if self.howmany() >= self.maxpeers:
s += '&numwant=0'
else:
s += '&no_peer_id=1&compact=1'
if event != 3:
s += '&event=' + ['started', 'completed', 'stopped'][event]
if event == 2:
self.stopped = True
self.rerequest(s, callback)
 
 
def snoop(self, peers, callback = lambda: None): # tracker call support
self.rerequest(self.url
+'&event=stopped&port=0&uploaded=0&downloaded=0&left=1&tracker=1&numwant='
+str(peers), callback)
 
 
def rerequest(self, s, callback):
if not self.lock.isfinished(): # still waiting for prior cycle to complete??
def retry(self = self, s = s, callback = callback):
self.rerequest(s, callback)
self.sched(retry,5) # retry in 5 seconds
return
self.lock.reset()
rq = Thread(target = self._rerequest, args = [s, callback])
rq.setDaemon(False)
rq.start()
 
def _rerequest(self, s, callback):
try:
def fail (self = self, callback = callback):
self._fail(callback)
if self.ip:
try:
s += '&ip=' + gethostbyname(self.ip)
except:
self.errorcodes['troublecode'] = 'unable to resolve: '+self.ip
self.externalsched(fail)
self.errorcodes = {}
if self.special is None:
for t in range(len(self.trackerlist)):
for tr in range(len(self.trackerlist[t])):
tracker = self.trackerlist[t][tr]
if self.rerequest_single(tracker, s, callback):
if not self.last_failed and tr != 0:
del self.trackerlist[t][tr]
self.trackerlist[t] = [tracker] + self.trackerlist[t]
return
else:
tracker = self.special
self.special = None
if self.rerequest_single(tracker, s, callback):
return
# no success from any tracker
self.externalsched(fail)
except:
self.exception(callback)
 
 
def _fail(self, callback):
if ( (self.upratefunc() < 100 and self.downratefunc() < 100)
or not self.amount_left() ):
for f in ['rejected', 'bad_data', 'troublecode']:
if self.errorcodes.has_key(f):
r = self.errorcodes[f]
break
else:
r = 'Problem connecting to tracker - unspecified error'
self.errorfunc(r)
 
self.last_failed = True
self.lock.give_up()
self.externalsched(callback)
 
 
def rerequest_single(self, t, s, callback):
l = self.lock.set()
rq = Thread(target = self._rerequest_single, args = [t, s+get_key(t), l, callback])
rq.setDaemon(False)
rq.start()
self.lock.wait()
if self.lock.success:
self.lastsuccessful = t
self.last_failed = False
self.never_succeeded = False
return True
if not self.last_failed and self.lastsuccessful == t:
# if the last tracker hit was successful, and you've just tried the tracker
# you'd contacted before, don't go any further, just fail silently.
self.last_failed = True
self.externalsched(callback)
self.lock.give_up()
return True
return False # returns true if it wants rerequest() to exit
 
 
def _rerequest_single(self, t, s, l, callback):
try:
closer = [None]
def timedout(self = self, l = l, closer = closer):
if self.lock.trip(l):
self.errorcodes['troublecode'] = 'Problem connecting to tracker - timeout exceeded'
self.lock.unwait(l)
try:
closer[0]()
except:
pass
self.externalsched(timedout, self.timeout)
 
err = None
try:
h = urlopen(t+s)
closer[0] = h.close
data = h.read()
except (IOError, error), e:
err = 'Problem connecting to tracker - ' + str(e)
except:
err = 'Problem connecting to tracker'
try:
h.close()
except:
pass
if err:
if self.lock.trip(l):
self.errorcodes['troublecode'] = err
self.lock.unwait(l)
return
 
if data == '':
if self.lock.trip(l):
self.errorcodes['troublecode'] = 'no data from tracker'
self.lock.unwait(l)
return
try:
r = bdecode(data, sloppy=1)
check_peers(r)
except ValueError, e:
if self.lock.trip(l):
self.errorcodes['bad_data'] = 'bad data from tracker - ' + str(e)
self.lock.unwait(l)
return
if r.has_key('failure reason'):
if self.lock.trip(l):
self.errorcodes['rejected'] = self.rejectedmessage + r['failure reason']
self.lock.unwait(l)
return
if self.lock.trip(l, True): # success!
self.lock.unwait(l)
else:
callback = lambda: None # attempt timed out, don't do a callback
 
# even if the attempt timed out, go ahead and process data
def add(self = self, r = r, callback = callback):
self.postrequest(r, callback)
self.externalsched(add)
except:
self.exception(callback)
 
 
def postrequest(self, r, callback):
if r.has_key('warning message'):
self.errorfunc('warning from tracker - ' + r['warning message'])
self.announce_interval = r.get('interval', self.announce_interval)
self.interval = r.get('min interval', self.interval)
self.trackerid = r.get('tracker id', self.trackerid)
self.last = r.get('last')
# ps = len(r['peers']) + self.howmany()
p = r['peers']
peers = []
if type(p) == type(''):
for x in xrange(0, len(p), 6):
ip = '.'.join([str(ord(i)) for i in p[x:x+4]])
port = (ord(p[x+4]) << 8) | ord(p[x+5])
peers.append(((ip, port), 0))
else:
for x in p:
peers.append(((x['ip'].strip(), x['port']), x.get('peer id',0)))
ps = len(peers) + self.howmany()
if ps < self.maxpeers:
if self.doneflag.isSet():
if r.get('num peers', 1000) - r.get('done peers', 0) > ps * 1.2:
self.last = None
else:
if r.get('num peers', 1000) > ps * 1.2:
self.last = None
if self.seededfunc and r.get('seeded'):
self.seededfunc()
elif peers:
shuffle(peers)
self.connect(peers)
callback()
 
def exception(self, callback):
data = StringIO()
print_exc(file = data)
def r(s = data.getvalue(), callback = callback):
if self.excfunc:
self.excfunc(s)
else:
print s
callback()
self.externalsched(r)
 
 
class SuccessLock:
def __init__(self):
self.lock = Lock()
self.pause = Lock()
self.code = 0L
self.success = False
self.finished = True
 
def reset(self):
self.success = False
self.finished = False
 
def set(self):
self.lock.acquire()
if not self.pause.locked():
self.pause.acquire()
self.first = True
self.code += 1L
self.lock.release()
return self.code
 
def trip(self, code, s = False):
self.lock.acquire()
try:
if code == self.code and not self.finished:
r = self.first
self.first = False
if s:
self.finished = True
self.success = True
return r
finally:
self.lock.release()
 
def give_up(self):
self.lock.acquire()
self.success = False
self.finished = True
self.lock.release()
 
def wait(self):
self.pause.acquire()
 
def unwait(self, code):
if code == self.code and self.pause.locked():
self.pause.release()
 
def isfinished(self):
self.lock.acquire()
x = self.finished
self.lock.release()
return x
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Statistics.py
0,0 → 1,177
# Written by Edward Keyes
# see LICENSE.txt for license information
 
from threading import Event
try:
True
except:
True = 1
False = 0
 
class Statistics_Response:
pass # empty class
 
 
class Statistics:
def __init__(self, upmeasure, downmeasure, connecter, httpdl,
ratelimiter, rerequest_lastfailed, fdatflag):
self.upmeasure = upmeasure
self.downmeasure = downmeasure
self.connecter = connecter
self.httpdl = httpdl
self.ratelimiter = ratelimiter
self.downloader = connecter.downloader
self.picker = connecter.downloader.picker
self.storage = connecter.downloader.storage
self.torrentmeasure = connecter.downloader.totalmeasure
self.rerequest_lastfailed = rerequest_lastfailed
self.fdatflag = fdatflag
self.fdatactive = False
self.piecescomplete = None
self.placesopen = None
self.storage_totalpieces = len(self.storage.hashes)
 
 
def set_dirstats(self, files, piece_length):
self.piecescomplete = 0
self.placesopen = 0
self.filelistupdated = Event()
self.filelistupdated.set()
frange = xrange(len(files))
self.filepieces = [[] for x in frange]
self.filepieces2 = [[] for x in frange]
self.fileamtdone = [0.0 for x in frange]
self.filecomplete = [False for x in frange]
self.fileinplace = [False for x in frange]
start = 0L
for i in frange:
l = files[i][1]
if l == 0:
self.fileamtdone[i] = 1.0
self.filecomplete[i] = True
self.fileinplace[i] = True
else:
fp = self.filepieces[i]
fp2 = self.filepieces2[i]
for piece in range(int(start/piece_length),
int((start+l-1)/piece_length)+1):
fp.append(piece)
fp2.append(piece)
start += l
 
 
def update(self):
s = Statistics_Response()
s.upTotal = self.upmeasure.get_total()
s.downTotal = self.downmeasure.get_total()
s.last_failed = self.rerequest_lastfailed()
s.external_connection_made = self.connecter.external_connection_made
if s.downTotal > 0:
s.shareRating = float(s.upTotal)/s.downTotal
elif s.upTotal == 0:
s.shareRating = 0.0
else:
s.shareRating = -1.0
s.torrentRate = self.torrentmeasure.get_rate()
s.torrentTotal = self.torrentmeasure.get_total()
s.numSeeds = self.picker.seeds_connected
s.numOldSeeds = self.downloader.num_disconnected_seeds()
s.numPeers = len(self.downloader.downloads)-s.numSeeds
s.numCopies = 0.0
for i in self.picker.crosscount:
if i==0:
s.numCopies+=1
else:
s.numCopies+=1-float(i)/self.picker.numpieces
break
if self.picker.done:
s.numCopies2 = s.numCopies + 1
else:
s.numCopies2 = 0.0
for i in self.picker.crosscount2:
if i==0:
s.numCopies2+=1
else:
s.numCopies2+=1-float(i)/self.picker.numpieces
break
s.discarded = self.downloader.discarded
s.numSeeds += self.httpdl.seedsfound
s.numOldSeeds += self.httpdl.seedsfound
if s.numPeers == 0 or self.picker.numpieces == 0:
s.percentDone = 0.0
else:
s.percentDone = 100.0*(float(self.picker.totalcount)/self.picker.numpieces)/s.numPeers
 
s.backgroundallocating = self.storage.bgalloc_active
s.storage_totalpieces = len(self.storage.hashes)
s.storage_active = len(self.storage.stat_active)
s.storage_new = len(self.storage.stat_new)
s.storage_dirty = len(self.storage.dirty)
numdownloaded = self.storage.stat_numdownloaded
s.storage_justdownloaded = numdownloaded
s.storage_numcomplete = self.storage.stat_numfound + numdownloaded
s.storage_numflunked = self.storage.stat_numflunked
s.storage_isendgame = self.downloader.endgamemode
 
s.peers_kicked = self.downloader.kicked.items()
s.peers_banned = self.downloader.banned.items()
 
try:
s.upRate = int(self.ratelimiter.upload_rate/1000)
assert s.upRate < 5000
except:
s.upRate = 0
s.upSlots = self.ratelimiter.slots
 
if self.piecescomplete is None: # not a multi-file torrent
return s
if self.fdatflag.isSet():
if not self.fdatactive:
self.fdatactive = True
else:
self.fdatactive = False
 
if self.piecescomplete != self.picker.numgot:
for i in xrange(len(self.filecomplete)):
if self.filecomplete[i]:
continue
oldlist = self.filepieces[i]
newlist = [ piece
for piece in oldlist
if not self.storage.have[piece] ]
if len(newlist) != len(oldlist):
self.filepieces[i] = newlist
self.fileamtdone[i] = (
(len(self.filepieces2[i])-len(newlist))
/float(len(self.filepieces2[i])) )
if not newlist:
self.filecomplete[i] = True
self.filelistupdated.set()
 
self.piecescomplete = self.picker.numgot
 
if ( self.filelistupdated.isSet()
or self.placesopen != len(self.storage.places) ):
for i in xrange(len(self.filecomplete)):
if not self.filecomplete[i] or self.fileinplace[i]:
continue
while self.filepieces2[i]:
piece = self.filepieces2[i][-1]
if self.storage.places[piece] != piece:
break
del self.filepieces2[i][-1]
if not self.filepieces2[i]:
self.fileinplace[i] = True
self.storage.set_file_readonly(i)
self.filelistupdated.set()
 
self.placesopen = len(self.storage.places)
 
s.fileamtdone = self.fileamtdone
s.filecomplete = self.filecomplete
s.fileinplace = self.fileinplace
s.filelistupdated = self.filelistupdated
 
return s
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Storage.py
0,0 → 1,584
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from BitTornado.piecebuffer import BufferPool
from threading import Lock
from time import time, strftime, localtime
import os
from os.path import exists, getsize, getmtime, basename
from traceback import print_exc
try:
from os import fsync
except ImportError:
fsync = lambda x: None
from bisect import bisect
try:
True
except:
True = 1
False = 0
 
DEBUG = False
 
MAXREADSIZE = 32768
MAXLOCKSIZE = 1000000000L
MAXLOCKRANGE = 3999999999L # only lock first 4 gig of file
 
_pool = BufferPool()
PieceBuffer = _pool.new
 
def dummy_status(fractionDone = None, activity = None):
pass
 
class Storage:
def __init__(self, files, piece_length, doneflag, config,
disabled_files = None):
# can raise IOError and ValueError
self.files = files
self.piece_length = piece_length
self.doneflag = doneflag
self.disabled = [False] * len(files)
self.file_ranges = []
self.disabled_ranges = []
self.working_ranges = []
numfiles = 0
total = 0l
so_far = 0l
self.handles = {}
self.whandles = {}
self.tops = {}
self.sizes = {}
self.mtimes = {}
if config.get('lock_files', True):
self.lock_file, self.unlock_file = self._lock_file, self._unlock_file
else:
self.lock_file, self.unlock_file = lambda x1,x2: None, lambda x1,x2: None
self.lock_while_reading = config.get('lock_while_reading', False)
self.lock = Lock()
 
if not disabled_files:
disabled_files = [False] * len(files)
 
for i in xrange(len(files)):
file, length = files[i]
if doneflag.isSet(): # bail out if doneflag is set
return
self.disabled_ranges.append(None)
if length == 0:
self.file_ranges.append(None)
self.working_ranges.append([])
else:
range = (total, total + length, 0, file)
self.file_ranges.append(range)
self.working_ranges.append([range])
numfiles += 1
total += length
if disabled_files[i]:
l = 0
else:
if exists(file):
l = getsize(file)
if l > length:
h = open(file, 'rb+')
h.truncate(length)
h.flush()
h.close()
l = length
else:
l = 0
h = open(file, 'wb+')
h.flush()
h.close()
self.mtimes[file] = getmtime(file)
self.tops[file] = l
self.sizes[file] = length
so_far += l
 
self.total_length = total
self._reset_ranges()
 
self.max_files_open = config['max_files_open']
if self.max_files_open > 0 and numfiles > self.max_files_open:
self.handlebuffer = []
else:
self.handlebuffer = None
 
 
if os.name == 'nt':
def _lock_file(self, name, f):
import msvcrt
for p in range(0, min(self.sizes[name],MAXLOCKRANGE), MAXLOCKSIZE):
f.seek(p)
msvcrt.locking(f.fileno(), msvcrt.LK_LOCK,
min(MAXLOCKSIZE,self.sizes[name]-p))
 
def _unlock_file(self, name, f):
import msvcrt
for p in range(0, min(self.sizes[name],MAXLOCKRANGE), MAXLOCKSIZE):
f.seek(p)
msvcrt.locking(f.fileno(), msvcrt.LK_UNLCK,
min(MAXLOCKSIZE,self.sizes[name]-p))
 
elif os.name == 'posix':
def _lock_file(self, name, f):
import fcntl
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
 
def _unlock_file(self, name, f):
import fcntl
fcntl.flock(f.fileno(), fcntl.LOCK_UN)
 
else:
def _lock_file(self, name, f):
pass
def _unlock_file(self, name, f):
pass
 
 
def was_preallocated(self, pos, length):
for file, begin, end in self._intervals(pos, length):
if self.tops.get(file, 0) < end:
return False
return True
 
 
def _sync(self, file):
self._close(file)
if self.handlebuffer:
self.handlebuffer.remove(file)
 
def sync(self):
# may raise IOError or OSError
for file in self.whandles.keys():
self._sync(file)
 
 
def set_readonly(self, f=None):
if f is None:
self.sync()
return
file = self.files[f][0]
if self.whandles.has_key(file):
self._sync(file)
 
def get_total_length(self):
return self.total_length
 
 
def _open(self, file, mode):
if self.mtimes.has_key(file):
try:
if self.handlebuffer is not None:
assert getsize(file) == self.tops[file]
newmtime = getmtime(file)
oldmtime = self.mtimes[file]
assert newmtime <= oldmtime+1
assert newmtime >= oldmtime-1
except:
if DEBUG:
print ( file+' modified: '
+strftime('(%x %X)',localtime(self.mtimes[file]))
+strftime(' != (%x %X) ?',localtime(getmtime(file))) )
raise IOError('modified during download')
try:
return open(file, mode)
except:
if DEBUG:
print_exc()
raise
 
 
def _close(self, file):
f = self.handles[file]
del self.handles[file]
if self.whandles.has_key(file):
del self.whandles[file]
f.flush()
self.unlock_file(file, f)
f.close()
self.tops[file] = getsize(file)
self.mtimes[file] = getmtime(file)
else:
if self.lock_while_reading:
self.unlock_file(file, f)
f.close()
 
 
def _close_file(self, file):
if not self.handles.has_key(file):
return
self._close(file)
if self.handlebuffer:
self.handlebuffer.remove(file)
 
def _get_file_handle(self, file, for_write):
if self.handles.has_key(file):
if for_write and not self.whandles.has_key(file):
self._close(file)
try:
f = self._open(file, 'rb+')
self.handles[file] = f
self.whandles[file] = 1
self.lock_file(file, f)
except (IOError, OSError), e:
if DEBUG:
print_exc()
raise IOError('unable to reopen '+file+': '+str(e))
 
if self.handlebuffer:
if self.handlebuffer[-1] != file:
self.handlebuffer.remove(file)
self.handlebuffer.append(file)
elif self.handlebuffer is not None:
self.handlebuffer.append(file)
else:
try:
if for_write:
f = self._open(file, 'rb+')
self.handles[file] = f
self.whandles[file] = 1
self.lock_file(file, f)
else:
f = self._open(file, 'rb')
self.handles[file] = f
if self.lock_while_reading:
self.lock_file(file, f)
except (IOError, OSError), e:
if DEBUG:
print_exc()
raise IOError('unable to open '+file+': '+str(e))
if self.handlebuffer is not None:
self.handlebuffer.append(file)
if len(self.handlebuffer) > self.max_files_open:
self._close(self.handlebuffer.pop(0))
 
return self.handles[file]
 
 
def _reset_ranges(self):
self.ranges = []
for l in self.working_ranges:
self.ranges.extend(l)
self.begins = [i[0] for i in self.ranges]
 
def _intervals(self, pos, amount):
r = []
stop = pos + amount
p = bisect(self.begins, pos) - 1
while p < len(self.ranges):
begin, end, offset, file = self.ranges[p]
if begin >= stop:
break
r.append(( file,
offset + max(pos, begin) - begin,
offset + min(end, stop) - begin ))
p += 1
return r
 
 
def read(self, pos, amount, flush_first = False):
r = PieceBuffer()
for file, pos, end in self._intervals(pos, amount):
if DEBUG:
print 'reading '+file+' from '+str(pos)+' to '+str(end)
self.lock.acquire()
h = self._get_file_handle(file, False)
if flush_first and self.whandles.has_key(file):
h.flush()
fsync(h)
h.seek(pos)
while pos < end:
length = min(end-pos, MAXREADSIZE)
data = h.read(length)
if len(data) != length:
raise IOError('error reading data from '+file)
r.append(data)
pos += length
self.lock.release()
return r
 
def write(self, pos, s):
# might raise an IOError
total = 0
for file, begin, end in self._intervals(pos, len(s)):
if DEBUG:
print 'writing '+file+' from '+str(pos)+' to '+str(end)
self.lock.acquire()
h = self._get_file_handle(file, True)
h.seek(begin)
h.write(s[total: total + end - begin])
self.lock.release()
total += end - begin
 
def top_off(self):
for begin, end, offset, file in self.ranges:
l = offset + end - begin
if l > self.tops.get(file, 0):
self.lock.acquire()
h = self._get_file_handle(file, True)
h.seek(l-1)
h.write(chr(0xFF))
self.lock.release()
 
def flush(self):
# may raise IOError or OSError
for file in self.whandles.keys():
self.lock.acquire()
self.handles[file].flush()
self.lock.release()
 
def close(self):
for file, f in self.handles.items():
try:
self.unlock_file(file, f)
except:
pass
try:
f.close()
except:
pass
self.handles = {}
self.whandles = {}
self.handlebuffer = None
 
 
def _get_disabled_ranges(self, f):
if not self.file_ranges[f]:
return ((),(),())
r = self.disabled_ranges[f]
if r:
return r
start, end, offset, file = self.file_ranges[f]
if DEBUG:
print 'calculating disabled range for '+self.files[f][0]
print 'bytes: '+str(start)+'-'+str(end)
print 'file spans pieces '+str(int(start/self.piece_length))+'-'+str(int((end-1)/self.piece_length)+1)
pieces = range( int(start/self.piece_length),
int((end-1)/self.piece_length)+1 )
offset = 0
disabled_files = []
if len(pieces) == 1:
if ( start % self.piece_length == 0
and end % self.piece_length == 0 ): # happens to be a single,
# perfect piece
working_range = [(start, end, offset, file)]
update_pieces = []
else:
midfile = os.path.join(self.bufferdir,str(f))
working_range = [(start, end, 0, midfile)]
disabled_files.append((midfile, start, end))
length = end - start
self.sizes[midfile] = length
piece = pieces[0]
update_pieces = [(piece, start-(piece*self.piece_length), length)]
else:
update_pieces = []
if start % self.piece_length != 0: # doesn't begin on an even piece boundary
end_b = pieces[1]*self.piece_length
startfile = os.path.join(self.bufferdir,str(f)+'b')
working_range_b = [ ( start, end_b, 0, startfile ) ]
disabled_files.append((startfile, start, end_b))
length = end_b - start
self.sizes[startfile] = length
offset = length
piece = pieces.pop(0)
update_pieces.append((piece, start-(piece*self.piece_length), length))
else:
working_range_b = []
if f != len(self.files)-1 and end % self.piece_length != 0:
# doesn't end on an even piece boundary
start_e = pieces[-1] * self.piece_length
endfile = os.path.join(self.bufferdir,str(f)+'e')
working_range_e = [ ( start_e, end, 0, endfile ) ]
disabled_files.append((endfile, start_e, end))
length = end - start_e
self.sizes[endfile] = length
piece = pieces.pop(-1)
update_pieces.append((piece, 0, length))
else:
working_range_e = []
if pieces:
working_range_m = [ ( pieces[0]*self.piece_length,
(pieces[-1]+1)*self.piece_length,
offset, file ) ]
else:
working_range_m = []
working_range = working_range_b + working_range_m + working_range_e
 
if DEBUG:
print str(working_range)
print str(update_pieces)
r = (tuple(working_range), tuple(update_pieces), tuple(disabled_files))
self.disabled_ranges[f] = r
return r
 
def set_bufferdir(self, dir):
self.bufferdir = dir
 
def enable_file(self, f):
if not self.disabled[f]:
return
self.disabled[f] = False
r = self.file_ranges[f]
if not r:
return
file = r[3]
if not exists(file):
h = open(file, 'wb+')
h.flush()
h.close()
if not self.tops.has_key(file):
self.tops[file] = getsize(file)
if not self.mtimes.has_key(file):
self.mtimes[file] = getmtime(file)
self.working_ranges[f] = [r]
 
def disable_file(self, f):
if self.disabled[f]:
return
self.disabled[f] = True
r = self._get_disabled_ranges(f)
if not r:
return
for file, begin, end in r[2]:
if not os.path.isdir(self.bufferdir):
os.makedirs(self.bufferdir)
if not exists(file):
h = open(file, 'wb+')
h.flush()
h.close()
if not self.tops.has_key(file):
self.tops[file] = getsize(file)
if not self.mtimes.has_key(file):
self.mtimes[file] = getmtime(file)
self.working_ranges[f] = r[0]
 
reset_file_status = _reset_ranges
 
 
def get_piece_update_list(self, f):
return self._get_disabled_ranges(f)[1]
 
 
def delete_file(self, f):
try:
os.remove(self.files[f][0])
except:
pass
 
 
'''
Pickled data format:
 
d['files'] = [ file #, size, mtime {, file #, size, mtime...} ]
file # in torrent, and the size and last modification
time for those files. Missing files are either empty
or disabled.
d['partial files'] = [ name, size, mtime... ]
Names, sizes and last modification times of files containing
partial piece data. Filenames go by the following convention:
{file #, 0-based}{nothing, "b" or "e"}
eg: "0e" "3" "4b" "4e"
Where "b" specifies the partial data for the first piece in
the file, "e" the last piece, and no letter signifying that
the file is disabled but is smaller than one piece, and that
all the data is cached inside so adjacent files may be
verified.
'''
def pickle(self):
files = []
pfiles = []
for i in xrange(len(self.files)):
if not self.files[i][1]: # length == 0
continue
if self.disabled[i]:
for file, start, end in self._get_disabled_ranges(i)[2]:
pfiles.extend([basename(file),getsize(file),getmtime(file)])
continue
file = self.files[i][0]
files.extend([i,getsize(file),getmtime(file)])
return {'files': files, 'partial files': pfiles}
 
 
def unpickle(self, data):
# assume all previously-disabled files have already been disabled
try:
files = {}
pfiles = {}
l = data['files']
assert len(l) % 3 == 0
l = [l[x:x+3] for x in xrange(0,len(l),3)]
for f, size, mtime in l:
files[f] = (size, mtime)
l = data.get('partial files',[])
assert len(l) % 3 == 0
l = [l[x:x+3] for x in xrange(0,len(l),3)]
for file, size, mtime in l:
pfiles[file] = (size, mtime)
 
valid_pieces = {}
for i in xrange(len(self.files)):
if self.disabled[i]:
continue
r = self.file_ranges[i]
if not r:
continue
start, end, offset, file =r
if DEBUG:
print 'adding '+file
for p in xrange( int(start/self.piece_length),
int((end-1)/self.piece_length)+1 ):
valid_pieces[p] = 1
 
if DEBUG:
print valid_pieces.keys()
def test(old, size, mtime):
oldsize, oldmtime = old
if size != oldsize:
return False
if mtime > oldmtime+1:
return False
if mtime < oldmtime-1:
return False
return True
 
for i in xrange(len(self.files)):
if self.disabled[i]:
for file, start, end in self._get_disabled_ranges(i)[2]:
f1 = basename(file)
if ( not pfiles.has_key(f1)
or not test(pfiles[f1],getsize(file),getmtime(file)) ):
if DEBUG:
print 'removing '+file
for p in xrange( int(start/self.piece_length),
int((end-1)/self.piece_length)+1 ):
if valid_pieces.has_key(p):
del valid_pieces[p]
continue
file, size = self.files[i]
if not size:
continue
if ( not files.has_key(i)
or not test(files[i],getsize(file),getmtime(file)) ):
start, end, offset, file = self.file_ranges[i]
if DEBUG:
print 'removing '+file
for p in xrange( int(start/self.piece_length),
int((end-1)/self.piece_length)+1 ):
if valid_pieces.has_key(p):
del valid_pieces[p]
except:
if DEBUG:
print_exc()
return []
 
if DEBUG:
print valid_pieces.keys()
return valid_pieces.keys()
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/StorageWrapper.py
0,0 → 1,1045
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from BitTornado.bitfield import Bitfield
from sha import sha
from BitTornado.clock import clock
from traceback import print_exc
from random import randrange
try:
True
except:
True = 1
False = 0
try:
from bisect import insort
except:
def insort(l, item):
l.append(item)
l.sort()
 
DEBUG = False
 
STATS_INTERVAL = 0.2
 
def dummy_status(fractionDone = None, activity = None):
pass
 
class Olist:
def __init__(self, l = []):
self.d = {}
for i in l:
self.d[i] = 1
def __len__(self):
return len(self.d)
def includes(self, i):
return self.d.has_key(i)
def add(self, i):
self.d[i] = 1
def extend(self, l):
for i in l:
self.d[i] = 1
def pop(self, n=0):
# assert self.d
k = self.d.keys()
if n == 0:
i = min(k)
elif n == -1:
i = max(k)
else:
k.sort()
i = k[n]
del self.d[i]
return i
def remove(self, i):
if self.d.has_key(i):
del self.d[i]
 
class fakeflag:
def __init__(self, state=False):
self.state = state
def wait(self):
pass
def isSet(self):
return self.state
 
 
class StorageWrapper:
def __init__(self, storage, request_size, hashes,
piece_size, finished, failed,
statusfunc = dummy_status, flag = fakeflag(), check_hashes = True,
data_flunked = lambda x: None, backfunc = None,
config = {}, unpauseflag = fakeflag(True) ):
self.storage = storage
self.request_size = long(request_size)
self.hashes = hashes
self.piece_size = long(piece_size)
self.piece_length = long(piece_size)
self.finished = finished
self.failed = failed
self.statusfunc = statusfunc
self.flag = flag
self.check_hashes = check_hashes
self.data_flunked = data_flunked
self.backfunc = backfunc
self.config = config
self.unpauseflag = unpauseflag
self.alloc_type = config.get('alloc_type','normal')
self.double_check = config.get('double_check', 0)
self.triple_check = config.get('triple_check', 0)
if self.triple_check:
self.double_check = True
self.bgalloc_enabled = False
self.bgalloc_active = False
self.total_length = storage.get_total_length()
self.amount_left = self.total_length
if self.total_length <= self.piece_size * (len(hashes) - 1):
raise ValueError, 'bad data in responsefile - total too small'
if self.total_length > self.piece_size * len(hashes):
raise ValueError, 'bad data in responsefile - total too big'
self.numactive = [0] * len(hashes)
self.inactive_requests = [1] * len(hashes)
self.amount_inactive = self.total_length
self.amount_obtained = 0
self.amount_desired = self.total_length
self.have = Bitfield(len(hashes))
self.have_cloaked_data = None
self.blocked = [False] * len(hashes)
self.blocked_holes = []
self.blocked_movein = Olist()
self.blocked_moveout = Olist()
self.waschecked = [False] * len(hashes)
self.places = {}
self.holes = []
self.stat_active = {}
self.stat_new = {}
self.dirty = {}
self.stat_numflunked = 0
self.stat_numdownloaded = 0
self.stat_numfound = 0
self.download_history = {}
self.failed_pieces = {}
self.out_of_place = 0
self.write_buf_max = config['write_buffer_size']*1048576L
self.write_buf_size = 0L
self.write_buf = {} # structure: piece: [(start, data), ...]
self.write_buf_list = []
 
self.initialize_tasks = [
['checking existing data', 0, self.init_hashcheck, self.hashcheckfunc],
['moving data', 1, self.init_movedata, self.movedatafunc],
['allocating disk space', 1, self.init_alloc, self.allocfunc] ]
 
self.backfunc(self._bgalloc,0.1)
self.backfunc(self._bgsync,max(self.config['auto_flush']*60,60))
 
def _bgsync(self):
if self.config['auto_flush']:
self.sync()
self.backfunc(self._bgsync,max(self.config['auto_flush']*60,60))
 
 
def old_style_init(self):
while self.initialize_tasks:
msg, done, init, next = self.initialize_tasks.pop(0)
if init():
self.statusfunc(activity = msg, fractionDone = done)
t = clock() + STATS_INTERVAL
x = 0
while x is not None:
if t < clock():
t = clock() + STATS_INTERVAL
self.statusfunc(fractionDone = x)
self.unpauseflag.wait()
if self.flag.isSet():
return False
x = next()
 
self.statusfunc(fractionDone = 0)
return True
 
 
def initialize(self, donefunc, statusfunc = None):
self.initialize_done = donefunc
if statusfunc is None:
statusfunc = self.statusfunc
self.initialize_status = statusfunc
self.initialize_next = None
self.backfunc(self._initialize)
 
def _initialize(self):
if not self.unpauseflag.isSet():
self.backfunc(self._initialize, 1)
return
if self.initialize_next:
x = self.initialize_next()
if x is None:
self.initialize_next = None
else:
self.initialize_status(fractionDone = x)
else:
if not self.initialize_tasks:
self.initialize_done()
return
msg, done, init, next = self.initialize_tasks.pop(0)
if init():
self.initialize_status(activity = msg, fractionDone = done)
self.initialize_next = next
 
self.backfunc(self._initialize)
 
 
def init_hashcheck(self):
if self.flag.isSet():
return False
self.check_list = []
if len(self.hashes) == 0 or self.amount_left == 0:
self.check_total = 0
self.finished()
return False
 
self.check_targets = {}
got = {}
for p,v in self.places.items():
assert not got.has_key(v)
got[v] = 1
for i in xrange(len(self.hashes)):
if self.places.has_key(i): # restored from pickled
self.check_targets[self.hashes[i]] = []
if self.places[i] == i:
continue
else:
assert not got.has_key(i)
self.out_of_place += 1
if got.has_key(i):
continue
if self._waspre(i):
if self.blocked[i]:
self.places[i] = i
else:
self.check_list.append(i)
continue
if not self.check_hashes:
self.failed('told file complete on start-up, but data is missing')
return False
self.holes.append(i)
if self.blocked[i] or self.check_targets.has_key(self.hashes[i]):
self.check_targets[self.hashes[i]] = [] # in case of a hash collision, discard
else:
self.check_targets[self.hashes[i]] = [i]
self.check_total = len(self.check_list)
self.check_numchecked = 0.0
self.lastlen = self._piecelen(len(self.hashes) - 1)
self.numchecked = 0.0
return self.check_total > 0
 
def _markgot(self, piece, pos):
if DEBUG:
print str(piece)+' at '+str(pos)
self.places[piece] = pos
self.have[piece] = True
len = self._piecelen(piece)
self.amount_obtained += len
self.amount_left -= len
self.amount_inactive -= len
self.inactive_requests[piece] = None
self.waschecked[piece] = self.check_hashes
self.stat_numfound += 1
 
def hashcheckfunc(self):
if self.flag.isSet():
return None
if not self.check_list:
return None
i = self.check_list.pop(0)
if not self.check_hashes:
self._markgot(i, i)
else:
d1 = self.read_raw(i,0,self.lastlen)
if d1 is None:
return None
sh = sha(d1[:])
d1.release()
sp = sh.digest()
d2 = self.read_raw(i,self.lastlen,self._piecelen(i)-self.lastlen)
if d2 is None:
return None
sh.update(d2[:])
d2.release()
s = sh.digest()
if s == self.hashes[i]:
self._markgot(i, i)
elif ( self.check_targets.get(s)
and self._piecelen(i) == self._piecelen(self.check_targets[s][-1]) ):
self._markgot(self.check_targets[s].pop(), i)
self.out_of_place += 1
elif ( not self.have[-1] and sp == self.hashes[-1]
and (i == len(self.hashes) - 1
or not self._waspre(len(self.hashes) - 1)) ):
self._markgot(len(self.hashes) - 1, i)
self.out_of_place += 1
else:
self.places[i] = i
self.numchecked += 1
if self.amount_left == 0:
self.finished()
return (self.numchecked / self.check_total)
 
 
def init_movedata(self):
if self.flag.isSet():
return False
if self.alloc_type != 'sparse':
return False
self.storage.top_off() # sets file lengths to their final size
self.movelist = []
if self.out_of_place == 0:
for i in self.holes:
self.places[i] = i
self.holes = []
return False
self.tomove = float(self.out_of_place)
for i in xrange(len(self.hashes)):
if not self.places.has_key(i):
self.places[i] = i
elif self.places[i] != i:
self.movelist.append(i)
self.holes = []
return True
 
def movedatafunc(self):
if self.flag.isSet():
return None
if not self.movelist:
return None
i = self.movelist.pop(0)
old = self.read_raw(self.places[i], 0, self._piecelen(i))
if old is None:
return None
if not self.write_raw(i, 0, old):
return None
if self.double_check and self.have[i]:
if self.triple_check:
old.release()
old = self.read_raw( i, 0, self._piecelen(i),
flush_first = True )
if old is None:
return None
if sha(old[:]).digest() != self.hashes[i]:
self.failed('download corrupted; please restart and resume')
return None
old.release()
 
self.places[i] = i
self.tomove -= 1
return (self.tomove / self.out_of_place)
 
def init_alloc(self):
if self.flag.isSet():
return False
if not self.holes:
return False
self.numholes = float(len(self.holes))
self.alloc_buf = chr(0xFF) * self.piece_size
if self.alloc_type == 'pre-allocate':
self.bgalloc_enabled = True
return True
if self.alloc_type == 'background':
self.bgalloc_enabled = True
if self.blocked_moveout:
return True
return False
 
 
def _allocfunc(self):
while self.holes:
n = self.holes.pop(0)
if self.blocked[n]: # assume not self.blocked[index]
if not self.blocked_movein:
self.blocked_holes.append(n)
continue
if not self.places.has_key(n):
b = self.blocked_movein.pop(0)
oldpos = self._move_piece(b, n)
self.places[oldpos] = oldpos
return None
if self.places.has_key(n):
oldpos = self._move_piece(n, n)
self.places[oldpos] = oldpos
return None
return n
return None
 
def allocfunc(self):
if self.flag.isSet():
return None
if self.blocked_moveout:
self.bgalloc_active = True
n = self._allocfunc()
if n is not None:
if self.blocked_moveout.includes(n):
self.blocked_moveout.remove(n)
b = n
else:
b = self.blocked_moveout.pop(0)
oldpos = self._move_piece(b,n)
self.places[oldpos] = oldpos
return len(self.holes) / self.numholes
 
if self.holes and self.bgalloc_enabled:
self.bgalloc_active = True
n = self._allocfunc()
if n is not None:
self.write_raw(n, 0, self.alloc_buf[:self._piecelen(n)])
self.places[n] = n
return len(self.holes) / self.numholes
 
self.bgalloc_active = False
return None
 
def bgalloc(self):
if self.bgalloc_enabled:
if not self.holes and not self.blocked_moveout and self.backfunc:
self.backfunc(self.storage.flush)
# force a flush whenever the "finish allocation" button is hit
self.bgalloc_enabled = True
return False
 
def _bgalloc(self):
self.allocfunc()
if self.config.get('alloc_rate',0) < 0.1:
self.config['alloc_rate'] = 0.1
self.backfunc( self._bgalloc,
float(self.piece_size)/(self.config['alloc_rate']*1048576) )
 
 
def _waspre(self, piece):
return self.storage.was_preallocated(piece * self.piece_size, self._piecelen(piece))
 
def _piecelen(self, piece):
if piece < len(self.hashes) - 1:
return self.piece_size
else:
return self.total_length - (piece * self.piece_size)
 
def get_amount_left(self):
return self.amount_left
 
def do_I_have_anything(self):
return self.amount_left < self.total_length
 
def _make_inactive(self, index):
length = self._piecelen(index)
l = []
x = 0
while x + self.request_size < length:
l.append((x, self.request_size))
x += self.request_size
l.append((x, length - x))
self.inactive_requests[index] = l
 
def is_endgame(self):
return not self.amount_inactive
 
def am_I_complete(self):
return self.amount_obtained == self.amount_desired
 
def reset_endgame(self, requestlist):
for index, begin, length in requestlist:
self.request_lost(index, begin, length)
 
def get_have_list(self):
return self.have.tostring()
 
def get_have_list_cloaked(self):
if self.have_cloaked_data is None:
newhave = Bitfield(copyfrom = self.have)
unhaves = []
n = min(randrange(2,5),len(self.hashes)) # between 2-4 unless torrent is small
while len(unhaves) < n:
unhave = randrange(min(32,len(self.hashes))) # all in first 4 bytes
if not unhave in unhaves:
unhaves.append(unhave)
newhave[unhave] = False
self.have_cloaked_data = (newhave.tostring(), unhaves)
return self.have_cloaked_data
 
def do_I_have(self, index):
return self.have[index]
 
def do_I_have_requests(self, index):
return not not self.inactive_requests[index]
 
def is_unstarted(self, index):
return ( not self.have[index] and not self.numactive[index]
and not self.dirty.has_key(index) )
 
def get_hash(self, index):
return self.hashes[index]
 
def get_stats(self):
return self.amount_obtained, self.amount_desired
 
def new_request(self, index):
# returns (begin, length)
if self.inactive_requests[index] == 1:
self._make_inactive(index)
self.numactive[index] += 1
self.stat_active[index] = 1
if not self.dirty.has_key(index):
self.stat_new[index] = 1
rs = self.inactive_requests[index]
# r = min(rs)
# rs.remove(r)
r = rs.pop(0)
self.amount_inactive -= r[1]
return r
 
 
def write_raw(self, index, begin, data):
try:
self.storage.write(self.piece_size * index + begin, data)
return True
except IOError, e:
self.failed('IO Error: ' + str(e))
return False
 
 
def _write_to_buffer(self, piece, start, data):
if not self.write_buf_max:
return self.write_raw(self.places[piece], start, data)
self.write_buf_size += len(data)
while self.write_buf_size > self.write_buf_max:
old = self.write_buf_list.pop(0)
if not self._flush_buffer(old, True):
return False
if self.write_buf.has_key(piece):
self.write_buf_list.remove(piece)
else:
self.write_buf[piece] = []
self.write_buf_list.append(piece)
self.write_buf[piece].append((start,data))
return True
 
def _flush_buffer(self, piece, popped = False):
if not self.write_buf.has_key(piece):
return True
if not popped:
self.write_buf_list.remove(piece)
l = self.write_buf[piece]
del self.write_buf[piece]
l.sort()
for start, data in l:
self.write_buf_size -= len(data)
if not self.write_raw(self.places[piece], start, data):
return False
return True
 
def sync(self):
spots = {}
for p in self.write_buf_list:
spots[self.places[p]] = p
l = spots.keys()
l.sort()
for i in l:
try:
self._flush_buffer(spots[i])
except:
pass
try:
self.storage.sync()
except IOError, e:
self.failed('IO Error: ' + str(e))
except OSError, e:
self.failed('OS Error: ' + str(e))
 
 
def _move_piece(self, index, newpos):
oldpos = self.places[index]
if DEBUG:
print 'moving '+str(index)+' from '+str(oldpos)+' to '+str(newpos)
assert oldpos != index
assert oldpos != newpos
assert index == newpos or not self.places.has_key(newpos)
old = self.read_raw(oldpos, 0, self._piecelen(index))
if old is None:
return -1
if not self.write_raw(newpos, 0, old):
return -1
self.places[index] = newpos
if self.have[index] and (
self.triple_check or (self.double_check and index == newpos) ):
if self.triple_check:
old.release()
old = self.read_raw(newpos, 0, self._piecelen(index),
flush_first = True)
if old is None:
return -1
if sha(old[:]).digest() != self.hashes[index]:
self.failed('download corrupted; please restart and resume')
return -1
old.release()
 
if self.blocked[index]:
self.blocked_moveout.remove(index)
if self.blocked[newpos]:
self.blocked_movein.remove(index)
else:
self.blocked_movein.add(index)
else:
self.blocked_movein.remove(index)
if self.blocked[newpos]:
self.blocked_moveout.add(index)
else:
self.blocked_moveout.remove(index)
return oldpos
def _clear_space(self, index):
h = self.holes.pop(0)
n = h
if self.blocked[n]: # assume not self.blocked[index]
if not self.blocked_movein:
self.blocked_holes.append(n)
return True # repeat
if not self.places.has_key(n):
b = self.blocked_movein.pop(0)
oldpos = self._move_piece(b, n)
if oldpos < 0:
return False
n = oldpos
if self.places.has_key(n):
oldpos = self._move_piece(n, n)
if oldpos < 0:
return False
n = oldpos
if index == n or index in self.holes:
if n == h:
self.write_raw(n, 0, self.alloc_buf[:self._piecelen(n)])
self.places[index] = n
if self.blocked[n]:
# because n may be a spot cleared 10 lines above, it's possible
# for it to be blocked. While that spot could be left cleared
# and a new spot allocated, this condition might occur several
# times in a row, resulting in a significant amount of disk I/O,
# delaying the operation of the engine. Rather than do this,
# queue the piece to be moved out again, which will be performed
# by the background allocator, with which data movement is
# automatically limited.
self.blocked_moveout.add(index)
return False
for p, v in self.places.items():
if v == index:
break
else:
self.failed('download corrupted; please restart and resume')
return False
self._move_piece(p, n)
self.places[index] = index
return False
 
 
def piece_came_in(self, index, begin, piece, source = None):
assert not self.have[index]
if not self.places.has_key(index):
while self._clear_space(index):
pass
if DEBUG:
print 'new place for '+str(index)+' at '+str(self.places[index])
if self.flag.isSet():
return
 
if self.failed_pieces.has_key(index):
old = self.read_raw(self.places[index], begin, len(piece))
if old is None:
return True
if old[:].tostring() != piece:
try:
self.failed_pieces[index][self.download_history[index][begin]] = 1
except:
self.failed_pieces[index][None] = 1
old.release()
self.download_history.setdefault(index,{})[begin] = source
if not self._write_to_buffer(index, begin, piece):
return True
self.amount_obtained += len(piece)
self.dirty.setdefault(index,[]).append((begin, len(piece)))
self.numactive[index] -= 1
assert self.numactive[index] >= 0
if not self.numactive[index]:
del self.stat_active[index]
if self.stat_new.has_key(index):
del self.stat_new[index]
 
if self.inactive_requests[index] or self.numactive[index]:
return True
del self.dirty[index]
if not self._flush_buffer(index):
return True
length = self._piecelen(index)
data = self.read_raw(self.places[index], 0, length,
flush_first = self.triple_check)
if data is None:
return True
hash = sha(data[:]).digest()
data.release()
if hash != self.hashes[index]:
 
self.amount_obtained -= length
self.data_flunked(length, index)
self.inactive_requests[index] = 1
self.amount_inactive += length
self.stat_numflunked += 1
 
self.failed_pieces[index] = {}
allsenders = {}
for d in self.download_history[index].values():
allsenders[d] = 1
if len(allsenders) == 1:
culprit = allsenders.keys()[0]
if culprit is not None:
culprit.failed(index, bump = True)
del self.failed_pieces[index] # found the culprit already
return False
 
self.have[index] = True
self.inactive_requests[index] = None
self.waschecked[index] = True
self.amount_left -= length
self.stat_numdownloaded += 1
 
for d in self.download_history[index].values():
if d is not None:
d.good(index)
del self.download_history[index]
if self.failed_pieces.has_key(index):
for d in self.failed_pieces[index].keys():
if d is not None:
d.failed(index)
del self.failed_pieces[index]
 
if self.amount_left == 0:
self.finished()
return True
 
 
def request_lost(self, index, begin, length):
assert not (begin, length) in self.inactive_requests[index]
insort(self.inactive_requests[index], (begin, length))
self.amount_inactive += length
self.numactive[index] -= 1
if not self.numactive[index]:
del self.stat_active[index]
if self.stat_new.has_key(index):
del self.stat_new[index]
 
 
def get_piece(self, index, begin, length):
if not self.have[index]:
return None
data = None
if not self.waschecked[index]:
data = self.read_raw(self.places[index], 0, self._piecelen(index))
if data is None:
return None
if sha(data[:]).digest() != self.hashes[index]:
self.failed('told file complete on start-up, but piece failed hash check')
return None
self.waschecked[index] = True
if length == -1 and begin == 0:
return data # optimization
if length == -1:
if begin > self._piecelen(index):
return None
length = self._piecelen(index)-begin
if begin == 0:
return self.read_raw(self.places[index], 0, length)
elif begin + length > self._piecelen(index):
return None
if data is not None:
s = data[begin:begin+length]
data.release()
return s
data = self.read_raw(self.places[index], begin, length)
if data is None:
return None
s = data.getarray()
data.release()
return s
 
def read_raw(self, piece, begin, length, flush_first = False):
try:
return self.storage.read(self.piece_size * piece + begin,
length, flush_first)
except IOError, e:
self.failed('IO Error: ' + str(e))
return None
 
 
def set_file_readonly(self, n):
try:
self.storage.set_readonly(n)
except IOError, e:
self.failed('IO Error: ' + str(e))
except OSError, e:
self.failed('OS Error: ' + str(e))
 
 
def has_data(self, index):
return index not in self.holes and index not in self.blocked_holes
 
def doublecheck_data(self, pieces_to_check):
if not self.double_check:
return
sources = []
for p,v in self.places.items():
if pieces_to_check.has_key(v):
sources.append(p)
assert len(sources) == len(pieces_to_check)
sources.sort()
for index in sources:
if self.have[index]:
piece = self.read_raw(self.places[index],0,self._piecelen(index),
flush_first = True )
if piece is None:
return False
if sha(piece[:]).digest() != self.hashes[index]:
self.failed('download corrupted; please restart and resume')
return False
piece.release()
return True
 
 
def reblock(self, new_blocked):
# assume downloads have already been canceled and chunks made inactive
for i in xrange(len(new_blocked)):
if new_blocked[i] and not self.blocked[i]:
length = self._piecelen(i)
self.amount_desired -= length
if self.have[i]:
self.amount_obtained -= length
continue
if self.inactive_requests[i] == 1:
self.amount_inactive -= length
continue
inactive = 0
for nb, nl in self.inactive_requests[i]:
inactive += nl
self.amount_inactive -= inactive
self.amount_obtained -= length - inactive
if self.blocked[i] and not new_blocked[i]:
length = self._piecelen(i)
self.amount_desired += length
if self.have[i]:
self.amount_obtained += length
continue
if self.inactive_requests[i] == 1:
self.amount_inactive += length
continue
inactive = 0
for nb, nl in self.inactive_requests[i]:
inactive += nl
self.amount_inactive += inactive
self.amount_obtained += length - inactive
 
self.blocked = new_blocked
 
self.blocked_movein = Olist()
self.blocked_moveout = Olist()
for p,v in self.places.items():
if p != v:
if self.blocked[p] and not self.blocked[v]:
self.blocked_movein.add(p)
elif self.blocked[v] and not self.blocked[p]:
self.blocked_moveout.add(p)
 
self.holes.extend(self.blocked_holes) # reset holes list
self.holes.sort()
self.blocked_holes = []
 
 
'''
Pickled data format:
 
d['pieces'] = either a string containing a bitfield of complete pieces,
or the numeric value "1" signifying a seed. If it is
a seed, d['places'] and d['partials'] should be empty
and needn't even exist.
d['partials'] = [ piece, [ offset, length... ]... ]
a list of partial data that had been previously
downloaded, plus the given offsets. Adjacent partials
are merged so as to save space, and so that if the
request size changes then new requests can be
calculated more efficiently.
d['places'] = [ piece, place, {,piece, place ...} ]
the piece index, and the place it's stored.
If d['pieces'] specifies a complete piece or d['partials']
specifies a set of partials for a piece which has no
entry in d['places'], it can be assumed that
place[index] = index. A place specified with no
corresponding data in d['pieces'] or d['partials']
indicates allocated space with no valid data, and is
reserved so it doesn't need to be hash-checked.
'''
def pickle(self):
if self.have.complete():
return {'pieces': 1}
pieces = Bitfield(len(self.hashes))
places = []
partials = []
for p in xrange(len(self.hashes)):
if self.blocked[p] or not self.places.has_key(p):
continue
h = self.have[p]
pieces[p] = h
pp = self.dirty.get(p)
if not h and not pp: # no data
places.extend([self.places[p],self.places[p]])
elif self.places[p] != p:
places.extend([p, self.places[p]])
if h or not pp:
continue
pp.sort()
r = []
while len(pp) > 1:
if pp[0][0]+pp[0][1] == pp[1][0]:
pp[0] = list(pp[0])
pp[0][1] += pp[1][1]
del pp[1]
else:
r.extend(pp[0])
del pp[0]
r.extend(pp[0])
partials.extend([p,r])
return {'pieces': pieces.tostring(), 'places': places, 'partials': partials}
 
 
def unpickle(self, data, valid_places):
got = {}
places = {}
dirty = {}
download_history = {}
stat_active = {}
stat_numfound = self.stat_numfound
amount_obtained = self.amount_obtained
amount_inactive = self.amount_inactive
amount_left = self.amount_left
inactive_requests = [x for x in self.inactive_requests]
restored_partials = []
 
try:
if data['pieces'] == 1: # a seed
assert not data.get('places',None)
assert not data.get('partials',None)
have = Bitfield(len(self.hashes))
for i in xrange(len(self.hashes)):
have[i] = True
assert have.complete()
_places = []
_partials = []
else:
have = Bitfield(len(self.hashes), data['pieces'])
_places = data['places']
assert len(_places) % 2 == 0
_places = [_places[x:x+2] for x in xrange(0,len(_places),2)]
_partials = data['partials']
assert len(_partials) % 2 == 0
_partials = [_partials[x:x+2] for x in xrange(0,len(_partials),2)]
for index, place in _places:
if place not in valid_places:
continue
assert not got.has_key(index)
assert not got.has_key(place)
places[index] = place
got[index] = 1
got[place] = 1
 
for index in xrange(len(self.hashes)):
if have[index]:
if not places.has_key(index):
if index not in valid_places:
have[index] = False
continue
assert not got.has_key(index)
places[index] = index
got[index] = 1
length = self._piecelen(index)
amount_obtained += length
stat_numfound += 1
amount_inactive -= length
amount_left -= length
inactive_requests[index] = None
 
for index, plist in _partials:
assert not dirty.has_key(index)
assert not have[index]
if not places.has_key(index):
if index not in valid_places:
continue
assert not got.has_key(index)
places[index] = index
got[index] = 1
assert len(plist) % 2 == 0
plist = [plist[x:x+2] for x in xrange(0,len(plist),2)]
dirty[index] = plist
stat_active[index] = 1
download_history[index] = {}
# invert given partials
length = self._piecelen(index)
l = []
if plist[0][0] > 0:
l.append((0,plist[0][0]))
for i in xrange(len(plist)-1):
end = plist[i][0]+plist[i][1]
assert not end > plist[i+1][0]
l.append((end,plist[i+1][0]-end))
end = plist[-1][0]+plist[-1][1]
assert not end > length
if end < length:
l.append((end,length-end))
# split them to request_size
ll = []
amount_obtained += length
amount_inactive -= length
for nb, nl in l:
while nl > 0:
r = min(nl,self.request_size)
ll.append((nb,r))
amount_inactive += r
amount_obtained -= r
nb += self.request_size
nl -= self.request_size
inactive_requests[index] = ll
restored_partials.append(index)
 
assert amount_obtained + amount_inactive == self.amount_desired
except:
# print_exc()
return [] # invalid data, discard everything
 
self.have = have
self.places = places
self.dirty = dirty
self.download_history = download_history
self.stat_active = stat_active
self.stat_numfound = stat_numfound
self.amount_obtained = amount_obtained
self.amount_inactive = amount_inactive
self.amount_left = amount_left
self.inactive_requests = inactive_requests
return restored_partials
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/StreamCheck.py
0,0 → 1,135
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from cStringIO import StringIO
from binascii import b2a_hex
from socket import error as socketerror
from urllib import quote
from traceback import print_exc
import Connecter
try:
True
except:
True = 1
False = 0
 
DEBUG = False
 
 
protocol_name = 'BitTorrent protocol'
option_pattern = chr(0)*8
 
def toint(s):
return long(b2a_hex(s), 16)
 
def tobinary(i):
return (chr(i >> 24) + chr((i >> 16) & 0xFF) +
chr((i >> 8) & 0xFF) + chr(i & 0xFF))
 
hexchars = '0123456789ABCDEF'
hexmap = []
for i in xrange(256):
hexmap.append(hexchars[(i&0xF0)/16]+hexchars[i&0x0F])
 
def tohex(s):
r = []
for c in s:
r.append(hexmap[ord(c)])
return ''.join(r)
 
def make_readable(s):
if not s:
return ''
if quote(s).find('%') >= 0:
return tohex(s)
return '"'+s+'"'
def toint(s):
return long(b2a_hex(s), 16)
 
# header, reserved, download id, my id, [length, message]
 
streamno = 0
 
 
class StreamCheck:
def __init__(self):
global streamno
self.no = streamno
streamno += 1
self.buffer = StringIO()
self.next_len, self.next_func = 1, self.read_header_len
 
def read_header_len(self, s):
if ord(s) != len(protocol_name):
print self.no, 'BAD HEADER LENGTH'
return len(protocol_name), self.read_header
 
def read_header(self, s):
if s != protocol_name:
print self.no, 'BAD HEADER'
return 8, self.read_reserved
 
def read_reserved(self, s):
return 20, self.read_download_id
 
def read_download_id(self, s):
if DEBUG:
print self.no, 'download ID ' + tohex(s)
return 20, self.read_peer_id
 
def read_peer_id(self, s):
if DEBUG:
print self.no, 'peer ID' + make_readable(s)
return 4, self.read_len
 
def read_len(self, s):
l = toint(s)
if l > 2 ** 23:
print self.no, 'BAD LENGTH: '+str(l)+' ('+s+')'
return l, self.read_message
 
def read_message(self, s):
if not s:
return 4, self.read_len
m = s[0]
if ord(m) > 8:
print self.no, 'BAD MESSAGE: '+str(ord(m))
if m == Connecter.REQUEST:
if len(s) != 13:
print self.no, 'BAD REQUEST SIZE: '+str(len(s))
return 4, self.read_len
index = toint(s[1:5])
begin = toint(s[5:9])
length = toint(s[9:])
print self.no, 'Request: '+str(index)+': '+str(begin)+'-'+str(begin)+'+'+str(length)
elif m == Connecter.CANCEL:
if len(s) != 13:
print self.no, 'BAD CANCEL SIZE: '+str(len(s))
return 4, self.read_len
index = toint(s[1:5])
begin = toint(s[5:9])
length = toint(s[9:])
print self.no, 'Cancel: '+str(index)+': '+str(begin)+'-'+str(begin)+'+'+str(length)
elif m == Connecter.PIECE:
index = toint(s[1:5])
begin = toint(s[5:9])
length = len(s)-9
print self.no, 'Piece: '+str(index)+': '+str(begin)+'-'+str(begin)+'+'+str(length)
else:
print self.no, 'Message '+str(ord(m))+' (length '+str(len(s))+')'
return 4, self.read_len
 
def write(self, s):
while True:
i = self.next_len - self.buffer.tell()
if i > len(s):
self.buffer.write(s)
return
self.buffer.write(s[:i])
s = s[i:]
m = self.buffer.getvalue()
self.buffer.reset()
self.buffer.truncate()
x = self.next_func(m)
self.next_len, self.next_func = x
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/T2T.py
0,0 → 1,193
# Written by John Hoffman
# see LICENSE.txt for license information
 
from Rerequester import Rerequester
from urllib import quote
from threading import Event
from random import randrange
from string import lower
import sys
import __init__
try:
True
except:
True = 1
False = 0
 
DEBUG = True
 
 
def excfunc(x):
print x
 
class T2TConnection:
def __init__(self, myid, tracker, hash, interval, peers, timeout,
rawserver, disallow, isdisallowed):
self.tracker = tracker
self.interval = interval
self.hash = hash
self.operatinginterval = interval
self.peers = peers
self.rawserver = rawserver
self.disallow = disallow
self.isdisallowed = isdisallowed
self.active = True
self.busy = False
self.errors = 0
self.rejected = 0
self.trackererror = False
self.peerlists = []
 
self.rerequester = Rerequester([[tracker]], interval,
rawserver.add_task, lambda: 0, peers, self.addtolist,
rawserver.add_task, lambda: 1, 0, 0, 0, '',
myid, hash, timeout, self.errorfunc, excfunc, peers, Event(),
lambda: 0, lambda: 0)
 
if self.isactive():
rawserver.add_task(self.refresh, randrange(int(self.interval/10), self.interval))
# stagger announces
 
def isactive(self):
if self.isdisallowed(self.tracker): # whoops!
self.deactivate()
return self.active
def deactivate(self):
self.active = False
 
def refresh(self):
if not self.isactive():
return
self.lastsuccessful = True
self.newpeerdata = []
if DEBUG:
print 'contacting %s for info_hash=%s' % (self.tracker, quote(self.hash))
self.rerequester.snoop(self.peers, self.callback)
 
def callback(self):
self.busy = False
if self.lastsuccessful:
self.errors = 0
self.rejected = 0
if self.rerequester.announce_interval > (3*self.interval):
# I think I'm stripping from a regular tracker; boost the number of peers requested
self.peers = int(self.peers * (self.rerequester.announce_interval / self.interval))
self.operatinginterval = self.rerequester.announce_interval
if DEBUG:
print ("%s with info_hash=%s returned %d peers" %
(self.tracker, quote(self.hash), len(self.newpeerdata)))
self.peerlists.append(self.newpeerdata)
self.peerlists = self.peerlists[-10:] # keep up to the last 10 announces
if self.isactive():
self.rawserver.add_task(self.refresh, self.operatinginterval)
 
def addtolist(self, peers):
for peer in peers:
self.newpeerdata.append((peer[1],peer[0][0],peer[0][1]))
def errorfunc(self, r):
self.lastsuccessful = False
if DEBUG:
print "%s with info_hash=%s gives error: '%s'" % (self.tracker, quote(self.hash), r)
if r == self.rerequester.rejectedmessage + 'disallowed': # whoops!
if DEBUG:
print ' -- disallowed - deactivating'
self.deactivate()
self.disallow(self.tracker) # signal other torrents on this tracker
return
if lower(r[:8]) == 'rejected': # tracker rejected this particular torrent
self.rejected += 1
if self.rejected == 3: # rejected 3 times
if DEBUG:
print ' -- rejected 3 times - deactivating'
self.deactivate()
return
self.errors += 1
if self.errors >= 3: # three or more errors in a row
self.operatinginterval += self.interval # lengthen the interval
if DEBUG:
print ' -- lengthening interval to '+str(self.operatinginterval)+' seconds'
 
def harvest(self):
x = []
for list in self.peerlists:
x += list
self.peerlists = []
return x
 
 
class T2TList:
def __init__(self, enabled, trackerid, interval, maxpeers, timeout, rawserver):
self.enabled = enabled
self.trackerid = trackerid
self.interval = interval
self.maxpeers = maxpeers
self.timeout = timeout
self.rawserver = rawserver
self.list = {}
self.torrents = {}
self.disallowed = {}
self.oldtorrents = []
 
def parse(self, allowed_list):
if not self.enabled:
return
 
# step 1: Create a new list with all tracker/torrent combinations in allowed_dir
newlist = {}
for hash, data in allowed_list.items():
if data.has_key('announce-list'):
for tier in data['announce-list']:
for tracker in tier:
self.disallowed.setdefault(tracker, False)
newlist.setdefault(tracker, {})
newlist[tracker][hash] = None # placeholder
# step 2: Go through and copy old data to the new list.
# if the new list has no place for it, then it's old, so deactivate it
for tracker, hashdata in self.list.items():
for hash, t2t in hashdata.items():
if not newlist.has_key(tracker) or not newlist[tracker].has_key(hash):
t2t.deactivate() # this connection is no longer current
self.oldtorrents += [t2t]
# keep it referenced in case a thread comes along and tries to access.
else:
newlist[tracker][hash] = t2t
if not newlist.has_key(tracker):
self.disallowed[tracker] = False # reset when no torrents on it left
 
self.list = newlist
newtorrents = {}
 
# step 3: If there are any entries that haven't been initialized yet, do so.
# At the same time, copy all entries onto the by-torrent list.
for tracker, hashdata in newlist.items():
for hash, t2t in hashdata.items():
if t2t is None:
hashdata[hash] = T2TConnection(self.trackerid, tracker, hash,
self.interval, self.maxpeers, self.timeout,
self.rawserver, self._disallow, self._isdisallowed)
newtorrents.setdefault(hash,[])
newtorrents[hash] += [hashdata[hash]]
self.torrents = newtorrents
 
# structures:
# list = {tracker: {hash: T2TConnection, ...}, ...}
# torrents = {hash: [T2TConnection, ...]}
# disallowed = {tracker: flag, ...}
# oldtorrents = [T2TConnection, ...]
 
def _disallow(self,tracker):
self.disallowed[tracker] = True
 
def _isdisallowed(self,tracker):
return self.disallowed[tracker]
 
def harvest(self,hash):
harvest = []
if self.enabled:
for t2t in self.torrents[hash]:
harvest += t2t.harvest()
return harvest
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/Uploader.py
0,0 → 1,145
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from BitTornado.CurrentRateMeasure import Measure
 
try:
True
except:
True = 1
False = 0
 
class Upload:
def __init__(self, connection, ratelimiter, totalup, choker, storage,
picker, config):
self.connection = connection
self.ratelimiter = ratelimiter
self.totalup = totalup
self.choker = choker
self.storage = storage
self.picker = picker
self.config = config
self.max_slice_length = config['max_slice_length']
self.choked = True
self.cleared = True
self.interested = False
self.super_seeding = False
self.buffer = []
self.measure = Measure(config['max_rate_period'], config['upload_rate_fudge'])
self.was_ever_interested = False
if storage.get_amount_left() == 0:
if choker.super_seed:
self.super_seeding = True # flag, and don't send bitfield
self.seed_have_list = [] # set from piecepicker
self.skipped_count = 0
else:
if config['breakup_seed_bitfield']:
bitfield, msgs = storage.get_have_list_cloaked()
connection.send_bitfield(bitfield)
for have in msgs:
connection.send_have(have)
else:
connection.send_bitfield(storage.get_have_list())
else:
if storage.do_I_have_anything():
connection.send_bitfield(storage.get_have_list())
self.piecedl = None
self.piecebuf = None
 
def got_not_interested(self):
if self.interested:
self.interested = False
del self.buffer[:]
self.piecedl = None
if self.piecebuf:
self.piecebuf.release()
self.piecebuf = None
self.choker.not_interested(self.connection)
 
def got_interested(self):
if not self.interested:
self.interested = True
self.was_ever_interested = True
self.choker.interested(self.connection)
 
def get_upload_chunk(self):
if self.choked or not self.buffer:
return None
index, begin, length = self.buffer.pop(0)
if self.config['buffer_reads']:
if index != self.piecedl:
if self.piecebuf:
self.piecebuf.release()
self.piecedl = index
self.piecebuf = self.storage.get_piece(index, 0, -1)
try:
piece = self.piecebuf[begin:begin+length]
assert len(piece) == length
except: # fails if storage.get_piece returns None or if out of range
self.connection.close()
return None
else:
if self.piecebuf:
self.piecebuf.release()
self.piecedl = None
piece = self.storage.get_piece(index, begin, length)
if piece is None:
self.connection.close()
return None
self.measure.update_rate(len(piece))
self.totalup.update_rate(len(piece))
return (index, begin, piece)
 
def got_request(self, index, begin, length):
if ( (self.super_seeding and not index in self.seed_have_list)
or not self.interested or length > self.max_slice_length ):
self.connection.close()
return
if not self.cleared:
self.buffer.append((index, begin, length))
if not self.choked and self.connection.next_upload is None:
self.ratelimiter.queue(self.connection)
 
 
def got_cancel(self, index, begin, length):
try:
self.buffer.remove((index, begin, length))
except ValueError:
pass
 
def choke(self):
if not self.choked:
self.choked = True
self.connection.send_choke()
self.piecedl = None
if self.piecebuf:
self.piecebuf.release()
self.piecebuf = None
 
def choke_sent(self):
del self.buffer[:]
self.cleared = True
 
def unchoke(self):
if self.choked:
self.choked = False
self.cleared = False
self.connection.send_unchoke()
def disconnected(self):
if self.piecebuf:
self.piecebuf.release()
self.piecebuf = None
 
def is_choked(self):
return self.choked
def is_interested(self):
return self.interested
 
def has_queries(self):
return not self.choked and len(self.buffer) > 0
 
def get_rate(self):
return self.measure.get_rate()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/__init__.py
0,0 → 1,0
# placeholder
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/btformats.py
0,0 → 1,100
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from types import StringType, LongType, IntType, ListType, DictType
from re import compile
 
reg = compile(r'^[^/\\.~][^/\\]*$')
 
ints = (LongType, IntType)
 
def check_info(info):
if type(info) != DictType:
raise ValueError, 'bad metainfo - not a dictionary'
pieces = info.get('pieces')
if type(pieces) != StringType or len(pieces) % 20 != 0:
raise ValueError, 'bad metainfo - bad pieces key'
piecelength = info.get('piece length')
if type(piecelength) not in ints or piecelength <= 0:
raise ValueError, 'bad metainfo - illegal piece length'
name = info.get('name')
if type(name) != StringType:
raise ValueError, 'bad metainfo - bad name'
if not reg.match(name):
raise ValueError, 'name %s disallowed for security reasons' % name
if info.has_key('files') == info.has_key('length'):
raise ValueError, 'single/multiple file mix'
if info.has_key('length'):
length = info.get('length')
if type(length) not in ints or length < 0:
raise ValueError, 'bad metainfo - bad length'
else:
files = info.get('files')
if type(files) != ListType:
raise ValueError
for f in files:
if type(f) != DictType:
raise ValueError, 'bad metainfo - bad file value'
length = f.get('length')
if type(length) not in ints or length < 0:
raise ValueError, 'bad metainfo - bad length'
path = f.get('path')
if type(path) != ListType or path == []:
raise ValueError, 'bad metainfo - bad path'
for p in path:
if type(p) != StringType:
raise ValueError, 'bad metainfo - bad path dir'
if not reg.match(p):
raise ValueError, 'path %s disallowed for security reasons' % p
for i in xrange(len(files)):
for j in xrange(i):
if files[i]['path'] == files[j]['path']:
raise ValueError, 'bad metainfo - duplicate path'
 
def check_message(message):
if type(message) != DictType:
raise ValueError
check_info(message.get('info'))
if type(message.get('announce')) != StringType:
raise ValueError
 
def check_peers(message):
if type(message) != DictType:
raise ValueError
if message.has_key('failure reason'):
if type(message['failure reason']) != StringType:
raise ValueError
return
peers = message.get('peers')
if type(peers) == ListType:
for p in peers:
if type(p) != DictType:
raise ValueError
if type(p.get('ip')) != StringType:
raise ValueError
port = p.get('port')
if type(port) not in ints or p <= 0:
raise ValueError
if p.has_key('peer id'):
id = p['peer id']
if type(id) != StringType or len(id) != 20:
raise ValueError
elif type(peers) != StringType or len(peers) % 6 != 0:
raise ValueError
interval = message.get('interval', 1)
if type(interval) not in ints or interval <= 0:
raise ValueError
minint = message.get('min interval', 1)
if type(minint) not in ints or minint <= 0:
raise ValueError
if type(message.get('tracker id', '')) != StringType:
raise ValueError
npeers = message.get('num peers', 0)
if type(npeers) not in ints or npeers < 0:
raise ValueError
dpeers = message.get('done peers', 0)
if type(dpeers) not in ints or dpeers < 0:
raise ValueError
last = message.get('last', 0)
if type(last) not in ints or last < 0:
raise ValueError
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/fakeopen.py
0,0 → 1,89
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from string import join
 
class FakeHandle:
def __init__(self, name, fakeopen):
self.name = name
self.fakeopen = fakeopen
self.pos = 0
def flush(self):
pass
def close(self):
pass
def seek(self, pos):
self.pos = pos
def read(self, amount = None):
old = self.pos
f = self.fakeopen.files[self.name]
if self.pos >= len(f):
return ''
if amount is None:
self.pos = len(f)
return join(f[old:], '')
else:
self.pos = min(len(f), old + amount)
return join(f[old:self.pos], '')
def write(self, s):
f = self.fakeopen.files[self.name]
while len(f) < self.pos:
f.append(chr(0))
self.fakeopen.files[self.name][self.pos : self.pos + len(s)] = list(s)
self.pos += len(s)
 
class FakeOpen:
def __init__(self, initial = {}):
self.files = {}
for key, value in initial.items():
self.files[key] = list(value)
def open(self, filename, mode):
"""currently treats everything as rw - doesn't support append"""
self.files.setdefault(filename, [])
return FakeHandle(filename, self)
 
def exists(self, file):
return self.files.has_key(file)
 
def getsize(self, file):
return len(self.files[file])
 
def test_normal():
f = FakeOpen({'f1': 'abcde'})
assert f.exists('f1')
assert not f.exists('f2')
assert f.getsize('f1') == 5
h = f.open('f1', 'rw')
assert h.read(3) == 'abc'
assert h.read(1) == 'd'
assert h.read() == 'e'
assert h.read(2) == ''
h.write('fpq')
h.seek(4)
assert h.read(2) == 'ef'
h.write('ghij')
h.seek(0)
assert h.read() == 'abcdefghij'
h.seek(2)
h.write('p')
h.write('q')
assert h.read(1) == 'e'
h.seek(1)
assert h.read(5) == 'bpqef'
 
h2 = f.open('f2', 'rw')
assert h2.read() == ''
h2.write('mnop')
h2.seek(1)
assert h2.read() == 'nop'
assert f.exists('f1')
assert f.exists('f2')
assert f.getsize('f1') == 10
assert f.getsize('f2') == 4
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/makemetafile.py
0,0 → 1,263
# Written by Bram Cohen
# multitracker extensions by John Hoffman
# see LICENSE.txt for license information
 
from os.path import getsize, split, join, abspath, isdir
from os import listdir
from sha import sha
from copy import copy
from string import strip
from BitTornado.bencode import bencode
from btformats import check_info
from threading import Event
from time import time
from traceback import print_exc
try:
from sys import getfilesystemencoding
ENCODING = getfilesystemencoding()
except:
from sys import getdefaultencoding
ENCODING = getdefaultencoding()
 
defaults = [
('announce_list', '',
'a list of announce URLs - explained below'),
('httpseeds', '',
'a list of http seed URLs - explained below'),
('piece_size_pow2', 0,
"which power of 2 to set the piece size to (0 = automatic)"),
('comment', '',
"optional human-readable comment to put in .torrent"),
('filesystem_encoding', '',
"optional specification for filesystem encoding " +
"(set automatically in recent Python versions)"),
('target', '',
"optional target file for the torrent")
]
 
default_piece_len_exp = 18
 
ignore = ['core', 'CVS']
 
def print_announcelist_details():
print (' announce_list = optional list of redundant/backup tracker URLs, in the format:')
print (' url[,url...][|url[,url...]...]')
print (' where URLs separated by commas are all tried first')
print (' before the next group of URLs separated by the pipe is checked.')
print (" If none is given, it is assumed you don't want one in the metafile.")
print (' If announce_list is given, clients which support it')
print (' will ignore the <announce> value.')
print (' Examples:')
print (' http://tracker1.com|http://tracker2.com|http://tracker3.com')
print (' (tries trackers 1-3 in order)')
print (' http://tracker1.com,http://tracker2.com,http://tracker3.com')
print (' (tries trackers 1-3 in a randomly selected order)')
print (' http://tracker1.com|http://backup1.com,http://backup2.com')
print (' (tries tracker 1 first, then tries between the 2 backups randomly)')
print ('')
print (' httpseeds = optional list of http-seed URLs, in the format:')
print (' url[|url...]')
def make_meta_file(file, url, params = {}, flag = Event(),
progress = lambda x: None, progress_percent = 1):
if params.has_key('piece_size_pow2'):
piece_len_exp = params['piece_size_pow2']
else:
piece_len_exp = default_piece_len_exp
if params.has_key('target') and params['target'] != '':
f = params['target']
else:
a, b = split(file)
if b == '':
f = a + '.torrent'
else:
f = join(a, b + '.torrent')
if piece_len_exp == 0: # automatic
size = calcsize(file)
if size > 8L*1024*1024*1024: # > 8 gig =
piece_len_exp = 21 # 2 meg pieces
elif size > 2*1024*1024*1024: # > 2 gig =
piece_len_exp = 20 # 1 meg pieces
elif size > 512*1024*1024: # > 512M =
piece_len_exp = 19 # 512K pieces
elif size > 64*1024*1024: # > 64M =
piece_len_exp = 18 # 256K pieces
elif size > 16*1024*1024: # > 16M =
piece_len_exp = 17 # 128K pieces
elif size > 4*1024*1024: # > 4M =
piece_len_exp = 16 # 64K pieces
else: # < 4M =
piece_len_exp = 15 # 32K pieces
piece_length = 2 ** piece_len_exp
 
encoding = None
if params.has_key('filesystem_encoding'):
encoding = params['filesystem_encoding']
if not encoding:
encoding = ENCODING
if not encoding:
encoding = 'ascii'
info = makeinfo(file, piece_length, encoding, flag, progress, progress_percent)
if flag.isSet():
return
check_info(info)
h = open(f, 'wb')
data = {'info': info, 'announce': strip(url), 'creation date': long(time())}
if params.has_key('comment') and params['comment']:
data['comment'] = params['comment']
if params.has_key('real_announce_list'): # shortcut for progs calling in from outside
data['announce-list'] = params['real_announce_list']
elif params.has_key('announce_list') and params['announce_list']:
l = []
for tier in params['announce_list'].split('|'):
l.append(tier.split(','))
data['announce-list'] = l
if params.has_key('real_httpseeds'): # shortcut for progs calling in from outside
data['httpseeds'] = params['real_httpseeds']
elif params.has_key('httpseeds') and params['httpseeds']:
data['httpseeds'] = params['httpseeds'].split('|')
h.write(bencode(data))
h.close()
 
def calcsize(file):
if not isdir(file):
return getsize(file)
total = 0L
for s in subfiles(abspath(file)):
total += getsize(s[1])
return total
 
 
def uniconvertl(l, e):
r = []
try:
for s in l:
r.append(uniconvert(s, e))
except UnicodeError:
raise UnicodeError('bad filename: '+join(l))
return r
 
def uniconvert(s, e):
try:
s = unicode(s,e)
except UnicodeError:
raise UnicodeError('bad filename: '+s)
return s.encode('utf-8')
 
def makeinfo(file, piece_length, encoding, flag, progress, progress_percent=1):
file = abspath(file)
if isdir(file):
subs = subfiles(file)
subs.sort()
pieces = []
sh = sha()
done = 0L
fs = []
totalsize = 0.0
totalhashed = 0L
for p, f in subs:
totalsize += getsize(f)
 
for p, f in subs:
pos = 0L
size = getsize(f)
fs.append({'length': size, 'path': uniconvertl(p, encoding)})
h = open(f, 'rb')
while pos < size:
a = min(size - pos, piece_length - done)
sh.update(h.read(a))
if flag.isSet():
return
done += a
pos += a
totalhashed += a
if done == piece_length:
pieces.append(sh.digest())
done = 0
sh = sha()
if progress_percent:
progress(totalhashed / totalsize)
else:
progress(a)
h.close()
if done > 0:
pieces.append(sh.digest())
return {'pieces': ''.join(pieces),
'piece length': piece_length, 'files': fs,
'name': uniconvert(split(file)[1], encoding) }
else:
size = getsize(file)
pieces = []
p = 0L
h = open(file, 'rb')
while p < size:
x = h.read(min(piece_length, size - p))
if flag.isSet():
return
pieces.append(sha(x).digest())
p += piece_length
if p > size:
p = size
if progress_percent:
progress(float(p) / size)
else:
progress(min(piece_length, size - p))
h.close()
return {'pieces': ''.join(pieces),
'piece length': piece_length, 'length': size,
'name': uniconvert(split(file)[1], encoding) }
 
def subfiles(d):
r = []
stack = [([], d)]
while len(stack) > 0:
p, n = stack.pop()
if isdir(n):
for s in listdir(n):
if s not in ignore and s[:1] != '.':
stack.append((copy(p) + [s], join(n, s)))
else:
r.append((p, n))
return r
 
 
def completedir(dir, url, params = {}, flag = Event(),
vc = lambda x: None, fc = lambda x: None):
files = listdir(dir)
files.sort()
ext = '.torrent'
if params.has_key('target'):
target = params['target']
else:
target = ''
 
togen = []
for f in files:
if f[-len(ext):] != ext and (f + ext) not in files:
togen.append(join(dir, f))
total = 0
for i in togen:
total += calcsize(i)
 
subtotal = [0]
def callback(x, subtotal = subtotal, total = total, vc = vc):
subtotal[0] += x
vc(float(subtotal[0]) / total)
for i in togen:
fc(i)
try:
t = split(i)[-1]
if t not in ignore and t[0] != '.':
if target != '':
params['target'] = join(target,t+ext)
make_meta_file(i, url, params, flag, progress = callback, progress_percent = 0)
except ValueError:
print_exc()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/BT1/track.py
0,0 → 1,1067
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from BitTornado.parseargs import parseargs, formatDefinitions
from BitTornado.RawServer import RawServer, autodetect_ipv6, autodetect_socket_style
from BitTornado.HTTPHandler import HTTPHandler, months, weekdays
from BitTornado.parsedir import parsedir
from NatCheck import NatCheck
from T2T import T2TList
from BitTornado.subnetparse import IP_List, ipv6_to_ipv4, to_ipv4, is_valid_ip, is_ipv4
from BitTornado.iprangeparse import IP_List as IP_Range_List
from BitTornado.torrentlistparse import parsetorrentlist
from threading import Event, Thread
from BitTornado.bencode import bencode, bdecode, Bencached
from BitTornado.zurllib import urlopen, quote, unquote
from Filter import Filter
from urlparse import urlparse
from os import rename, getpid
from os.path import exists, isfile
from cStringIO import StringIO
from traceback import print_exc
from time import time, gmtime, strftime, localtime
from BitTornado.clock import clock
from random import shuffle, seed, randrange
from sha import sha
from types import StringType, IntType, LongType, ListType, DictType
from binascii import b2a_hex, a2b_hex, a2b_base64
from string import lower
import sys, os
import signal
import re
import BitTornado.__init__
from BitTornado.__init__ import version, createPeerID
try:
True
except:
True = 1
False = 0
 
defaults = [
('port', 80, "Port to listen on."),
('dfile', None, 'file to store recent downloader info in'),
('bind', '', 'comma-separated list of ips/hostnames to bind to locally'),
# ('ipv6_enabled', autodetect_ipv6(),
('ipv6_enabled', 0,
'allow the client to connect to peers via IPv6'),
('ipv6_binds_v4', autodetect_socket_style(),
'set if an IPv6 server socket will also field IPv4 connections'),
('socket_timeout', 15, 'timeout for closing connections'),
('save_dfile_interval', 5 * 60, 'seconds between saving dfile'),
('timeout_downloaders_interval', 45 * 60, 'seconds between expiring downloaders'),
('reannounce_interval', 30 * 60, 'seconds downloaders should wait between reannouncements'),
('response_size', 50, 'number of peers to send in an info message'),
('timeout_check_interval', 5,
'time to wait between checking if any connections have timed out'),
('nat_check', 3,
"how many times to check if a downloader is behind a NAT (0 = don't check)"),
('log_nat_checks', 0,
"whether to add entries to the log for nat-check results"),
('min_time_between_log_flushes', 3.0,
'minimum time it must have been since the last flush to do another one'),
('min_time_between_cache_refreshes', 600.0,
'minimum time in seconds before a cache is considered stale and is flushed'),
('allowed_dir', '', 'only allow downloads for .torrents in this dir'),
('allowed_list', '', 'only allow downloads for hashes in this list (hex format, one per line)'),
('allowed_controls', 0, 'allow special keys in torrents in the allowed_dir to affect tracker access'),
('multitracker_enabled', 0, 'whether to enable multitracker operation'),
('multitracker_allowed', 'autodetect', 'whether to allow incoming tracker announces (can be none, autodetect or all)'),
('multitracker_reannounce_interval', 2 * 60, 'seconds between outgoing tracker announces'),
('multitracker_maxpeers', 20, 'number of peers to get in a tracker announce'),
('aggregate_forward', '', 'format: <url>[,<password>] - if set, forwards all non-multitracker to this url with this optional password'),
('aggregator', '0', 'whether to act as a data aggregator rather than a tracker. If enabled, may be 1, or <password>; ' +
'if password is set, then an incoming password is required for access'),
('hupmonitor', 0, 'whether to reopen the log file upon receipt of HUP signal'),
('http_timeout', 60,
'number of seconds to wait before assuming that an http connection has timed out'),
('parse_dir_interval', 60, 'seconds between reloading of allowed_dir or allowed_file ' +
'and allowed_ips and banned_ips lists'),
('show_infopage', 1, "whether to display an info page when the tracker's root dir is loaded"),
('infopage_redirect', '', 'a URL to redirect the info page to'),
('show_names', 1, 'whether to display names from allowed dir'),
('favicon', '', 'file containing x-icon data to return when browser requests favicon.ico'),
('allowed_ips', '', 'only allow connections from IPs specified in the given file; '+
'file contains subnet data in the format: aa.bb.cc.dd/len'),
('banned_ips', '', "don't allow connections from IPs specified in the given file; "+
'file contains IP range data in the format: xxx:xxx:ip1-ip2'),
('only_local_override_ip', 2, "ignore the ip GET parameter from machines which aren't on local network IPs " +
"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled)"),
('logfile', '', 'file to write the tracker logs, use - for stdout (default)'),
('allow_get', 0, 'use with allowed_dir; adds a /file?hash={hash} url that allows users to download the torrent file'),
('keep_dead', 0, 'keep dead torrents after they expire (so they still show up on your /scrape and web page)'),
('scrape_allowed', 'full', 'scrape access allowed (can be none, specific or full)'),
('dedicated_seed_id', '', 'allows tracker to monitor dedicated seed(s) and flag torrents as seeded'),
]
 
def statefiletemplate(x):
if type(x) != DictType:
raise ValueError
for cname, cinfo in x.items():
if cname == 'peers':
for y in cinfo.values(): # The 'peers' key is a dictionary of SHA hashes (torrent ids)
if type(y) != DictType: # ... for the active torrents, and each is a dictionary
raise ValueError
for id, info in y.items(): # ... of client ids interested in that torrent
if (len(id) != 20):
raise ValueError
if type(info) != DictType: # ... each of which is also a dictionary
raise ValueError # ... which has an IP, a Port, and a Bytes Left count for that client for that torrent
if type(info.get('ip', '')) != StringType:
raise ValueError
port = info.get('port')
if type(port) not in (IntType,LongType) or port < 0:
raise ValueError
left = info.get('left')
if type(left) not in (IntType,LongType) or left < 0:
raise ValueError
elif cname == 'completed':
if (type(cinfo) != DictType): # The 'completed' key is a dictionary of SHA hashes (torrent ids)
raise ValueError # ... for keeping track of the total completions per torrent
for y in cinfo.values(): # ... each torrent has an integer value
if type(y) not in (IntType,LongType):
raise ValueError # ... for the number of reported completions for that torrent
elif cname == 'allowed':
if (type(cinfo) != DictType): # a list of info_hashes and included data
raise ValueError
if x.has_key('allowed_dir_files'):
adlist = [z[1] for z in x['allowed_dir_files'].values()]
for y in cinfo.keys(): # and each should have a corresponding key here
if not y in adlist:
raise ValueError
elif cname == 'allowed_dir_files':
if (type(cinfo) != DictType): # a list of files, their attributes and info hashes
raise ValueError
dirkeys = {}
for y in cinfo.values(): # each entry should have a corresponding info_hash
if not y[1]:
continue
if not x['allowed'].has_key(y[1]):
raise ValueError
if dirkeys.has_key(y[1]): # and each should have a unique info_hash
raise ValueError
dirkeys[y[1]] = 1
 
alas = 'your file may exist elsewhere in the universe\nbut alas, not here\n'
 
local_IPs = IP_List()
local_IPs.set_intranet_addresses()
 
 
def isotime(secs = None):
if secs == None:
secs = time()
return strftime('%Y-%m-%d %H:%M UTC', gmtime(secs))
 
http_via_filter = re.compile(' for ([0-9.]+)\Z')
 
def _get_forwarded_ip(headers):
header = headers.get('x-forwarded-for')
if header:
try:
x,y = header.split(',')
except:
return header
if is_valid_ip(x) and not local_IPs.includes(x):
return x
return y
header = headers.get('client-ip')
if header:
return header
header = headers.get('via')
if header:
x = http_via_filter.search(header)
try:
return x.group(1)
except:
pass
header = headers.get('from')
#if header:
# return header
#return None
return header
 
def get_forwarded_ip(headers):
x = _get_forwarded_ip(headers)
if not is_valid_ip(x) or local_IPs.includes(x):
return None
return x
 
def compact_peer_info(ip, port):
try:
s = ( ''.join([chr(int(i)) for i in ip.split('.')])
+ chr((port & 0xFF00) >> 8) + chr(port & 0xFF) )
if len(s) != 6:
raise ValueError
except:
s = '' # not a valid IP, must be a domain name
return s
 
class Tracker:
def __init__(self, config, rawserver):
self.config = config
self.response_size = config['response_size']
self.dfile = config['dfile']
self.natcheck = config['nat_check']
favicon = config['favicon']
self.parse_dir_interval = config['parse_dir_interval']
self.favicon = None
if favicon:
try:
h = open(favicon,'r')
self.favicon = h.read()
h.close()
except:
print "**warning** specified favicon file -- %s -- does not exist." % favicon
self.rawserver = rawserver
self.cached = {} # format: infohash: [[time1, l1, s1], [time2, l2, s2], [time3, l3, s3]]
self.cached_t = {} # format: infohash: [time, cache]
self.times = {}
self.state = {}
self.seedcount = {}
 
self.allowed_IPs = None
self.banned_IPs = None
if config['allowed_ips'] or config['banned_ips']:
self.allowed_ip_mtime = 0
self.banned_ip_mtime = 0
self.read_ip_lists()
self.only_local_override_ip = config['only_local_override_ip']
if self.only_local_override_ip == 2:
self.only_local_override_ip = not config['nat_check']
 
if exists(self.dfile):
try:
h = open(self.dfile, 'rb')
ds = h.read()
h.close()
tempstate = bdecode(ds)
if not tempstate.has_key('peers'):
tempstate = {'peers': tempstate}
statefiletemplate(tempstate)
self.state = tempstate
except:
print '**warning** statefile '+self.dfile+' corrupt; resetting'
self.downloads = self.state.setdefault('peers', {})
self.completed = self.state.setdefault('completed', {})
 
self.becache = {} # format: infohash: [[l1, s1], [l2, s2], [l3, s3]]
for infohash, ds in self.downloads.items():
self.seedcount[infohash] = 0
for x,y in ds.items():
ip = y['ip']
if ( (self.allowed_IPs and not self.allowed_IPs.includes(ip))
or (self.banned_IPs and self.banned_IPs.includes(ip)) ):
del ds[x]
continue
if not y['left']:
self.seedcount[infohash] += 1
if y.get('nat',-1):
continue
gip = y.get('given_ip')
if is_valid_ip(gip) and (
not self.only_local_override_ip or local_IPs.includes(ip) ):
ip = gip
self.natcheckOK(infohash,x,ip,y['port'],y['left'])
for x in self.downloads.keys():
self.times[x] = {}
for y in self.downloads[x].keys():
self.times[x][y] = 0
 
self.trackerid = createPeerID('-T-')
seed(self.trackerid)
self.reannounce_interval = config['reannounce_interval']
self.save_dfile_interval = config['save_dfile_interval']
self.show_names = config['show_names']
rawserver.add_task(self.save_state, self.save_dfile_interval)
self.prevtime = clock()
self.timeout_downloaders_interval = config['timeout_downloaders_interval']
rawserver.add_task(self.expire_downloaders, self.timeout_downloaders_interval)
self.logfile = None
self.log = None
if (config['logfile']) and (config['logfile'] != '-'):
try:
self.logfile = config['logfile']
self.log = open(self.logfile,'a')
sys.stdout = self.log
print "# Log Started: ", isotime()
except:
print "**warning** could not redirect stdout to log file: ", sys.exc_info()[0]
 
if config['hupmonitor']:
def huphandler(signum, frame, self = self):
try:
self.log.close ()
self.log = open(self.logfile,'a')
sys.stdout = self.log
print "# Log reopened: ", isotime()
except:
print "**warning** could not reopen logfile"
signal.signal(signal.SIGHUP, huphandler)
self.allow_get = config['allow_get']
self.t2tlist = T2TList(config['multitracker_enabled'], self.trackerid,
config['multitracker_reannounce_interval'],
config['multitracker_maxpeers'], config['http_timeout'],
self.rawserver)
 
if config['allowed_list']:
if config['allowed_dir']:
print '**warning** allowed_dir and allowed_list options cannot be used together'
print '**warning** disregarding allowed_dir'
config['allowed_dir'] = ''
self.allowed = self.state.setdefault('allowed_list',{})
self.allowed_list_mtime = 0
self.parse_allowed()
self.remove_from_state('allowed','allowed_dir_files')
if config['multitracker_allowed'] == 'autodetect':
config['multitracker_allowed'] = 'none'
config['allowed_controls'] = 0
 
elif config['allowed_dir']:
self.allowed = self.state.setdefault('allowed',{})
self.allowed_dir_files = self.state.setdefault('allowed_dir_files',{})
self.allowed_dir_blocked = {}
self.parse_allowed()
self.remove_from_state('allowed_list')
 
else:
self.allowed = None
self.remove_from_state('allowed','allowed_dir_files', 'allowed_list')
if config['multitracker_allowed'] == 'autodetect':
config['multitracker_allowed'] = 'none'
config['allowed_controls'] = 0
self.uq_broken = unquote('+') != ' '
self.keep_dead = config['keep_dead']
self.Filter = Filter(rawserver.add_task)
aggregator = config['aggregator']
if aggregator == '0':
self.is_aggregator = False
self.aggregator_key = None
else:
self.is_aggregator = True
if aggregator == '1':
self.aggregator_key = None
else:
self.aggregator_key = aggregator
self.natcheck = False
send = config['aggregate_forward']
if not send:
self.aggregate_forward = None
else:
try:
self.aggregate_forward, self.aggregate_password = send.split(',')
except:
self.aggregate_forward = send
self.aggregate_password = None
 
self.dedicated_seed_id = config['dedicated_seed_id']
self.is_seeded = {}
 
self.cachetime = 0
self.cachetimeupdate()
 
def cachetimeupdate(self):
self.cachetime += 1 # raw clock, but more efficient for cache
self.rawserver.add_task(self.cachetimeupdate,1)
 
def aggregate_senddata(self, query):
url = self.aggregate_forward+'?'+query
if self.aggregate_password is not None:
url += '&password='+self.aggregate_password
rq = Thread(target = self._aggregate_senddata, args = [url])
rq.setDaemon(False)
rq.start()
 
def _aggregate_senddata(self, url): # just send, don't attempt to error check,
try: # discard any returned data
h = urlopen(url)
h.read()
h.close()
except:
return
 
 
def get_infopage(self):
try:
if not self.config['show_infopage']:
return (404, 'Not Found', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, alas)
red = self.config['infopage_redirect']
if red:
return (302, 'Found', {'Content-Type': 'text/html', 'Location': red},
'<A HREF="'+red+'">Click Here</A>')
s = StringIO()
s.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n' \
'<html><head><title>BitTorrent download info</title>\n')
if self.favicon is not None:
s.write('<link rel="shortcut icon" href="/favicon.ico">\n')
s.write('</head>\n<body>\n' \
'<h3>BitTorrent download info</h3>\n'\
'<ul>\n'
'<li><strong>tracker version:</strong> %s</li>\n' \
'<li><strong>server time:</strong> %s</li>\n' \
'</ul>\n' % (version, isotime()))
if self.config['allowed_dir']:
if self.show_names:
names = [ (self.allowed[hash]['name'],hash)
for hash in self.allowed.keys() ]
else:
names = [ (None,hash)
for hash in self.allowed.keys() ]
else:
names = [ (None,hash) for hash in self.downloads.keys() ]
if not names:
s.write('<p>not tracking any files yet...</p>\n')
else:
names.sort()
tn = 0
tc = 0
td = 0
tt = 0 # Total transferred
ts = 0 # Total size
nf = 0 # Number of files displayed
if self.config['allowed_dir'] and self.show_names:
s.write('<table summary="files" border="1">\n' \
'<tr><th>info hash</th><th>torrent name</th><th align="right">size</th><th align="right">complete</th><th align="right">downloading</th><th align="right">downloaded</th><th align="right">transferred</th></tr>\n')
else:
s.write('<table summary="files">\n' \
'<tr><th>info hash</th><th align="right">complete</th><th align="right">downloading</th><th align="right">downloaded</th></tr>\n')
for name,hash in names:
l = self.downloads[hash]
n = self.completed.get(hash, 0)
tn = tn + n
c = self.seedcount[hash]
tc = tc + c
d = len(l) - c
td = td + d
if self.config['allowed_dir'] and self.show_names:
if self.allowed.has_key(hash):
nf = nf + 1
sz = self.allowed[hash]['length'] # size
ts = ts + sz
szt = sz * n # Transferred for this torrent
tt = tt + szt
if self.allow_get == 1:
linkname = '<a href="/file?info_hash=' + quote(hash) + '">' + name + '</a>'
else:
linkname = name
s.write('<tr><td><code>%s</code></td><td>%s</td><td align="right">%s</td><td align="right">%i</td><td align="right">%i</td><td align="right">%i</td><td align="right">%s</td></tr>\n' \
% (b2a_hex(hash), linkname, size_format(sz), c, d, n, size_format(szt)))
else:
s.write('<tr><td><code>%s</code></td><td align="right"><code>%i</code></td><td align="right"><code>%i</code></td><td align="right"><code>%i</code></td></tr>\n' \
% (b2a_hex(hash), c, d, n))
ttn = 0
for i in self.completed.values():
ttn = ttn + i
if self.config['allowed_dir'] and self.show_names:
s.write('<tr><td align="right" colspan="2">%i files</td><td align="right">%s</td><td align="right">%i</td><td align="right">%i</td><td align="right">%i/%i</td><td align="right">%s</td></tr>\n'
% (nf, size_format(ts), tc, td, tn, ttn, size_format(tt)))
else:
s.write('<tr><td align="right">%i files</td><td align="right">%i</td><td align="right">%i</td><td align="right">%i/%i</td></tr>\n'
% (nf, tc, td, tn, ttn))
s.write('</table>\n' \
'<ul>\n' \
'<li><em>info hash:</em> SHA1 hash of the "info" section of the metainfo (*.torrent)</li>\n' \
'<li><em>complete:</em> number of connected clients with the complete file</li>\n' \
'<li><em>downloading:</em> number of connected clients still downloading</li>\n' \
'<li><em>downloaded:</em> reported complete downloads (total: current/all)</li>\n' \
'<li><em>transferred:</em> torrent size * total downloaded (does not include partial transfers)</li>\n' \
'</ul>\n')
 
s.write('</body>\n' \
'</html>\n')
return (200, 'OK', {'Content-Type': 'text/html; charset=iso-8859-1'}, s.getvalue())
except:
print_exc()
return (500, 'Internal Server Error', {'Content-Type': 'text/html; charset=iso-8859-1'}, 'Server Error')
 
 
def scrapedata(self, hash, return_name = True):
l = self.downloads[hash]
n = self.completed.get(hash, 0)
c = self.seedcount[hash]
d = len(l) - c
f = {'complete': c, 'incomplete': d, 'downloaded': n}
if return_name and self.show_names and self.config['allowed_dir']:
f['name'] = self.allowed[hash]['name']
return (f)
 
def get_scrape(self, paramslist):
fs = {}
if paramslist.has_key('info_hash'):
if self.config['scrape_allowed'] not in ['specific', 'full']:
return (400, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason':
'specific scrape function is not available with this tracker.'}))
for hash in paramslist['info_hash']:
if self.allowed is not None:
if self.allowed.has_key(hash):
fs[hash] = self.scrapedata(hash)
else:
if self.downloads.has_key(hash):
fs[hash] = self.scrapedata(hash)
else:
if self.config['scrape_allowed'] != 'full':
return (400, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason':
'full scrape function is not available with this tracker.'}))
if self.allowed is not None:
keys = self.allowed.keys()
else:
keys = self.downloads.keys()
for hash in keys:
fs[hash] = self.scrapedata(hash)
 
return (200, 'OK', {'Content-Type': 'text/plain'}, bencode({'files': fs}))
 
 
def get_file(self, hash):
if not self.allow_get:
return (400, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
'get function is not available with this tracker.')
if not self.allowed.has_key(hash):
return (404, 'Not Found', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, alas)
fname = self.allowed[hash]['file']
fpath = self.allowed[hash]['path']
return (200, 'OK', {'Content-Type': 'application/x-bittorrent',
'Content-Disposition': 'attachment; filename=' + fname},
open(fpath, 'rb').read())
 
 
def check_allowed(self, infohash, paramslist):
if ( self.aggregator_key is not None
and not ( paramslist.has_key('password')
and paramslist['password'][0] == self.aggregator_key ) ):
return (200, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason':
'Requested download is not authorized for use with this tracker.'}))
 
if self.allowed is not None:
if not self.allowed.has_key(infohash):
return (200, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason':
'Requested download is not authorized for use with this tracker.'}))
if self.config['allowed_controls']:
if self.allowed[infohash].has_key('failure reason'):
return (200, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason': self.allowed[infohash]['failure reason']}))
 
if paramslist.has_key('tracker'):
if ( self.config['multitracker_allowed'] == 'none' or # turned off
paramslist['peer_id'][0] == self.trackerid ): # oops! contacted myself
return (200, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason': 'disallowed'}))
if ( self.config['multitracker_allowed'] == 'autodetect'
and not self.allowed[infohash].has_key('announce-list') ):
return (200, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason':
'Requested download is not authorized for multitracker use.'}))
 
return None
 
 
def add_data(self, infohash, event, ip, paramslist):
peers = self.downloads.setdefault(infohash, {})
ts = self.times.setdefault(infohash, {})
self.completed.setdefault(infohash, 0)
self.seedcount.setdefault(infohash, 0)
 
def params(key, default = None, l = paramslist):
if l.has_key(key):
return l[key][0]
return default
myid = params('peer_id','')
if len(myid) != 20:
raise ValueError, 'id not of length 20'
if event not in ['started', 'completed', 'stopped', 'snooped', None]:
raise ValueError, 'invalid event'
port = long(params('port',''))
if port < 0 or port > 65535:
raise ValueError, 'invalid port'
left = long(params('left',''))
if left < 0:
raise ValueError, 'invalid amount left'
uploaded = long(params('uploaded',''))
downloaded = long(params('downloaded',''))
 
peer = peers.get(myid)
islocal = local_IPs.includes(ip)
mykey = params('key')
if peer:
auth = peer.get('key',-1) == mykey or peer.get('ip') == ip
 
gip = params('ip')
if is_valid_ip(gip) and (islocal or not self.only_local_override_ip):
ip1 = gip
else:
ip1 = ip
 
if params('numwant') is not None:
rsize = min(int(params('numwant')),self.response_size)
else:
rsize = self.response_size
 
if event == 'stopped':
if peer:
if auth:
self.delete_peer(infohash,myid)
elif not peer:
ts[myid] = clock()
peer = {'ip': ip, 'port': port, 'left': left}
if mykey:
peer['key'] = mykey
if gip:
peer['given ip'] = gip
if port:
if not self.natcheck or islocal:
peer['nat'] = 0
self.natcheckOK(infohash,myid,ip1,port,left)
else:
NatCheck(self.connectback_result,infohash,myid,ip1,port,self.rawserver)
else:
peer['nat'] = 2**30
if event == 'completed':
self.completed[infohash] += 1
if not left:
self.seedcount[infohash] += 1
 
peers[myid] = peer
 
else:
if not auth:
return rsize # return w/o changing stats
 
ts[myid] = clock()
if not left and peer['left']:
self.completed[infohash] += 1
self.seedcount[infohash] += 1
if not peer.get('nat', -1):
for bc in self.becache[infohash]:
bc[1][myid] = bc[0][myid]
del bc[0][myid]
elif left and not peer['left']:
self.completed[infohash] -= 1
self.seedcount[infohash] -= 1
if not peer.get('nat', -1):
for bc in self.becache[infohash]:
bc[0][myid] = bc[1][myid]
del bc[1][myid]
peer['left'] = left
 
if port:
recheck = False
if ip != peer['ip']:
peer['ip'] = ip
recheck = True
if gip != peer.get('given ip'):
if gip:
peer['given ip'] = gip
elif peer.has_key('given ip'):
del peer['given ip']
recheck = True
 
natted = peer.get('nat', -1)
if recheck:
if natted == 0:
l = self.becache[infohash]
y = not peer['left']
for x in l:
del x[y][myid]
if natted >= 0:
del peer['nat'] # restart NAT testing
if natted and natted < self.natcheck:
recheck = True
 
if recheck:
if not self.natcheck or islocal:
peer['nat'] = 0
self.natcheckOK(infohash,myid,ip1,port,left)
else:
NatCheck(self.connectback_result,infohash,myid,ip1,port,self.rawserver)
 
return rsize
 
 
def peerlist(self, infohash, stopped, tracker, is_seed, return_type, rsize):
data = {} # return data
seeds = self.seedcount[infohash]
data['complete'] = seeds
data['incomplete'] = len(self.downloads[infohash]) - seeds
if ( self.config['allowed_controls']
and self.allowed[infohash].has_key('warning message') ):
data['warning message'] = self.allowed[infohash]['warning message']
 
if tracker:
data['interval'] = self.config['multitracker_reannounce_interval']
if not rsize:
return data
cache = self.cached_t.setdefault(infohash, None)
if ( not cache or len(cache[1]) < rsize
or cache[0] + self.config['min_time_between_cache_refreshes'] < clock() ):
bc = self.becache.setdefault(infohash,[[{}, {}], [{}, {}], [{}, {}]])
cache = [ clock(), bc[0][0].values() + bc[0][1].values() ]
self.cached_t[infohash] = cache
shuffle(cache[1])
cache = cache[1]
 
data['peers'] = cache[-rsize:]
del cache[-rsize:]
return data
 
data['interval'] = self.reannounce_interval
if stopped or not rsize: # save some bandwidth
data['peers'] = []
return data
 
bc = self.becache.setdefault(infohash,[[{}, {}], [{}, {}], [{}, {}]])
len_l = len(bc[0][0])
len_s = len(bc[0][1])
if not (len_l+len_s): # caches are empty!
data['peers'] = []
return data
l_get_size = int(float(rsize)*(len_l)/(len_l+len_s))
cache = self.cached.setdefault(infohash,[None,None,None])[return_type]
if cache and ( not cache[1]
or (is_seed and len(cache[1]) < rsize)
or len(cache[1]) < l_get_size
or cache[0]+self.config['min_time_between_cache_refreshes'] < self.cachetime ):
cache = None
if not cache:
peers = self.downloads[infohash]
vv = [[],[],[]]
for key, ip, port in self.t2tlist.harvest(infohash): # empty if disabled
if not peers.has_key(key):
vv[0].append({'ip': ip, 'port': port, 'peer id': key})
vv[1].append({'ip': ip, 'port': port})
vv[2].append(compact_peer_info(ip, port))
cache = [ self.cachetime,
bc[return_type][0].values()+vv[return_type],
bc[return_type][1].values() ]
shuffle(cache[1])
shuffle(cache[2])
self.cached[infohash][return_type] = cache
for rr in xrange(len(self.cached[infohash])):
if rr != return_type:
try:
self.cached[infohash][rr][1].extend(vv[rr])
except:
pass
if len(cache[1]) < l_get_size:
peerdata = cache[1]
if not is_seed:
peerdata.extend(cache[2])
cache[1] = []
cache[2] = []
else:
if not is_seed:
peerdata = cache[2][l_get_size-rsize:]
del cache[2][l_get_size-rsize:]
rsize -= len(peerdata)
else:
peerdata = []
if rsize:
peerdata.extend(cache[1][-rsize:])
del cache[1][-rsize:]
if return_type == 2:
peerdata = ''.join(peerdata)
data['peers'] = peerdata
return data
 
 
def get(self, connection, path, headers):
real_ip = connection.get_ip()
ip = real_ip
if is_ipv4(ip):
ipv4 = True
else:
try:
ip = ipv6_to_ipv4(ip)
ipv4 = True
except ValueError:
ipv4 = False
 
if ( (self.allowed_IPs and not self.allowed_IPs.includes(ip))
or (self.banned_IPs and self.banned_IPs.includes(ip)) ):
return (400, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason':
'your IP is not allowed on this tracker'}))
 
nip = get_forwarded_ip(headers)
if nip and not self.only_local_override_ip:
ip = nip
try:
ip = to_ipv4(ip)
ipv4 = True
except ValueError:
ipv4 = False
 
paramslist = {}
def params(key, default = None, l = paramslist):
if l.has_key(key):
return l[key][0]
return default
 
try:
(scheme, netloc, path, pars, query, fragment) = urlparse(path)
if self.uq_broken == 1:
path = path.replace('+',' ')
query = query.replace('+',' ')
path = unquote(path)[1:]
for s in query.split('&'):
if s:
i = s.index('=')
kw = unquote(s[:i])
paramslist.setdefault(kw, [])
paramslist[kw] += [unquote(s[i+1:])]
if path == '' or path == 'index.html':
return self.get_infopage()
if (path == 'file'):
return self.get_file(params('info_hash'))
if path == 'favicon.ico' and self.favicon is not None:
return (200, 'OK', {'Content-Type' : 'image/x-icon'}, self.favicon)
 
# automated access from here on
 
if path in ('scrape', 'scrape.php', 'tracker.php/scrape'):
return self.get_scrape(paramslist)
if not path in ('announce', 'announce.php', 'tracker.php/announce'):
return (404, 'Not Found', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, alas)
 
# main tracker function
 
filtered = self.Filter.check(real_ip, paramslist, headers)
if filtered:
return (400, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'failure reason': filtered}))
infohash = params('info_hash')
if not infohash:
raise ValueError, 'no info hash'
 
notallowed = self.check_allowed(infohash, paramslist)
if notallowed:
return notallowed
 
event = params('event')
 
rsize = self.add_data(infohash, event, ip, paramslist)
 
except ValueError, e:
return (400, 'Bad Request', {'Content-Type': 'text/plain'},
'you sent me garbage - ' + str(e))
 
if self.aggregate_forward and not paramslist.has_key('tracker'):
self.aggregate_senddata(query)
 
if self.is_aggregator: # don't return peer data here
return (200, 'OK', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'},
bencode({'response': 'OK'}))
 
if params('compact') and ipv4:
return_type = 2
elif params('no_peer_id'):
return_type = 1
else:
return_type = 0
data = self.peerlist(infohash, event=='stopped',
params('tracker'), not params('left'),
return_type, rsize)
 
if paramslist.has_key('scrape'): # deprecated
data['scrape'] = self.scrapedata(infohash, False)
 
if self.dedicated_seed_id:
if params('seed_id') == self.dedicated_seed_id and params('left') == 0:
self.is_seeded[infohash] = True
if params('check_seeded') and self.is_seeded.get(infohash):
data['seeded'] = 1
return (200, 'OK', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, bencode(data))
 
 
def natcheckOK(self, infohash, peerid, ip, port, not_seed):
bc = self.becache.setdefault(infohash,[[{}, {}], [{}, {}], [{}, {}]])
bc[0][not not_seed][peerid] = Bencached(bencode({'ip': ip, 'port': port,
'peer id': peerid}))
bc[1][not not_seed][peerid] = Bencached(bencode({'ip': ip, 'port': port}))
bc[2][not not_seed][peerid] = compact_peer_info(ip, port)
 
 
def natchecklog(self, peerid, ip, port, result):
year, month, day, hour, minute, second, a, b, c = localtime(time())
print '%s - %s [%02d/%3s/%04d:%02d:%02d:%02d] "!natcheck-%s:%i" %i 0 - -' % (
ip, quote(peerid), day, months[month], year, hour, minute, second,
ip, port, result)
 
def connectback_result(self, result, downloadid, peerid, ip, port):
record = self.downloads.get(downloadid, {}).get(peerid)
if ( record is None
or (record['ip'] != ip and record.get('given ip') != ip)
or record['port'] != port ):
if self.config['log_nat_checks']:
self.natchecklog(peerid, ip, port, 404)
return
if self.config['log_nat_checks']:
if result:
x = 200
else:
x = 503
self.natchecklog(peerid, ip, port, x)
if not record.has_key('nat'):
record['nat'] = int(not result)
if result:
self.natcheckOK(downloadid,peerid,ip,port,record['left'])
elif result and record['nat']:
record['nat'] = 0
self.natcheckOK(downloadid,peerid,ip,port,record['left'])
elif not result:
record['nat'] += 1
 
 
def remove_from_state(self, *l):
for s in l:
try:
del self.state[s]
except:
pass
 
def save_state(self):
self.rawserver.add_task(self.save_state, self.save_dfile_interval)
h = open(self.dfile, 'wb')
h.write(bencode(self.state))
h.close()
 
 
def parse_allowed(self):
self.rawserver.add_task(self.parse_allowed, self.parse_dir_interval)
 
if self.config['allowed_dir']:
r = parsedir( self.config['allowed_dir'], self.allowed,
self.allowed_dir_files, self.allowed_dir_blocked,
[".torrent"] )
( self.allowed, self.allowed_dir_files, self.allowed_dir_blocked,
added, garbage2 ) = r
self.state['allowed'] = self.allowed
self.state['allowed_dir_files'] = self.allowed_dir_files
 
self.t2tlist.parse(self.allowed)
else:
f = self.config['allowed_list']
if self.allowed_list_mtime == os.path.getmtime(f):
return
try:
r = parsetorrentlist(f, self.allowed)
(self.allowed, added, garbage2) = r
self.state['allowed_list'] = self.allowed
except (IOError, OSError):
print '**warning** unable to read allowed torrent list'
return
self.allowed_list_mtime = os.path.getmtime(f)
 
for infohash in added.keys():
self.downloads.setdefault(infohash, {})
self.completed.setdefault(infohash, 0)
self.seedcount.setdefault(infohash, 0)
 
 
def read_ip_lists(self):
self.rawserver.add_task(self.read_ip_lists,self.parse_dir_interval)
f = self.config['allowed_ips']
if f and self.allowed_ip_mtime != os.path.getmtime(f):
self.allowed_IPs = IP_List()
try:
self.allowed_IPs.read_fieldlist(f)
self.allowed_ip_mtime = os.path.getmtime(f)
except (IOError, OSError):
print '**warning** unable to read allowed_IP list'
f = self.config['banned_ips']
if f and self.banned_ip_mtime != os.path.getmtime(f):
self.banned_IPs = IP_Range_List()
try:
self.banned_IPs.read_rangelist(f)
self.banned_ip_mtime = os.path.getmtime(f)
except (IOError, OSError):
print '**warning** unable to read banned_IP list'
 
def delete_peer(self, infohash, peerid):
dls = self.downloads[infohash]
peer = dls[peerid]
if not peer['left']:
self.seedcount[infohash] -= 1
if not peer.get('nat',-1):
l = self.becache[infohash]
y = not peer['left']
for x in l:
del x[y][peerid]
del self.times[infohash][peerid]
del dls[peerid]
 
def expire_downloaders(self):
for x in self.times.keys():
for myid, t in self.times[x].items():
if t < self.prevtime:
self.delete_peer(x,myid)
self.prevtime = clock()
if (self.keep_dead != 1):
for key, value in self.downloads.items():
if len(value) == 0 and (
self.allowed is None or not self.allowed.has_key(key) ):
del self.times[key]
del self.downloads[key]
del self.seedcount[key]
self.rawserver.add_task(self.expire_downloaders, self.timeout_downloaders_interval)
 
 
def track(args):
if len(args) == 0:
print formatDefinitions(defaults, 80)
return
try:
config, files = parseargs(args, defaults, 0, 0)
except ValueError, e:
print 'error: ' + str(e)
print 'run with no arguments for parameter explanations'
return
r = RawServer(Event(), config['timeout_check_interval'],
config['socket_timeout'], ipv6_enable = config['ipv6_enabled'])
t = Tracker(config, r)
r.bind(config['port'], config['bind'],
reuse = True, ipv6_socket_style = config['ipv6_binds_v4'])
r.listen_forever(HTTPHandler(t.get, config['min_time_between_log_flushes']))
t.save_state()
print '# Shutting down: ' + isotime()
 
def size_format(s):
if (s < 1024):
r = str(s) + 'B'
elif (s < 1048576):
r = str(int(s/1024)) + 'KiB'
elif (s < 1073741824L):
r = str(int(s/1048576)) + 'MiB'
elif (s < 1099511627776L):
r = str(int((s/1073741824.0)*100.0)/100.0) + 'GiB'
else:
r = str(int((s/1099511627776.0)*100.0)/100.0) + 'TiB'
return(r)
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/Entries
0,0 → 1,31
/.cvsignore/1.1/Tue Feb 24 17:53:47 2004//
/ConfigDir.py/1.23/Sat Jan 22 17:39:26 2005//
/ConnChoice.py/1.2/Sun Jul 11 02:15:37 2004//
/CreateIcons.py/1.3/Tue Nov 30 22:03:22 2004//
/CurrentRateMeasure.py/1.4/Thu May 13 15:14:58 2004//
/HTTPHandler.py/1.6/Fri Dec 17 00:28:48 2004//
/PSYCO.py/1.1/Tue Feb 24 17:53:47 2004//
/RateLimiter.py/1.12/Mon Jul 12 14:37:18 2004//
/RateMeasure.py/1.7/Tue Dec 28 19:32:36 2004//
/RawServer.py/1.29/Tue Apr 26 17:56:25 2005//
/SocketHandler.py/1.28/Wed Mar 23 16:58:21 2005//
/bencode.py/1.13/Fri Dec 31 19:35:35 2004//
/bitfield.py/1.11/Thu Apr 14 16:35:12 2005//
/clock.py/1.2/Thu May 13 16:18:05 2004//
/inifile.py/1.3/Wed Jan 5 20:21:53 2005//
/iprangeparse.py/1.3/Sun Aug 7 05:58:22 2005//
/launchmanycore.py/1.35/Sun Aug 7 05:58:23 2005//
/natpunch.py/1.11/Wed Dec 15 03:56:16 2004//
/parseargs.py/1.5/Tue May 25 19:00:58 2004//
/parsedir.py/1.16/Fri Jun 25 17:36:57 2004//
/piecebuffer.py/1.5/Sat Apr 9 00:39:41 2005//
/selectpoll.py/1.4/Sat Jul 10 21:54:53 2004//
/subnetparse.py/1.8/Sat Aug 20 02:11:08 2005//
/torrentlistparse.py/1.2/Tue Dec 21 22:14:09 2004//
/zurllib.py/1.11/Sat May 21 23:35:09 2005//
D/BT1////
D/GUI////
/ConfigReader.py/1.28/Fri Mar 3 04:08:36 2006//
/ServerPortHandler.py/1.12/Fri Mar 3 04:08:36 2006//
/__init__.py/1.34/Fri Mar 3 04:08:36 2006//
/download_bt1.py/1.70/Sat Mar 4 20:28:22 2006//
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/Entries.Extra
0,0 → 1,31
/.cvsignore////*///
/ConfigDir.py////*///
/ConnChoice.py////*///
/CreateIcons.py////*///
/CurrentRateMeasure.py////*///
/HTTPHandler.py////*///
/PSYCO.py////*///
/RateLimiter.py////*///
/RateMeasure.py////*///
/RawServer.py////*///
/SocketHandler.py////*///
/bencode.py////*///
/bitfield.py////*///
/clock.py////*///
/inifile.py////*///
/iprangeparse.py////*///
/launchmanycore.py////*///
/natpunch.py////*///
/parseargs.py////*///
/parsedir.py////*///
/piecebuffer.py////*///
/selectpoll.py////*///
/subnetparse.py////*///
/torrentlistparse.py////*///
/zurllib.py////*///
D/BT1///////
D/GUI///////
/ConfigReader.py////*///
/ServerPortHandler.py////*///
/__init__.py////*///
/download_bt1.py////*///
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/Entries.Extra.Old
0,0 → 1,31
/.cvsignore////*///
/ConfigDir.py////*///
/ConnChoice.py////*///
/CreateIcons.py////*///
/CurrentRateMeasure.py////*///
/HTTPHandler.py////*///
/PSYCO.py////*///
/RateLimiter.py////*///
/RateMeasure.py////*///
/RawServer.py////*///
/SocketHandler.py////*///
/bencode.py////*///
/bitfield.py////*///
/clock.py////*///
/inifile.py////*///
/iprangeparse.py////*///
/launchmanycore.py////*///
/natpunch.py////*///
/parseargs.py////*///
/parsedir.py////*///
/piecebuffer.py////*///
/selectpoll.py////*///
/subnetparse.py////*///
/torrentlistparse.py////*///
/zurllib.py////*///
D/BT1///////
D/GUI///////
/ConfigReader.py////*///
/ServerPortHandler.py////*///
/__init__.py////*///
/download_bt1.py////*///
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/Entries.Old
0,0 → 1,31
/.cvsignore/1.1/Tue Feb 24 17:53:47 2004//
/ConfigDir.py/1.23/Sat Jan 22 17:39:26 2005//
/ConnChoice.py/1.2/Sun Jul 11 02:15:37 2004//
/CreateIcons.py/1.3/Tue Nov 30 22:03:22 2004//
/CurrentRateMeasure.py/1.4/Thu May 13 15:14:58 2004//
/HTTPHandler.py/1.6/Fri Dec 17 00:28:48 2004//
/PSYCO.py/1.1/Tue Feb 24 17:53:47 2004//
/RateLimiter.py/1.12/Mon Jul 12 14:37:18 2004//
/RateMeasure.py/1.7/Tue Dec 28 19:32:36 2004//
/RawServer.py/1.29/Tue Apr 26 17:56:25 2005//
/SocketHandler.py/1.28/Wed Mar 23 16:58:21 2005//
/bencode.py/1.13/Fri Dec 31 19:35:35 2004//
/bitfield.py/1.11/Thu Apr 14 16:35:12 2005//
/clock.py/1.2/Thu May 13 16:18:05 2004//
/inifile.py/1.3/Wed Jan 5 20:21:53 2005//
/iprangeparse.py/1.3/Sun Aug 7 05:58:22 2005//
/launchmanycore.py/1.35/Sun Aug 7 05:58:23 2005//
/natpunch.py/1.11/Wed Dec 15 03:56:16 2004//
/parseargs.py/1.5/Tue May 25 19:00:58 2004//
/parsedir.py/1.16/Fri Jun 25 17:36:57 2004//
/piecebuffer.py/1.5/Sat Apr 9 00:39:41 2005//
/selectpoll.py/1.4/Sat Jul 10 21:54:53 2004//
/subnetparse.py/1.8/Sat Aug 20 02:11:08 2005//
/torrentlistparse.py/1.2/Tue Dec 21 22:14:09 2004//
/zurllib.py/1.11/Sat May 21 23:35:09 2005//
D/BT1////
D/GUI////
/ConfigReader.py/1.28/Fri Mar 3 04:08:36 2006//
/ServerPortHandler.py/1.12/Fri Mar 3 04:08:36 2006//
/__init__.py/1.34/Fri Mar 3 04:08:36 2006//
/download_bt1.py/1.69/Fri Mar 3 04:08:36 2006//
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/Repository
0,0 → 1,0
bittornado/BitTornado
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/Root
0,0 → 1,0
:ext:theshadow@cvs.degreez.net:/home/cvs/bittorrent
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/Template
--- kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/index.html (nonexistent)
+++ kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CVS/index.html (revision 36)
@@ -0,0 +1 @@
+<html></html>
\ No newline at end of file
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/ConfigDir.py
0,0 → 1,401
#written by John Hoffman
 
from inifile import ini_write, ini_read
from bencode import bencode, bdecode
from types import IntType, LongType, StringType, FloatType
from CreateIcons import GetIcons, CreateIcon
from parseargs import defaultargs
from __init__ import product_name, version_short
import sys,os
from time import time, strftime
 
try:
True
except:
True = 1
False = 0
 
try:
realpath = os.path.realpath
except:
realpath = lambda x:x
OLDICONPATH = os.path.abspath(os.path.dirname(realpath(sys.argv[0])))
 
DIRNAME = '.'+product_name
 
hexchars = '0123456789abcdef'
hexmap = []
revmap = {}
for i in xrange(256):
x = hexchars[(i&0xF0)/16]+hexchars[i&0x0F]
hexmap.append(x)
revmap[x] = chr(i)
 
def tohex(s):
r = []
for c in s:
r.append(hexmap[ord(c)])
return ''.join(r)
 
def unhex(s):
r = [ revmap[s[x:x+2]] for x in xrange(0, len(s), 2) ]
return ''.join(r)
 
def copyfile(oldpath, newpath): # simple file copy, all in RAM
try:
f = open(oldpath,'rb')
r = f.read()
success = True
except:
success = False
try:
f.close()
except:
pass
if not success:
return False
try:
f = open(newpath,'wb')
f.write(r)
except:
success = False
try:
f.close()
except:
pass
return success
 
 
class ConfigDir:
 
###### INITIALIZATION TASKS ######
 
def __init__(self, config_type = None):
self.config_type = config_type
if config_type:
config_ext = '.'+config_type
else:
config_ext = ''
 
def check_sysvars(x):
y = os.path.expandvars(x)
if y != x and os.path.isdir(y):
return y
return None
 
for d in ['${APPDATA}', '${HOME}', '${HOMEPATH}', '${USERPROFILE}']:
dir_root = check_sysvars(d)
if dir_root:
break
else:
dir_root = os.path.expanduser('~')
if not os.path.isdir(dir_root):
dir_root = os.path.abspath(os.path.dirname(sys.argv[0]))
 
dir_root = os.path.join(dir_root,DIRNAME)
self.dir_root = dir_root
 
if not os.path.isdir(self.dir_root):
os.mkdir(self.dir_root,0700) # exception if failed
 
self.dir_icons = os.path.join(dir_root,'icons')
if not os.path.isdir(self.dir_icons):
os.mkdir(self.dir_icons)
for icon in GetIcons():
i = os.path.join(self.dir_icons,icon)
if not os.path.exists(i):
if not copyfile(os.path.join(OLDICONPATH,icon),i):
CreateIcon(icon,self.dir_icons)
 
self.dir_torrentcache = os.path.join(dir_root,'torrentcache')
if not os.path.isdir(self.dir_torrentcache):
os.mkdir(self.dir_torrentcache)
 
self.dir_datacache = os.path.join(dir_root,'datacache')
if not os.path.isdir(self.dir_datacache):
os.mkdir(self.dir_datacache)
 
self.dir_piececache = os.path.join(dir_root,'piececache')
if not os.path.isdir(self.dir_piececache):
os.mkdir(self.dir_piececache)
 
self.configfile = os.path.join(dir_root,'config'+config_ext+'.ini')
self.statefile = os.path.join(dir_root,'state'+config_ext)
 
self.TorrentDataBuffer = {}
 
 
###### CONFIG HANDLING ######
 
def setDefaults(self, defaults, ignore=[]):
self.config = defaultargs(defaults)
for k in ignore:
if self.config.has_key(k):
del self.config[k]
 
def checkConfig(self):
return os.path.exists(self.configfile)
 
def loadConfig(self):
try:
r = ini_read(self.configfile)['']
except:
return self.config
l = self.config.keys()
for k,v in r.items():
if self.config.has_key(k):
t = type(self.config[k])
try:
if t == StringType:
self.config[k] = v
elif t == IntType or t == LongType:
self.config[k] = long(v)
elif t == FloatType:
self.config[k] = float(v)
l.remove(k)
except:
pass
if l: # new default values since last save
self.saveConfig()
return self.config
 
def saveConfig(self, new_config = None):
if new_config:
for k,v in new_config.items():
if self.config.has_key(k):
self.config[k] = v
try:
ini_write( self.configfile, self.config,
'Generated by '+product_name+'/'+version_short+'\n'
+ strftime('%x %X') )
return True
except:
return False
 
def getConfig(self):
return self.config
 
 
###### STATE HANDLING ######
 
def getState(self):
try:
f = open(self.statefile,'rb')
r = f.read()
except:
r = None
try:
f.close()
except:
pass
try:
r = bdecode(r)
except:
r = None
return r
 
def saveState(self, state):
try:
f = open(self.statefile,'wb')
f.write(bencode(state))
success = True
except:
success = False
try:
f.close()
except:
pass
return success
 
 
###### TORRENT HANDLING ######
 
def getTorrents(self):
d = {}
for f in os.listdir(self.dir_torrentcache):
f = os.path.basename(f)
try:
f, garbage = f.split('.')
except:
pass
d[unhex(f)] = 1
return d.keys()
 
def getTorrentVariations(self, t):
t = tohex(t)
d = []
for f in os.listdir(self.dir_torrentcache):
f = os.path.basename(f)
if f[:len(t)] == t:
try:
garbage, ver = f.split('.')
except:
ver = '0'
d.append(int(ver))
d.sort()
return d
 
def getTorrent(self, t, v = -1):
t = tohex(t)
if v == -1:
v = max(self.getTorrentVariations(t)) # potential exception
if v:
t += '.'+str(v)
try:
f = open(os.path.join(self.dir_torrentcache,t),'rb')
r = bdecode(f.read())
except:
r = None
try:
f.close()
except:
pass
return r
 
def writeTorrent(self, data, t, v = -1):
t = tohex(t)
if v == -1:
try:
v = max(self.getTorrentVariations(t))+1
except:
v = 0
if v:
t += '.'+str(v)
try:
f = open(os.path.join(self.dir_torrentcache,t),'wb')
f.write(bencode(data))
except:
v = None
try:
f.close()
except:
pass
return v
 
 
###### TORRENT DATA HANDLING ######
 
def getTorrentData(self, t):
if self.TorrentDataBuffer.has_key(t):
return self.TorrentDataBuffer[t]
t = os.path.join(self.dir_datacache,tohex(t))
if not os.path.exists(t):
return None
try:
f = open(t,'rb')
r = bdecode(f.read())
except:
r = None
try:
f.close()
except:
pass
self.TorrentDataBuffer[t] = r
return r
 
def writeTorrentData(self, t, data):
self.TorrentDataBuffer[t] = data
try:
f = open(os.path.join(self.dir_datacache,tohex(t)),'wb')
f.write(bencode(data))
success = True
except:
success = False
try:
f.close()
except:
pass
if not success:
self.deleteTorrentData(t)
return success
 
def deleteTorrentData(self, t):
try:
os.remove(os.path.join(self.dir_datacache,tohex(t)))
except:
pass
 
def getPieceDir(self, t):
return os.path.join(self.dir_piececache,tohex(t))
 
 
###### EXPIRATION HANDLING ######
 
def deleteOldCacheData(self, days, still_active = [], delete_torrents = False):
if not days:
return
exptime = time() - (days*24*3600)
names = {}
times = {}
 
for f in os.listdir(self.dir_torrentcache):
p = os.path.join(self.dir_torrentcache,f)
f = os.path.basename(f)
try:
f, garbage = f.split('.')
except:
pass
try:
f = unhex(f)
assert len(f) == 20
except:
continue
if delete_torrents:
names.setdefault(f,[]).append(p)
try:
t = os.path.getmtime(p)
except:
t = time()
times.setdefault(f,[]).append(t)
for f in os.listdir(self.dir_datacache):
p = os.path.join(self.dir_datacache,f)
try:
f = unhex(os.path.basename(f))
assert len(f) == 20
except:
continue
names.setdefault(f,[]).append(p)
try:
t = os.path.getmtime(p)
except:
t = time()
times.setdefault(f,[]).append(t)
 
for f in os.listdir(self.dir_piececache):
p = os.path.join(self.dir_piececache,f)
try:
f = unhex(os.path.basename(f))
assert len(f) == 20
except:
continue
for f2 in os.listdir(p):
p2 = os.path.join(p,f2)
names.setdefault(f,[]).append(p2)
try:
t = os.path.getmtime(p2)
except:
t = time()
times.setdefault(f,[]).append(t)
names.setdefault(f,[]).append(p)
 
for k,v in times.items():
if max(v) < exptime and not k in still_active:
for f in names[k]:
try:
os.remove(f)
except:
try:
os.removedirs(f)
except:
pass
 
 
def deleteOldTorrents(self, days, still_active = []):
self.deleteOldCacheData(days, still_active, True)
 
 
###### OTHER ######
 
def getIconDir(self):
return self.dir_icons
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/ConfigReader.py
0,0 → 1,1068
#written by John Hoffman
 
from ConnChoice import *
from wxPython.wx import *
from types import IntType, FloatType, StringType
from download_bt1 import defaults
from ConfigDir import ConfigDir
import sys,os
import socket
from parseargs import defaultargs
 
try:
True
except:
True = 1
False = 0
try:
wxFULL_REPAINT_ON_RESIZE
except:
wxFULL_REPAINT_ON_RESIZE = 0 # fix for wx pre-2.5
 
if (sys.platform == 'win32'):
_FONT = 9
else:
_FONT = 10
 
def HexToColor(s):
r,g,b = s.split(' ')
return wxColour(red=int(r,16), green=int(g,16), blue=int(b,16))
def hex2(c):
h = hex(c)[2:]
if len(h) == 1:
h = '0'+h
return h
def ColorToHex(c):
return hex2(c.Red()) + ' ' + hex2(c.Green()) + ' ' + hex2(c.Blue())
 
ratesettingslist = []
for x in connChoices:
if not x.has_key('super-seed'):
ratesettingslist.append(x['name'])
 
 
configFileDefaults = [
#args only available for the gui client
('win32_taskbar_icon', 1,
"whether to iconize do system try or not on win32"),
('gui_stretchwindow', 0,
"whether to stretch the download status window to fit the torrent name"),
('gui_displaystats', 1,
"whether to display statistics on peers and seeds"),
('gui_displaymiscstats', 1,
"whether to display miscellaneous other statistics"),
('gui_ratesettingsdefault', ratesettingslist[0],
"the default setting for maximum upload rate and users"),
('gui_ratesettingsmode', 'full',
"what rate setting controls to display; options are 'none', 'basic', and 'full'"),
('gui_forcegreenonfirewall', 0,
"forces the status icon to be green even if the client seems to be firewalled"),
('gui_default_savedir', '',
"default save directory"),
('last_saved', '', # hidden; not set in config
"where the last torrent was saved"),
('gui_font', _FONT,
"the font size to use"),
('gui_saveas_ask', -1,
"whether to ask where to download to (0 = never, 1 = always, -1 = automatic resume"),
]
 
def setwxconfigfiledefaults():
CHECKINGCOLOR = ColorToHex(wxSystemSettings_GetColour(wxSYS_COLOUR_3DSHADOW))
DOWNLOADCOLOR = ColorToHex(wxSystemSettings_GetColour(wxSYS_COLOUR_ACTIVECAPTION))
configFileDefaults.extend([
('gui_checkingcolor', CHECKINGCOLOR,
"progress bar checking color"),
('gui_downloadcolor', DOWNLOADCOLOR,
"progress bar downloading color"),
('gui_seedingcolor', '00 FF 00',
"progress bar seeding color"),
])
 
defaultsToIgnore = ['responsefile', 'url', 'priority']
 
 
class configReader:
 
def __init__(self):
self.configfile = wxConfig("BitTorrent",style=wxCONFIG_USE_LOCAL_FILE)
self.configMenuBox = None
self.advancedMenuBox = None
self._configReset = True # run reset for the first time
 
setwxconfigfiledefaults()
 
defaults.extend(configFileDefaults)
self.defaults = defaultargs(defaults)
 
self.configDir = ConfigDir('gui')
self.configDir.setDefaults(defaults,defaultsToIgnore)
if self.configDir.checkConfig():
self.config = self.configDir.loadConfig()
else:
self.config = self.configDir.getConfig()
self.importOldGUIConfig()
self.configDir.saveConfig()
 
updated = False # make all config default changes here
 
if self.config['gui_ratesettingsdefault'] not in ratesettingslist:
self.config['gui_ratesettingsdefault'] = (
self.defaults['gui_ratesettingsdefault'] )
updated = True
if self.config['ipv6_enabled'] and (
sys.version_info < (2,3) or not socket.has_ipv6 ):
self.config['ipv6_enabled'] = 0
updated = True
for c in ['gui_checkingcolor','gui_downloadcolor','gui_seedingcolor']:
try:
HexToColor(self.config[c])
except:
self.config[c] = self.defaults[c]
updated = True
 
if updated:
self.configDir.saveConfig()
 
self.configDir.deleteOldCacheData(self.config['expire_cache_data'])
 
 
def importOldGUIConfig(self):
oldconfig = wxConfig("BitTorrent",style=wxCONFIG_USE_LOCAL_FILE)
cont, s, i = oldconfig.GetFirstEntry()
if not cont:
oldconfig.DeleteAll()
return False
while cont: # import old config data
if self.config.has_key(s):
t = oldconfig.GetEntryType(s)
try:
if t == 1:
assert type(self.config[s]) == type('')
self.config[s] = oldconfig.Read(s)
elif t == 2 or t == 3:
assert type(self.config[s]) == type(1)
self.config[s] = int(oldconfig.ReadInt(s))
elif t == 4:
assert type(self.config[s]) == type(1.0)
self.config[s] = oldconfig.ReadFloat(s)
except:
pass
cont, s, i = oldconfig.GetNextEntry(i)
 
# oldconfig.DeleteAll()
return True
 
 
def resetConfigDefaults(self):
for p,v in self.defaults.items():
if not p in defaultsToIgnore:
self.config[p] = v
self.configDir.saveConfig()
 
def writeConfigFile(self):
self.configDir.saveConfig()
 
def WriteLastSaved(self, l):
self.config['last_saved'] = l
self.configDir.saveConfig()
 
 
def getcheckingcolor(self):
return HexToColor(self.config['gui_checkingcolor'])
def getdownloadcolor(self):
return HexToColor(self.config['gui_downloadcolor'])
def getseedingcolor(self):
return HexToColor(self.config['gui_seedingcolor'])
 
def configReset(self):
r = self._configReset
self._configReset = False
return r
 
def getConfigDir(self):
return self.configDir
 
def getIconDir(self):
return self.configDir.getIconDir()
 
def getTorrentData(self,t):
return self.configDir.getTorrentData(t)
 
def setColorIcon(self, xxicon, xxiconptr, xxcolor):
idata = wxMemoryDC()
idata.SelectObject(xxicon)
idata.SetBrush(wxBrush(xxcolor,wxSOLID))
idata.DrawRectangle(0,0,16,16)
idata.SelectObject(wxNullBitmap)
xxiconptr.Refresh()
 
 
def getColorFromUser(self, parent, colInit):
data = wxColourData()
if colInit.Ok():
data.SetColour(colInit)
data.SetCustomColour(0, self.checkingcolor)
data.SetCustomColour(1, self.downloadcolor)
data.SetCustomColour(2, self.seedingcolor)
dlg = wxColourDialog(parent,data)
if not dlg.ShowModal():
return colInit
return dlg.GetColourData().GetColour()
 
 
def configMenu(self, parent):
self.parent = parent
try:
self.FONT = self.config['gui_font']
self.default_font = wxFont(self.FONT, wxDEFAULT, wxNORMAL, wxNORMAL, False)
self.checkingcolor = HexToColor(self.config['gui_checkingcolor'])
self.downloadcolor = HexToColor(self.config['gui_downloadcolor'])
self.seedingcolor = HexToColor(self.config['gui_seedingcolor'])
if (self.configMenuBox is not None):
try:
self.configMenuBox.Close()
except wxPyDeadObjectError, e:
self.configMenuBox = None
 
self.configMenuBox = wxFrame(None, -1, 'BitTorrent Preferences', size = (1,1),
style = wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE)
if (sys.platform == 'win32'):
self.icon = self.parent.icon
self.configMenuBox.SetIcon(self.icon)
 
panel = wxPanel(self.configMenuBox, -1)
self.panel = panel
 
def StaticText(text, font = self.FONT, underline = False, color = None, panel = panel):
x = wxStaticText(panel, -1, text, style = wxALIGN_LEFT)
x.SetFont(wxFont(font, wxDEFAULT, wxNORMAL, wxNORMAL, underline))
if color is not None:
x.SetForegroundColour(color)
return x
 
colsizer = wxFlexGridSizer(cols = 1, vgap = 8)
 
self.gui_stretchwindow_checkbox = wxCheckBox(panel, -1, "Stretch window to fit torrent name *")
self.gui_stretchwindow_checkbox.SetFont(self.default_font)
self.gui_stretchwindow_checkbox.SetValue(self.config['gui_stretchwindow'])
 
self.gui_displaystats_checkbox = wxCheckBox(panel, -1, "Display peer and seed statistics")
self.gui_displaystats_checkbox.SetFont(self.default_font)
self.gui_displaystats_checkbox.SetValue(self.config['gui_displaystats'])
 
self.gui_displaymiscstats_checkbox = wxCheckBox(panel, -1, "Display miscellaneous other statistics")
self.gui_displaymiscstats_checkbox.SetFont(self.default_font)
self.gui_displaymiscstats_checkbox.SetValue(self.config['gui_displaymiscstats'])
 
self.security_checkbox = wxCheckBox(panel, -1, "Don't allow multiple connections from the same IP")
self.security_checkbox.SetFont(self.default_font)
self.security_checkbox.SetValue(self.config['security'])
 
self.autokick_checkbox = wxCheckBox(panel, -1, "Kick/ban clients that send you bad data *")
self.autokick_checkbox.SetFont(self.default_font)
self.autokick_checkbox.SetValue(self.config['auto_kick'])
 
self.buffering_checkbox = wxCheckBox(panel, -1, "Enable read/write buffering *")
self.buffering_checkbox.SetFont(self.default_font)
self.buffering_checkbox.SetValue(self.config['buffer_reads'])
 
self.breakup_checkbox = wxCheckBox(panel, -1, "Break-up seed bitfield to foil ISP manipulation")
self.breakup_checkbox.SetFont(self.default_font)
self.breakup_checkbox.SetValue(self.config['breakup_seed_bitfield'])
 
self.autoflush_checkbox = wxCheckBox(panel, -1, "Flush data to disk every 5 minutes")
self.autoflush_checkbox.SetFont(self.default_font)
self.autoflush_checkbox.SetValue(self.config['auto_flush'])
 
if sys.version_info >= (2,3) and socket.has_ipv6:
self.ipv6enabled_checkbox = wxCheckBox(panel, -1, "Initiate and receive connections via IPv6 *")
self.ipv6enabled_checkbox.SetFont(self.default_font)
self.ipv6enabled_checkbox.SetValue(self.config['ipv6_enabled'])
 
self.gui_forcegreenonfirewall_checkbox = wxCheckBox(panel, -1,
"Force icon to display green when firewalled")
self.gui_forcegreenonfirewall_checkbox.SetFont(self.default_font)
self.gui_forcegreenonfirewall_checkbox.SetValue(self.config['gui_forcegreenonfirewall'])
 
 
self.minport_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*8, -1))
self.minport_data.SetFont(self.default_font)
self.minport_data.SetRange(1,65535)
self.minport_data.SetValue(self.config['minport'])
 
self.maxport_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*8, -1))
self.maxport_data.SetFont(self.default_font)
self.maxport_data.SetRange(1,65535)
self.maxport_data.SetValue(self.config['maxport'])
self.randomport_checkbox = wxCheckBox(panel, -1, "randomize")
self.randomport_checkbox.SetFont(self.default_font)
self.randomport_checkbox.SetValue(self.config['random_port'])
self.gui_font_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*5, -1))
self.gui_font_data.SetFont(self.default_font)
self.gui_font_data.SetRange(8,16)
self.gui_font_data.SetValue(self.config['gui_font'])
 
self.gui_ratesettingsdefault_data=wxChoice(panel, -1, choices = ratesettingslist)
self.gui_ratesettingsdefault_data.SetFont(self.default_font)
self.gui_ratesettingsdefault_data.SetStringSelection(self.config['gui_ratesettingsdefault'])
 
self.maxdownload_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
self.maxdownload_data.SetFont(self.default_font)
self.maxdownload_data.SetRange(0,5000)
self.maxdownload_data.SetValue(self.config['max_download_rate'])
 
self.gui_ratesettingsmode_data=wxRadioBox(panel, -1, 'Rate Settings Mode',
choices = [ 'none', 'basic', 'full' ] )
self.gui_ratesettingsmode_data.SetFont(self.default_font)
self.gui_ratesettingsmode_data.SetStringSelection(self.config['gui_ratesettingsmode'])
 
if (sys.platform == 'win32'):
self.win32_taskbar_icon_checkbox = wxCheckBox(panel, -1, "Minimize to system tray")
self.win32_taskbar_icon_checkbox.SetFont(self.default_font)
self.win32_taskbar_icon_checkbox.SetValue(self.config['win32_taskbar_icon'])
# self.upnp_checkbox = wxCheckBox(panel, -1, "Enable automatic UPnP port forwarding")
# self.upnp_checkbox.SetFont(self.default_font)
# self.upnp_checkbox.SetValue(self.config['upnp_nat_access'])
self.upnp_data=wxChoice(panel, -1,
choices = ['disabled', 'type 1 (fast)', 'type 2 (slow)'])
self.upnp_data.SetFont(self.default_font)
self.upnp_data.SetSelection(self.config['upnp_nat_access'])
 
self.gui_default_savedir_ctrl = wxTextCtrl(parent = panel, id = -1,
value = self.config['gui_default_savedir'],
size = (26*self.FONT, -1), style = wxTE_PROCESS_TAB)
self.gui_default_savedir_ctrl.SetFont(self.default_font)
 
self.gui_savemode_data=wxRadioBox(panel, -1, 'Ask where to save: *',
choices = [ 'always', 'never', 'auto-resume' ] )
self.gui_savemode_data.SetFont(self.default_font)
self.gui_savemode_data.SetSelection(1-self.config['gui_saveas_ask'])
 
self.checkingcolor_icon = wxEmptyBitmap(16,16)
self.checkingcolor_iconptr = wxStaticBitmap(panel, -1, self.checkingcolor_icon)
self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, self.checkingcolor)
 
self.downloadcolor_icon = wxEmptyBitmap(16,16)
self.downloadcolor_iconptr = wxStaticBitmap(panel, -1, self.downloadcolor_icon)
self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, self.downloadcolor)
 
self.seedingcolor_icon = wxEmptyBitmap(16,16)
self.seedingcolor_iconptr = wxStaticBitmap(panel, -1, self.seedingcolor_icon)
self.setColorIcon(self.seedingcolor_icon, self.downloadcolor_iconptr, self.seedingcolor)
rowsizer = wxFlexGridSizer(cols = 2, hgap = 20)
 
block12sizer = wxFlexGridSizer(cols = 1, vgap = 7)
 
block1sizer = wxFlexGridSizer(cols = 1, vgap = 2)
if (sys.platform == 'win32'):
block1sizer.Add(self.win32_taskbar_icon_checkbox)
# block1sizer.Add(self.upnp_checkbox)
block1sizer.Add(self.gui_stretchwindow_checkbox)
block1sizer.Add(self.gui_displaystats_checkbox)
block1sizer.Add(self.gui_displaymiscstats_checkbox)
block1sizer.Add(self.security_checkbox)
block1sizer.Add(self.autokick_checkbox)
block1sizer.Add(self.buffering_checkbox)
block1sizer.Add(self.breakup_checkbox)
block1sizer.Add(self.autoflush_checkbox)
if sys.version_info >= (2,3) and socket.has_ipv6:
block1sizer.Add(self.ipv6enabled_checkbox)
block1sizer.Add(self.gui_forcegreenonfirewall_checkbox)
 
block12sizer.Add(block1sizer)
 
colorsizer = wxStaticBoxSizer(wxStaticBox(panel, -1, "Gauge Colors:"), wxVERTICAL)
colorsizer1 = wxFlexGridSizer(cols = 7)
colorsizer1.Add(StaticText(' Checking: '), 1, wxALIGN_BOTTOM)
colorsizer1.Add(self.checkingcolor_iconptr, 1, wxALIGN_BOTTOM)
colorsizer1.Add(StaticText(' Downloading: '), 1, wxALIGN_BOTTOM)
colorsizer1.Add(self.downloadcolor_iconptr, 1, wxALIGN_BOTTOM)
colorsizer1.Add(StaticText(' Seeding: '), 1, wxALIGN_BOTTOM)
colorsizer1.Add(self.seedingcolor_iconptr, 1, wxALIGN_BOTTOM)
colorsizer1.Add(StaticText(' '))
minsize = self.checkingcolor_iconptr.GetBestSize()
minsize.SetHeight(minsize.GetHeight()+5)
colorsizer1.SetMinSize(minsize)
colorsizer.Add(colorsizer1)
block12sizer.Add(colorsizer, 1, wxALIGN_LEFT)
 
rowsizer.Add(block12sizer)
 
block3sizer = wxFlexGridSizer(cols = 1)
 
portsettingsSizer = wxStaticBoxSizer(wxStaticBox(panel, -1, "Port Range:*"), wxVERTICAL)
portsettingsSizer1 = wxGridSizer(cols = 2, vgap = 1)
portsettingsSizer1.Add(StaticText('From: '), 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT)
portsettingsSizer1.Add(self.minport_data, 1, wxALIGN_BOTTOM)
portsettingsSizer1.Add(StaticText('To: '), 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT)
portsettingsSizer1.Add(self.maxport_data, 1, wxALIGN_BOTTOM)
portsettingsSizer.Add(portsettingsSizer1)
portsettingsSizer.Add(self.randomport_checkbox, 1, wxALIGN_CENTER)
block3sizer.Add(portsettingsSizer, 1, wxALIGN_CENTER)
block3sizer.Add(StaticText(' '))
block3sizer.Add(self.gui_ratesettingsmode_data, 1, wxALIGN_CENTER)
block3sizer.Add(StaticText(' '))
ratesettingsSizer = wxFlexGridSizer(cols = 1, vgap = 2)
ratesettingsSizer.Add(StaticText('Default Rate Setting: *'), 1, wxALIGN_CENTER)
ratesettingsSizer.Add(self.gui_ratesettingsdefault_data, 1, wxALIGN_CENTER)
block3sizer.Add(ratesettingsSizer, 1, wxALIGN_CENTER)
if (sys.platform == 'win32'):
block3sizer.Add(StaticText(' '))
upnpSizer = wxFlexGridSizer(cols = 1, vgap = 2)
upnpSizer.Add(StaticText('UPnP Port Forwarding: *'), 1, wxALIGN_CENTER)
upnpSizer.Add(self.upnp_data, 1, wxALIGN_CENTER)
block3sizer.Add(upnpSizer, 1, wxALIGN_CENTER)
rowsizer.Add(block3sizer)
colsizer.Add(rowsizer)
 
block4sizer = wxFlexGridSizer(cols = 3, hgap = 15)
savepathsizer = wxFlexGridSizer(cols = 2, vgap = 1)
savepathsizer.Add(StaticText('Default Save Path: *'))
savepathsizer.Add(StaticText(' '))
savepathsizer.Add(self.gui_default_savedir_ctrl, 1, wxEXPAND)
savepathButton = wxButton(panel, -1, '...', size = (18,18))
# savepathButton.SetFont(self.default_font)
savepathsizer.Add(savepathButton, 0, wxALIGN_CENTER)
savepathsizer.Add(self.gui_savemode_data, 0, wxALIGN_CENTER)
block4sizer.Add(savepathsizer, -1, wxALIGN_BOTTOM)
 
fontsizer = wxFlexGridSizer(cols = 1, vgap = 2)
fontsizer.Add(StaticText(''))
fontsizer.Add(StaticText('Font: *'), 1, wxALIGN_CENTER)
fontsizer.Add(self.gui_font_data, 1, wxALIGN_CENTER)
block4sizer.Add(fontsizer, 1, wxALIGN_CENTER_VERTICAL)
 
dratesettingsSizer = wxFlexGridSizer(cols = 1, vgap = 2)
dratesettingsSizer.Add(StaticText('Default Max'), 1, wxALIGN_CENTER)
dratesettingsSizer.Add(StaticText('Download Rate'), 1, wxALIGN_CENTER)
dratesettingsSizer.Add(StaticText('(kB/s): *'), 1, wxALIGN_CENTER)
dratesettingsSizer.Add(self.maxdownload_data, 1, wxALIGN_CENTER)
dratesettingsSizer.Add(StaticText('(0 = disabled)'), 1, wxALIGN_CENTER)
block4sizer.Add(dratesettingsSizer, 1, wxALIGN_CENTER_VERTICAL)
 
colsizer.Add(block4sizer, 0, wxALIGN_CENTER)
# colsizer.Add(StaticText(' '))
 
savesizer = wxGridSizer(cols = 4, hgap = 10)
saveButton = wxButton(panel, -1, 'Save')
# saveButton.SetFont(self.default_font)
savesizer.Add(saveButton, 0, wxALIGN_CENTER)
 
cancelButton = wxButton(panel, -1, 'Cancel')
# cancelButton.SetFont(self.default_font)
savesizer.Add(cancelButton, 0, wxALIGN_CENTER)
 
defaultsButton = wxButton(panel, -1, 'Revert to Defaults')
# defaultsButton.SetFont(self.default_font)
savesizer.Add(defaultsButton, 0, wxALIGN_CENTER)
 
advancedButton = wxButton(panel, -1, 'Advanced...')
# advancedButton.SetFont(self.default_font)
savesizer.Add(advancedButton, 0, wxALIGN_CENTER)
colsizer.Add(savesizer, 1, wxALIGN_CENTER)
 
resizewarningtext=StaticText('* These settings will not take effect until the next time you start BitTorrent', self.FONT-2)
colsizer.Add(resizewarningtext, 1, wxALIGN_CENTER)
 
border = wxBoxSizer(wxHORIZONTAL)
border.Add(colsizer, 1, wxEXPAND | wxALL, 4)
panel.SetSizer(border)
panel.SetAutoLayout(True)
 
self.advancedConfig = {}
 
def setDefaults(evt, self = self):
try:
self.minport_data.SetValue(self.defaults['minport'])
self.maxport_data.SetValue(self.defaults['maxport'])
self.randomport_checkbox.SetValue(self.defaults['random_port'])
self.gui_stretchwindow_checkbox.SetValue(self.defaults['gui_stretchwindow'])
self.gui_displaystats_checkbox.SetValue(self.defaults['gui_displaystats'])
self.gui_displaymiscstats_checkbox.SetValue(self.defaults['gui_displaymiscstats'])
self.security_checkbox.SetValue(self.defaults['security'])
self.autokick_checkbox.SetValue(self.defaults['auto_kick'])
self.buffering_checkbox.SetValue(self.defaults['buffer_reads'])
self.breakup_checkbox.SetValue(self.defaults['breakup_seed_bitfield'])
self.autoflush_checkbox.SetValue(self.defaults['auto_flush'])
if sys.version_info >= (2,3) and socket.has_ipv6:
self.ipv6enabled_checkbox.SetValue(self.defaults['ipv6_enabled'])
self.gui_forcegreenonfirewall_checkbox.SetValue(self.defaults['gui_forcegreenonfirewall'])
self.gui_font_data.SetValue(self.defaults['gui_font'])
self.gui_ratesettingsdefault_data.SetStringSelection(self.defaults['gui_ratesettingsdefault'])
self.maxdownload_data.SetValue(self.defaults['max_download_rate'])
self.gui_ratesettingsmode_data.SetStringSelection(self.defaults['gui_ratesettingsmode'])
self.gui_default_savedir_ctrl.SetValue(self.defaults['gui_default_savedir'])
self.gui_savemode_data.SetSelection(1-self.defaults['gui_saveas_ask'])
 
self.checkingcolor = HexToColor(self.defaults['gui_checkingcolor'])
self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, self.checkingcolor)
self.downloadcolor = HexToColor(self.defaults['gui_downloadcolor'])
self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, self.downloadcolor)
self.seedingcolor = HexToColor(self.defaults['gui_seedingcolor'])
self.setColorIcon(self.seedingcolor_icon, self.seedingcolor_iconptr, self.seedingcolor)
 
if (sys.platform == 'win32'):
self.win32_taskbar_icon_checkbox.SetValue(self.defaults['win32_taskbar_icon'])
# self.upnp_checkbox.SetValue(self.defaults['upnp_nat_access'])
self.upnp_data.SetSelection(self.defaults['upnp_nat_access'])
 
# reset advanced too
self.advancedConfig = {}
for key in ['ip', 'bind', 'min_peers', 'max_initiate', 'display_interval',
'alloc_type', 'alloc_rate', 'max_files_open', 'max_connections', 'super_seeder',
'ipv6_binds_v4', 'double_check', 'triple_check', 'lock_files', 'lock_while_reading',
'expire_cache_data']:
self.advancedConfig[key] = self.defaults[key]
self.CloseAdvanced()
except:
self.parent.exception()
 
 
def saveConfigs(evt, self = self):
try:
self.config['gui_stretchwindow']=int(self.gui_stretchwindow_checkbox.GetValue())
self.config['gui_displaystats']=int(self.gui_displaystats_checkbox.GetValue())
self.config['gui_displaymiscstats']=int(self.gui_displaymiscstats_checkbox.GetValue())
self.config['security']=int(self.security_checkbox.GetValue())
self.config['auto_kick']=int(self.autokick_checkbox.GetValue())
buffering=int(self.buffering_checkbox.GetValue())
self.config['buffer_reads']=buffering
if buffering:
self.config['write_buffer_size']=self.defaults['write_buffer_size']
else:
self.config['write_buffer_size']=0
self.config['breakup_seed_bitfield']=int(self.breakup_checkbox.GetValue())
if self.autoflush_checkbox.GetValue():
self.config['auto_flush']=5
else:
self.config['auto_flush']=0
if sys.version_info >= (2,3) and socket.has_ipv6:
self.config['ipv6_enabled']=int(self.ipv6enabled_checkbox.GetValue())
self.config['gui_forcegreenonfirewall']=int(self.gui_forcegreenonfirewall_checkbox.GetValue())
self.config['minport']=self.minport_data.GetValue()
self.config['maxport']=self.maxport_data.GetValue()
self.config['random_port']=int(self.randomport_checkbox.GetValue())
self.config['gui_font']=self.gui_font_data.GetValue()
self.config['gui_ratesettingsdefault']=self.gui_ratesettingsdefault_data.GetStringSelection()
self.config['max_download_rate']=self.maxdownload_data.GetValue()
self.config['gui_ratesettingsmode']=self.gui_ratesettingsmode_data.GetStringSelection()
self.config['gui_default_savedir']=self.gui_default_savedir_ctrl.GetValue()
self.config['gui_saveas_ask']=1-self.gui_savemode_data.GetSelection()
self.config['gui_checkingcolor']=ColorToHex(self.checkingcolor)
self.config['gui_downloadcolor']=ColorToHex(self.downloadcolor)
self.config['gui_seedingcolor']=ColorToHex(self.seedingcolor)
if (sys.platform == 'win32'):
self.config['win32_taskbar_icon']=int(self.win32_taskbar_icon_checkbox.GetValue())
# self.config['upnp_nat_access']=int(self.upnp_checkbox.GetValue())
self.config['upnp_nat_access']=self.upnp_data.GetSelection()
 
if self.advancedConfig:
for key,val in self.advancedConfig.items():
self.config[key] = val
 
self.writeConfigFile()
self._configReset = True
self.Close()
except:
self.parent.exception()
 
def cancelConfigs(evt, self = self):
self.Close()
 
def savepath_set(evt, self = self):
try:
d = self.gui_default_savedir_ctrl.GetValue()
if d == '':
d = self.config['last_saved']
dl = wxDirDialog(self.panel, 'Choose a default directory to save to',
d, style = wxDD_DEFAULT_STYLE | wxDD_NEW_DIR_BUTTON)
if dl.ShowModal() == wxID_OK:
self.gui_default_savedir_ctrl.SetValue(dl.GetPath())
except:
self.parent.exception()
 
def checkingcoloricon_set(evt, self = self):
try:
newcolor = self.getColorFromUser(self.panel,self.checkingcolor)
self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, newcolor)
self.checkingcolor = newcolor
except:
self.parent.exception()
 
def downloadcoloricon_set(evt, self = self):
try:
newcolor = self.getColorFromUser(self.panel,self.downloadcolor)
self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, newcolor)
self.downloadcolor = newcolor
except:
self.parent.exception()
 
def seedingcoloricon_set(evt, self = self):
try:
newcolor = self.getColorFromUser(self.panel,self.seedingcolor)
self.setColorIcon(self.seedingcolor_icon, self.seedingcolor_iconptr, newcolor)
self.seedingcolor = newcolor
except:
self.parent.exception()
EVT_BUTTON(self.configMenuBox, saveButton.GetId(), saveConfigs)
EVT_BUTTON(self.configMenuBox, cancelButton.GetId(), cancelConfigs)
EVT_BUTTON(self.configMenuBox, defaultsButton.GetId(), setDefaults)
EVT_BUTTON(self.configMenuBox, advancedButton.GetId(), self.advancedMenu)
EVT_BUTTON(self.configMenuBox, savepathButton.GetId(), savepath_set)
EVT_LEFT_DOWN(self.checkingcolor_iconptr, checkingcoloricon_set)
EVT_LEFT_DOWN(self.downloadcolor_iconptr, downloadcoloricon_set)
EVT_LEFT_DOWN(self.seedingcolor_iconptr, seedingcoloricon_set)
 
self.configMenuBox.Show ()
border.Fit(panel)
self.configMenuBox.Fit()
except:
self.parent.exception()
 
 
def Close(self):
self.CloseAdvanced()
if self.configMenuBox is not None:
try:
self.configMenuBox.Close ()
except wxPyDeadObjectError, e:
pass
self.configMenuBox = None
 
def advancedMenu(self, event = None):
try:
if not self.advancedConfig:
for key in ['ip', 'bind', 'min_peers', 'max_initiate', 'display_interval',
'alloc_type', 'alloc_rate', 'max_files_open', 'max_connections', 'super_seeder',
'ipv6_binds_v4', 'double_check', 'triple_check', 'lock_files', 'lock_while_reading',
'expire_cache_data']:
self.advancedConfig[key] = self.config[key]
 
if (self.advancedMenuBox is not None):
try:
self.advancedMenuBox.Close ()
except wxPyDeadObjectError, e:
self.advancedMenuBox = None
 
self.advancedMenuBox = wxFrame(None, -1, 'BitTorrent Advanced Preferences', size = (1,1),
style = wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE)
if (sys.platform == 'win32'):
self.advancedMenuBox.SetIcon(self.icon)
 
panel = wxPanel(self.advancedMenuBox, -1)
# self.panel = panel
 
def StaticText(text, font = self.FONT, underline = False, color = None, panel = panel):
x = wxStaticText(panel, -1, text, style = wxALIGN_LEFT)
x.SetFont(wxFont(font, wxDEFAULT, wxNORMAL, wxNORMAL, underline))
if color is not None:
x.SetForegroundColour(color)
return x
 
colsizer = wxFlexGridSizer(cols = 1, hgap = 13, vgap = 13)
warningtext = StaticText('CHANGE THESE SETTINGS AT YOUR OWN RISK', self.FONT+4, True, 'Red')
colsizer.Add(warningtext, 1, wxALIGN_CENTER)
 
self.ip_data = wxTextCtrl(parent = panel, id = -1,
value = self.advancedConfig['ip'],
size = (self.FONT*13, int(self.FONT*2.2)), style = wxTE_PROCESS_TAB)
self.ip_data.SetFont(self.default_font)
self.bind_data = wxTextCtrl(parent = panel, id = -1,
value = self.advancedConfig['bind'],
size = (self.FONT*13, int(self.FONT*2.2)), style = wxTE_PROCESS_TAB)
self.bind_data.SetFont(self.default_font)
if sys.version_info >= (2,3) and socket.has_ipv6:
self.ipv6bindsv4_data=wxChoice(panel, -1,
choices = ['separate sockets', 'single socket'])
self.ipv6bindsv4_data.SetFont(self.default_font)
self.ipv6bindsv4_data.SetSelection(self.advancedConfig['ipv6_binds_v4'])
 
self.minpeers_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
self.minpeers_data.SetFont(self.default_font)
self.minpeers_data.SetRange(10,100)
self.minpeers_data.SetValue(self.advancedConfig['min_peers'])
# max_initiate = 2*minpeers
 
self.displayinterval_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
self.displayinterval_data.SetFont(self.default_font)
self.displayinterval_data.SetRange(100,2000)
self.displayinterval_data.SetValue(int(self.advancedConfig['display_interval']*1000))
 
self.alloctype_data=wxChoice(panel, -1,
choices = ['normal', 'background', 'pre-allocate', 'sparse'])
self.alloctype_data.SetFont(self.default_font)
self.alloctype_data.SetStringSelection(self.advancedConfig['alloc_type'])
 
self.allocrate_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7,-1))
self.allocrate_data.SetFont(self.default_font)
self.allocrate_data.SetRange(1,100)
self.allocrate_data.SetValue(int(self.advancedConfig['alloc_rate']))
 
self.locking_data=wxChoice(panel, -1,
choices = ['no locking', 'lock while writing', 'lock always'])
self.locking_data.SetFont(self.default_font)
if self.advancedConfig['lock_files']:
if self.advancedConfig['lock_while_reading']:
self.locking_data.SetSelection(2)
else:
self.locking_data.SetSelection(1)
else:
self.locking_data.SetSelection(0)
 
self.doublecheck_data=wxChoice(panel, -1,
choices = ['no extra checking', 'double-check', 'triple-check'])
self.doublecheck_data.SetFont(self.default_font)
if self.advancedConfig['double_check']:
if self.advancedConfig['triple_check']:
self.doublecheck_data.SetSelection(2)
else:
self.doublecheck_data.SetSelection(1)
else:
self.doublecheck_data.SetSelection(0)
 
self.maxfilesopen_choices = ['50', '100', '200', 'no limit ']
self.maxfilesopen_data=wxChoice(panel, -1, choices = self.maxfilesopen_choices)
self.maxfilesopen_data.SetFont(self.default_font)
setval = self.advancedConfig['max_files_open']
if setval == 0:
setval = 'no limit '
else:
setval = str(setval)
if not setval in self.maxfilesopen_choices:
setval = self.maxfilesopen_choices[0]
self.maxfilesopen_data.SetStringSelection(setval)
 
self.maxconnections_choices = ['no limit ', '20', '30', '40', '50', '60', '100', '200']
self.maxconnections_data=wxChoice(panel, -1, choices = self.maxconnections_choices)
self.maxconnections_data.SetFont(self.default_font)
setval = self.advancedConfig['max_connections']
if setval == 0:
setval = 'no limit '
else:
setval = str(setval)
if not setval in self.maxconnections_choices:
setval = self.maxconnections_choices[0]
self.maxconnections_data.SetStringSelection(setval)
 
self.superseeder_data=wxChoice(panel, -1,
choices = ['normal', 'super-seed'])
self.superseeder_data.SetFont(self.default_font)
self.superseeder_data.SetSelection(self.advancedConfig['super_seeder'])
 
self.expirecache_choices = ['never ', '3', '5', '7', '10', '15', '30', '60', '90']
self.expirecache_data=wxChoice(panel, -1, choices = self.expirecache_choices)
setval = self.advancedConfig['expire_cache_data']
if setval == 0:
setval = 'never '
else:
setval = str(setval)
if not setval in self.expirecache_choices:
setval = self.expirecache_choices[0]
self.expirecache_data.SetFont(self.default_font)
self.expirecache_data.SetStringSelection(setval)
 
twocolsizer = wxFlexGridSizer(cols = 2, hgap = 20)
datasizer = wxFlexGridSizer(cols = 2, vgap = 2)
datasizer.Add(StaticText('Local IP: '), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.ip_data)
datasizer.Add(StaticText('IP to bind to: '), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.bind_data)
if sys.version_info >= (2,3) and socket.has_ipv6:
datasizer.Add(StaticText('IPv6 socket handling: '), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.ipv6bindsv4_data)
datasizer.Add(StaticText('Minimum number of peers: '), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.minpeers_data)
datasizer.Add(StaticText('Display interval (ms): '), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.displayinterval_data)
datasizer.Add(StaticText('Disk allocation type:'), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.alloctype_data)
datasizer.Add(StaticText('Allocation rate (MiB/s):'), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.allocrate_data)
datasizer.Add(StaticText('File locking:'), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.locking_data)
datasizer.Add(StaticText('Extra data checking:'), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.doublecheck_data)
datasizer.Add(StaticText('Max files open:'), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.maxfilesopen_data)
datasizer.Add(StaticText('Max peer connections:'), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.maxconnections_data)
datasizer.Add(StaticText('Default seeding mode:'), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.superseeder_data)
datasizer.Add(StaticText('Expire resume data(days):'), 1, wxALIGN_CENTER_VERTICAL)
datasizer.Add(self.expirecache_data)
twocolsizer.Add(datasizer)
 
infosizer = wxFlexGridSizer(cols = 1)
self.hinttext = StaticText('', self.FONT, False, 'Blue')
infosizer.Add(self.hinttext, 1, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL)
infosizer.SetMinSize((180,100))
twocolsizer.Add(infosizer, 1, wxEXPAND)
 
colsizer.Add(twocolsizer)
 
savesizer = wxGridSizer(cols = 3, hgap = 20)
okButton = wxButton(panel, -1, 'OK')
# okButton.SetFont(self.default_font)
savesizer.Add(okButton, 0, wxALIGN_CENTER)
 
cancelButton = wxButton(panel, -1, 'Cancel')
# cancelButton.SetFont(self.default_font)
savesizer.Add(cancelButton, 0, wxALIGN_CENTER)
 
defaultsButton = wxButton(panel, -1, 'Revert to Defaults')
# defaultsButton.SetFont(self.default_font)
savesizer.Add(defaultsButton, 0, wxALIGN_CENTER)
colsizer.Add(savesizer, 1, wxALIGN_CENTER)
 
resizewarningtext=StaticText('None of these settings will take effect until the next time you start BitTorrent', self.FONT-2)
colsizer.Add(resizewarningtext, 1, wxALIGN_CENTER)
 
border = wxBoxSizer(wxHORIZONTAL)
border.Add(colsizer, 1, wxEXPAND | wxALL, 4)
panel.SetSizer(border)
panel.SetAutoLayout(True)
 
def setDefaults(evt, self = self):
try:
self.ip_data.SetValue(self.defaults['ip'])
self.bind_data.SetValue(self.defaults['bind'])
if sys.version_info >= (2,3) and socket.has_ipv6:
self.ipv6bindsv4_data.SetSelection(self.defaults['ipv6_binds_v4'])
self.minpeers_data.SetValue(self.defaults['min_peers'])
self.displayinterval_data.SetValue(int(self.defaults['display_interval']*1000))
self.alloctype_data.SetStringSelection(self.defaults['alloc_type'])
self.allocrate_data.SetValue(int(self.defaults['alloc_rate']))
if self.defaults['lock_files']:
if self.defaults['lock_while_reading']:
self.locking_data.SetSelection(2)
else:
self.locking_data.SetSelection(1)
else:
self.locking_data.SetSelection(0)
if self.defaults['double_check']:
if self.defaults['triple_check']:
self.doublecheck_data.SetSelection(2)
else:
self.doublecheck_data.SetSelection(1)
else:
self.doublecheck_data.SetSelection(0)
setval = self.defaults['max_files_open']
if setval == 0:
setval = 'no limit '
else:
setval = str(setval)
if not setval in self.maxfilesopen_choices:
setval = self.maxfilesopen_choices[0]
self.maxfilesopen_data.SetStringSelection(setval)
setval = self.defaults['max_connections']
if setval == 0:
setval = 'no limit '
else:
setval = str(setval)
if not setval in self.maxconnections_choices:
setval = self.maxconnections_choices[0]
self.maxconnections_data.SetStringSelection(setval)
self.superseeder_data.SetSelection(int(self.defaults['super_seeder']))
setval = self.defaults['expire_cache_data']
if setval == 0:
setval = 'never '
else:
setval = str(setval)
if not setval in self.expirecache_choices:
setval = self.expirecache_choices[0]
self.expirecache_data.SetStringSelection(setval)
except:
self.parent.exception()
 
def saveConfigs(evt, self = self):
try:
self.advancedConfig['ip'] = self.ip_data.GetValue()
self.advancedConfig['bind'] = self.bind_data.GetValue()
if sys.version_info >= (2,3) and socket.has_ipv6:
self.advancedConfig['ipv6_binds_v4'] = self.ipv6bindsv4_data.GetSelection()
self.advancedConfig['min_peers'] = self.minpeers_data.GetValue()
self.advancedConfig['display_interval'] = float(self.displayinterval_data.GetValue())/1000
self.advancedConfig['alloc_type'] = self.alloctype_data.GetStringSelection()
self.advancedConfig['alloc_rate'] = float(self.allocrate_data.GetValue())
self.advancedConfig['lock_files'] = int(self.locking_data.GetSelection() >= 1)
self.advancedConfig['lock_while_reading'] = int(self.locking_data.GetSelection() > 1)
self.advancedConfig['double_check'] = int(self.doublecheck_data.GetSelection() >= 1)
self.advancedConfig['triple_check'] = int(self.doublecheck_data.GetSelection() > 1)
try:
self.advancedConfig['max_files_open'] = int(self.maxfilesopen_data.GetStringSelection())
except: # if it ain't a number, it must be "no limit"
self.advancedConfig['max_files_open'] = 0
try:
self.advancedConfig['max_connections'] = int(self.maxconnections_data.GetStringSelection())
self.advancedConfig['max_initiate'] = min(
2*self.advancedConfig['min_peers'], self.advancedConfig['max_connections'])
except: # if it ain't a number, it must be "no limit"
self.advancedConfig['max_connections'] = 0
self.advancedConfig['max_initiate'] = 2*self.advancedConfig['min_peers']
self.advancedConfig['super_seeder']=int(self.superseeder_data.GetSelection())
try:
self.advancedConfig['expire_cache_data'] = int(self.expirecache_data.GetStringSelection())
except:
self.advancedConfig['expire_cache_data'] = 0
self.advancedMenuBox.Close()
except:
self.parent.exception()
 
def cancelConfigs(evt, self = self):
self.advancedMenuBox.Close()
 
def ip_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\nThe IP reported to the tracker.\n' +
'unless the tracker is on the\n' +
'same intranet as this client,\n' +
'the tracker will autodetect the\n' +
"client's IP and ignore this\n" +
"value.")
 
def bind_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\nThe IP the client will bind to.\n' +
'Only useful if your machine is\n' +
'directly handling multiple IPs.\n' +
"If you don't know what this is,\n" +
"leave it blank.")
 
def ipv6bindsv4_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\nCertain operating systems will\n' +
'open IPv4 protocol connections on\n' +
'an IPv6 socket; others require you\n' +
"to open two sockets on the same\n" +
"port, one IPv4 and one IPv6.")
 
def minpeers_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\nThe minimum number of peers the\n' +
'client tries to stay connected\n' +
'with. Do not set this higher\n' +
'unless you have a very fast\n' +
"connection and a lot of system\n" +
"resources.")
 
def displayinterval_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\nHow often to update the\n' +
'graphical display, in 1/1000s\n' +
'of a second. Setting this too low\n' +
"will strain your computer's\n" +
"processor and video access.")
 
def alloctype_hint(evt, self = self):
self.hinttext.SetLabel('\n\nHow to allocate disk space.\n' +
'normal allocates space as data is\n' +
'received, background also adds\n' +
"space in the background, pre-\n" +
"allocate reserves up front, and\n" +
'sparse is only for filesystems\n' +
'that support it by default.')
 
def allocrate_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\nAt what rate to allocate disk\n' +
'space when allocating in the\n' +
'background. Set this too high on a\n' +
"slow filesystem and your download\n" +
"will slow to a crawl.")
 
def locking_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\n\nFile locking prevents other\n' +
'programs (including other instances\n' +
'of BitTorrent) from accessing files\n' +
"you are downloading.")
 
def doublecheck_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\nHow much extra checking to do\n' +
'making sure no data is corrupted.\n' +
'Double-check mode uses more CPU,\n' +
"while triple-check mode increases\n" +
"disk accesses.")
 
def maxfilesopen_hint(evt, self = self):
self.hinttext.SetLabel('\n\n\nThe maximum number of files to\n' +
'keep open at the same time. Zero\n' +
'means no limit. Please note that\n' +
"if this option is in effect,\n" +
"files are not guaranteed to be\n" +
"locked.")
 
def maxconnections_hint(evt, self = self):
self.hinttext.SetLabel('\n\nSome operating systems, most\n' +
'notably Windows 9x/ME combined\n' +
'with certain network drivers,\n' +
"cannot handle more than a certain\n" +
"number of open ports. If the\n" +
"client freezes, try setting this\n" +
"to 60 or below.")
 
def superseeder_hint(evt, self = self):
self.hinttext.SetLabel('\n\nThe "super-seed" method allows\n' +
'a single source to more efficiently\n' +
'seed a large torrent, but is not\n' +
"necessary in a well-seeded torrent,\n" +
"and causes problems with statistics.\n" +
"Unless you routinely seed torrents\n" +
"you can enable this by selecting\n" +
'"SUPER-SEED" for connection type.\n' +
'(once enabled it does not turn off.)')
 
def expirecache_hint(evt, self = self):
self.hinttext.SetLabel('\n\nThe client stores temporary data\n' +
'in order to handle downloading only\n' +
'specific files from the torrent and\n' +
"so it can resume downloads more\n" +
"quickly. This sets how long the\n" +
"client will keep this data before\n" +
"deleting it to free disk space.")
 
EVT_BUTTON(self.advancedMenuBox, okButton.GetId(), saveConfigs)
EVT_BUTTON(self.advancedMenuBox, cancelButton.GetId(), cancelConfigs)
EVT_BUTTON(self.advancedMenuBox, defaultsButton.GetId(), setDefaults)
EVT_ENTER_WINDOW(self.ip_data, ip_hint)
EVT_ENTER_WINDOW(self.bind_data, bind_hint)
if sys.version_info >= (2,3) and socket.has_ipv6:
EVT_ENTER_WINDOW(self.ipv6bindsv4_data, ipv6bindsv4_hint)
EVT_ENTER_WINDOW(self.minpeers_data, minpeers_hint)
EVT_ENTER_WINDOW(self.displayinterval_data, displayinterval_hint)
EVT_ENTER_WINDOW(self.alloctype_data, alloctype_hint)
EVT_ENTER_WINDOW(self.allocrate_data, allocrate_hint)
EVT_ENTER_WINDOW(self.locking_data, locking_hint)
EVT_ENTER_WINDOW(self.doublecheck_data, doublecheck_hint)
EVT_ENTER_WINDOW(self.maxfilesopen_data, maxfilesopen_hint)
EVT_ENTER_WINDOW(self.maxconnections_data, maxconnections_hint)
EVT_ENTER_WINDOW(self.superseeder_data, superseeder_hint)
EVT_ENTER_WINDOW(self.expirecache_data, expirecache_hint)
 
self.advancedMenuBox.Show ()
border.Fit(panel)
self.advancedMenuBox.Fit()
except:
self.parent.exception()
 
 
def CloseAdvanced(self):
if self.advancedMenuBox is not None:
try:
self.advancedMenuBox.Close()
except wxPyDeadObjectError, e:
self.advancedMenuBox = None
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/ConnChoice.py
0,0 → 1,31
connChoices=(
{'name':'automatic',
'rate':{'min':0, 'max':5000, 'def': 0},
'conn':{'min':0, 'max':100, 'def': 0},
'automatic':1},
{'name':'unlimited',
'rate':{'min':0, 'max':5000, 'def': 0, 'div': 50},
'conn':{'min':4, 'max':100, 'def': 4}},
{'name':'dialup/isdn',
'rate':{'min':3, 'max': 8, 'def': 5},
'conn':{'min':2, 'max': 3, 'def': 2},
'initiate': 12},
{'name':'dsl/cable slow',
'rate':{'min':10, 'max': 48, 'def': 13},
'conn':{'min':4, 'max': 20, 'def': 4}},
{'name':'dsl/cable fast',
'rate':{'min':20, 'max': 100, 'def': 40},
'conn':{'min':4, 'max': 30, 'def': 6}},
{'name':'T1',
'rate':{'min':100, 'max': 300, 'def':150},
'conn':{'min':4, 'max': 40, 'def':10}},
{'name':'T3+',
'rate':{'min':400, 'max':2000, 'def':500},
'conn':{'min':4, 'max':100, 'def':20}},
{'name':'seeder',
'rate':{'min':0, 'max':5000, 'def':0, 'div': 50},
'conn':{'min':1, 'max':100, 'def':1}},
{'name':'SUPER-SEED', 'super-seed':1}
)
 
connChoiceList = map(lambda x:x['name'], connChoices)
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CreateIcons.py
0,0 → 1,105
# Generated from bt_MakeCreateIcons - 05/10/04 22:15:33
# T-0.3.0 (BitTornado)
 
from binascii import a2b_base64
from zlib import decompress
from os.path import join
 
icons = {
"icon_bt.ico":
"eJyt1K+OFEEQx/FaQTh5GDRZhSQpiUHwCrxCBYXFrjyJLXeXEARPsZqUPMm+" +
"AlmP+PGtngoLDji69zMz2zt/qqtr1mxHv7621d4+MnvK/jl66Bl2drV+e7Wz" +
"S/v12A7rY4fDtuvOwfF4tOPXo52/fLLz+WwpWd6nqRXHKXux39sTrtnjNd7g" +
"PW7wGSd860f880kffjvJ2QYS1Zcw4AjcoaA5yRFIFDQXOgKJguZmjkCioB4T" +
"Y2CqxpTXA7sHEgVNEC8RSBQ0gfk7xtknCupgk3EEEgXlNgFHIFHQTMoRSBQ0" +
"E+1ouicKmsk7AomCJiGOQKKgSZIjkChoEucIJAqaZDoCiYImwb4iydULmqQ7" +
"AomC1kLcEQ/jSBQ0i+MIJAqaBXMEElVdi9siOgKJgmZhfWWlVjTddXW/FtsR" +
"SBQ0BeAIJAqaonAEEgVNoTgCiYKmeByBREHaqiVWRtSRrAJzBBIFTdE5AomC" +
"phBPpxPP57dVkDfrTl063nUVnWe383fZx9tb3uN+o7U+BLDtuvcQm8d/27Y/" +
"jO3o5/ay+YPv/+f6y30e1OyB7QcsGWFj",
"icon_done.ico":
"eJyt1K2OVEEQhuEaQbJyMWgyCklSEoPgFvYWKigsduRKbLndhCC4itGk5Erm" +
"Fsh4xMdbfSoMOGDpnuf89Jyf6uqaMdvRr69ttbdPzJ6xf4Eeeo6dXa3vXu/s" +
"0n49tsP62OGw7bpzcDwe7fj1aOcvn+x8PltKlg9pasVxyl7u9/aUe/Z4gxu8" +
"xy0+44Rv/Yp/vujDbxc520Ci+hYGHIF7FDQXOQKJguZGRyBR0DzMEUgU1GNi" +
"DEzVmPJ6YfdAoqAJ4hUCiYImMH/HOPtEQR1sMo5AoqDcJuAIJAqaSTkCiYJm" +
"oh1N90RBM3lHIFHQJMQRSBQ0SXIEEgVN4hyBREGTTEcgUdAk2FckuXpBk3RH" +
"IFHQWoh74mEciYJmcRyBREGzYI5AoqprcVtERyBR0Cysr6zUiqa7rh7WYjsC" +
"iYKmAByBREFTFI5AoqApFEcgUdAUjyOQKEhbtcTKiDqSVWCOQKKgKTpHIFHQ" +
"FOLpdOL9fLcK8nY9qUvHu66i8+x2/i77eHfH77h/0VofAth23Xuoz/+2bX8Y" +
"29HP7WXzB+f/5/7Lcx7V7JHtB9dPG3I=",
"black.ico":
"eJzt1zsOgkAYReFLLCztjJ2UlpLY485kOS7DpbgESwqTcQZDghjxZwAfyfl0" +
"LIieGzUWSom/pan840rHnbSUtPHHX9Je9+tAh2ybNe8TZZ/vk8ajJ4zl6JVJ" +
"+xFx+0R03Djx1/2B8bcT9L/bt0+4Wq+4se8e/VTfMvGqb4n3nYiIGz+lvt9s" +
"9EpE2T4xJN4xNFYWU6t+JWXuXDFzTom7SodSyi/S+iwtwjlJ80KaNY/C34rW" +
"aT8nvK5uhF7ohn7Yqfb87kffLAAAAAAAAAAAAAAAAAAAGMUNy7dADg==",
"blue.ico":
"eJzt10EOwUAYhuGv6cLSTux06QD2dTM9jmM4iiNYdiEZ81cIFTWddtDkfbQW" +
"De8XogtS5h9FIf+81H4jLSSt/ekvaavrdaCDez4SZV+PpPHoicBy9ErSfkQ8" +
"fCI6Hjgx6f7A+McJ+r/t95i46xMP7bf8Uz9o4k0/XMT338voP5shK0MkjXcM" +
"YSqam6Qunatyf7Nk7iztaqk8SaujNLfzIM0qKX88ZX8rWmf7Nfa+W8N61rW+" +
"7TR7fverHxYAAAAAAAAAAAAAAAAAAIziApVZ444=",
"green.ico":
"eJzt1zEOgjAAheFHGBzdjJuMHsAdbybxNB7Do3gERwaT2mJIBCOWlqok/yc4" +
"EP1fNDIoZfZRFLLPa5120krS1p72kvZ6XAeGHLtHouzrkTQePOFZDl5J2g+I" +
"+08Exz0nZt2PjH+coP/bvveEaY2L+/VN13/1PSbe9v0FfP+jTP6ziVmJkTQ+" +
"MISZaO6SujSmyu3dkpmbdKil8iptLtLSnWdpUUn58yn3t6J39l/j3tc2XM91" +
"Xd/tNHt296sfFgAAAAAAAAAAAAAAAAAATOIOVLEoDg==",
"red.ico":
"eJzt10EOwUAYhuGv6cLSTux06QD2dTOO4xiO4giWXUjG/BVCRTuddtDkfbQW" +
"De8XogtS5h9FIf+81GEjLSSt/ekvaavbdaCVez0SZd+PpPHoicBy9ErSfkQ8" +
"fCI6Hjgx6f7AeOcE/d/2QyceesaD+g1/1u+e+NwPF/H99zL6z2bIyhBJ4y1D" +
"mIb6LqlK5/a5v1syd5F2lVSepdVJmtt5lGZ7KX8+ZX8rGmfzNfa+e8N61rW+" +
"7dR7fverHxYAAAAAAAAAAAAAAAAAAIziCpgs444=",
"white.ico":
"eJzt1zsOgkAYReFLKCztjJ2ULsAed6bLcRnuwYTaJVhSmIwzGBLEiD8D+EjO" +
"p2NB9NyosVBK/C3L5B+XOmykhaS1P/6StrpfBzoUp6J5nyj7fJ80Hj1hLEev" +
"TNqPiNsnouPGib/uD4y/naD/3b59wtV6xY199+in+paJV31LvO9ERNz4KfX9" +
"ZqNXIsr2iSHxjqGxspha9Sspc+f2qXNK3FXalVJ+kVZnaR7OUZrtpbR5FP5W" +
"tE77OeF1dSP0Qjf0w06153c/+mYBAAAAAAAAAAAAAAAAAMAobj//I7s=",
"yellow.ico":
"eJzt1zsOgkAYReFLKCztjJ2ULsAedybLcRkuxSVYUpiM82M0ihGHgVFJzidY" +
"ED03vgqlzN+KQv5+qf1GWkha+9Nf0lbX60AX556ORNnXI2k8eiKwHL2StB8R" +
"D5+IjgdOTLo/MP5xgv5v+8ETd/3iYf2W/+oHTLzth4t4/3sZ/WszZGWIpPGO" +
"IUxE8yupS+eq3H9smTtLu1oqT9LqKM3tPEizSsofT9nfitbZfow979awnnWt" +
"bzvNnt/96osFAAAAAAAAAAAAAAAAAACjuABhjmIs",
"black1.ico":
"eJzt0zEOgkAUANEhFpZSGTstTWzkVt5Cj8ZROAIHMNGPWBCFDYgxMZkHn2Iz" +
"G5YCyOLKc+K54XSANbCPiSV2tOt/qjgW3XtSnN41FH/Qv29Jx/P7qefp7W8P" +
"4z85HQ+9JRG/7BpTft31DPUKyiVcFjEZzQ/TTtdzrWnKmCr6evv780qSJEmS" +
"JEmSJEmSJEmSpPnunVFDcA==",
"green1.ico":
"eJzt0zEKwkAQRuEXLCyTSuy0DHgxb6F4shzFI+QAgpkkFoombowIwvt2Z4vh" +
"X5gtFrJYRUGca/Y7WAFlVLTY0vf/1elxTwqP3xoKf5B/vjIenp+fOs+r/LWT" +
"/uQ34aGpUqQnv+1ygDqHagnHRVRG+2H6unfrtZkq6hz5evP7eSVJkiRJkiRJ" +
"kiRJkiRJ0nwNoWQ+AA==",
"yellow1.ico":
"eJzt0zEKwkAQRuEXLCxNJXZaCl7MW8Sj5SgeIQcQ4oS1UDTJxkhAeN/ubDH8" +
"C7PFQhGrLIlzx/kEW+AYFS0OpP6/atuXPSk8fKsv/EX+/cpweH5+6jyf8kn+" +
"k0fCfVPlyE/+2q2CZgP1Gi6rqILuw6R69uh1mTrqGvlmv/y8kiRJkiRJkiRJ" +
"kiRJkiRpvjsp9L8k",
"alloc.gif":
"eJxz93SzsEw0YRBh+M4ABi0MS3ue///P8H8UjIIRBhR/sjAyMDAx6IAyAihP" +
"MHAcYWDlkPHYsOBgM4ewVsyJDQsPNzEoebF8CHjo0smjH3dmRsDjI33C7Dw3" +
"MiYuOtjNyDShRSNwyemJguJJKhaGS32nGka61Vg2NJyYKRd+bY+nwtMzjbqV" +
"Qh84gxMCJgnlL4vJuqJyaa5NfFLNLsNVV2a7syacfVWkHd4bv7RN1ltM7ejm" +
"tMtNZ19Oyb02p8C3aqr3dr2GbXl/7fZyOej5rW653WZ7MzzHZV+v7O2/EZM+" +
"Pt45kbX6ScWHNWfOilo3n5thucXv8org1XF3DRQYrAEWiVY3"
}
 
def GetIcons():
return icons.keys()
 
def CreateIcon(icon, savedir):
try:
f = open(join(savedir,icon),"wb")
f.write(decompress(a2b_base64(icons[icon])))
success = 1
except:
success = 0
try:
f.close()
except:
pass
return success
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/CurrentRateMeasure.py
0,0 → 1,37
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from clock import clock
 
class Measure:
def __init__(self, max_rate_period, fudge = 1):
self.max_rate_period = max_rate_period
self.ratesince = clock() - fudge
self.last = self.ratesince
self.rate = 0.0
self.total = 0l
 
def update_rate(self, amount):
self.total += amount
t = clock()
self.rate = (self.rate * (self.last - self.ratesince) +
amount) / (t - self.ratesince + 0.0001)
self.last = t
if self.ratesince < t - self.max_rate_period:
self.ratesince = t - self.max_rate_period
 
def get_rate(self):
self.update_rate(0)
return self.rate
 
def get_rate_noupdate(self):
return self.rate
 
def time_until_rate(self, newrate):
if self.rate <= newrate:
return 0
t = clock() - self.ratesince
return ((self.rate * t) / newrate) - t
 
def get_total(self):
return self.total
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/HTTPHandler.py
0,0 → 1,167
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from cStringIO import StringIO
from sys import stdout
import time
from clock import clock
from gzip import GzipFile
try:
True
except:
True = 1
False = 0
 
DEBUG = False
 
weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
 
months = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
 
class HTTPConnection:
def __init__(self, handler, connection):
self.handler = handler
self.connection = connection
self.buf = ''
self.closed = False
self.done = False
self.donereading = False
self.next_func = self.read_type
 
def get_ip(self):
return self.connection.get_ip()
 
def data_came_in(self, data):
if self.donereading or self.next_func is None:
return True
self.buf += data
while True:
try:
i = self.buf.index('\n')
except ValueError:
return True
val = self.buf[:i]
self.buf = self.buf[i+1:]
self.next_func = self.next_func(val)
if self.donereading:
return True
if self.next_func is None or self.closed:
return False
 
def read_type(self, data):
self.header = data.strip()
words = data.split()
if len(words) == 3:
self.command, self.path, garbage = words
self.pre1 = False
elif len(words) == 2:
self.command, self.path = words
self.pre1 = True
if self.command != 'GET':
return None
else:
return None
if self.command not in ('HEAD', 'GET'):
return None
self.headers = {}
return self.read_header
 
def read_header(self, data):
data = data.strip()
if data == '':
self.donereading = True
if self.headers.get('accept-encoding','').find('gzip') > -1:
self.encoding = 'gzip'
else:
self.encoding = 'identity'
r = self.handler.getfunc(self, self.path, self.headers)
if r is not None:
self.answer(r)
return None
try:
i = data.index(':')
except ValueError:
return None
self.headers[data[:i].strip().lower()] = data[i+1:].strip()
if DEBUG:
print data[:i].strip() + ": " + data[i+1:].strip()
return self.read_header
 
def answer(self, (responsecode, responsestring, headers, data)):
if self.closed:
return
if self.encoding == 'gzip':
compressed = StringIO()
gz = GzipFile(fileobj = compressed, mode = 'wb', compresslevel = 9)
gz.write(data)
gz.close()
cdata = compressed.getvalue()
if len(cdata) >= len(data):
self.encoding = 'identity'
else:
if DEBUG:
print "Compressed: %i Uncompressed: %i\n" % (len(cdata),len(data))
data = cdata
headers['Content-Encoding'] = 'gzip'
 
# i'm abusing the identd field here, but this should be ok
if self.encoding == 'identity':
ident = '-'
else:
ident = self.encoding
self.handler.log( self.connection.get_ip(), ident, '-',
self.header, responsecode, len(data),
self.headers.get('referer','-'),
self.headers.get('user-agent','-') )
self.done = True
r = StringIO()
r.write('HTTP/1.0 ' + str(responsecode) + ' ' +
responsestring + '\r\n')
if not self.pre1:
headers['Content-Length'] = len(data)
for key, value in headers.items():
r.write(key + ': ' + str(value) + '\r\n')
r.write('\r\n')
if self.command != 'HEAD':
r.write(data)
self.connection.write(r.getvalue())
if self.connection.is_flushed():
self.connection.shutdown(1)
 
class HTTPHandler:
def __init__(self, getfunc, minflush):
self.connections = {}
self.getfunc = getfunc
self.minflush = minflush
self.lastflush = clock()
 
def external_connection_made(self, connection):
self.connections[connection] = HTTPConnection(self, connection)
 
def connection_flushed(self, connection):
if self.connections[connection].done:
connection.shutdown(1)
 
def connection_lost(self, connection):
ec = self.connections[connection]
ec.closed = True
del ec.connection
del ec.next_func
del self.connections[connection]
 
def data_came_in(self, connection, data):
c = self.connections[connection]
if not c.data_came_in(data) and not c.closed:
c.connection.shutdown(1)
 
def log(self, ip, ident, username, header,
responsecode, length, referrer, useragent):
year, month, day, hour, minute, second, a, b, c = time.localtime(time.time())
print '%s %s %s [%02d/%3s/%04d:%02d:%02d:%02d] "%s" %i %i "%s" "%s"' % (
ip, ident, username, day, months[month], year, hour,
minute, second, header, responsecode, length, referrer, useragent)
t = clock()
if t - self.lastflush > self.minflush:
self.lastflush = t
stdout.flush()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/PSYCO.py
0,0 → 1,5
# edit this file to enable/disable Psyco
# psyco = 1 -- enabled
# psyco = 0 -- disabled
 
psyco = 0
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/RateLimiter.py
0,0 → 1,153
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from traceback import print_exc
from binascii import b2a_hex
from clock import clock
from CurrentRateMeasure import Measure
from cStringIO import StringIO
from math import sqrt
 
try:
True
except:
True = 1
False = 0
try:
sum([1])
except:
sum = lambda a: reduce(lambda x,y: x+y, a, 0)
 
DEBUG = False
 
MAX_RATE_PERIOD = 20.0
MAX_RATE = 10e10
PING_BOUNDARY = 1.2
PING_SAMPLES = 7
PING_DISCARDS = 1
PING_THRESHHOLD = 5
PING_DELAY = 5 # cycles 'til first upward adjustment
PING_DELAY_NEXT = 2 # 'til next
ADJUST_UP = 1.05
ADJUST_DOWN = 0.95
UP_DELAY_FIRST = 5
UP_DELAY_NEXT = 2
SLOTS_STARTING = 6
SLOTS_FACTOR = 1.66/1000
 
class RateLimiter:
def __init__(self, sched, unitsize, slotsfunc = lambda x: None):
self.sched = sched
self.last = None
self.unitsize = unitsize
self.slotsfunc = slotsfunc
self.measure = Measure(MAX_RATE_PERIOD)
self.autoadjust = False
self.upload_rate = MAX_RATE * 1000
self.slots = SLOTS_STARTING # garbage if not automatic
 
def set_upload_rate(self, rate):
# rate = -1 # test automatic
if rate < 0:
if self.autoadjust:
return
self.autoadjust = True
self.autoadjustup = 0
self.pings = []
rate = MAX_RATE
self.slots = SLOTS_STARTING
self.slotsfunc(self.slots)
else:
self.autoadjust = False
if not rate:
rate = MAX_RATE
self.upload_rate = rate * 1000
self.lasttime = clock()
self.bytes_sent = 0
 
def queue(self, conn):
assert conn.next_upload is None
if self.last is None:
self.last = conn
conn.next_upload = conn
self.try_send(True)
else:
conn.next_upload = self.last.next_upload
self.last.next_upload = conn
self.last = conn
 
def try_send(self, check_time = False):
t = clock()
self.bytes_sent -= (t - self.lasttime) * self.upload_rate
self.lasttime = t
if check_time:
self.bytes_sent = max(self.bytes_sent, 0)
cur = self.last.next_upload
while self.bytes_sent <= 0:
bytes = cur.send_partial(self.unitsize)
self.bytes_sent += bytes
self.measure.update_rate(bytes)
if bytes == 0 or cur.backlogged():
if self.last is cur:
self.last = None
cur.next_upload = None
break
else:
self.last.next_upload = cur.next_upload
cur.next_upload = None
cur = self.last.next_upload
else:
self.last = cur
cur = cur.next_upload
else:
self.sched(self.try_send, self.bytes_sent / self.upload_rate)
 
def adjust_sent(self, bytes):
self.bytes_sent = min(self.bytes_sent+bytes, self.upload_rate*3)
self.measure.update_rate(bytes)
 
 
def ping(self, delay):
if DEBUG:
print delay
if not self.autoadjust:
return
self.pings.append(delay > PING_BOUNDARY)
if len(self.pings) < PING_SAMPLES+PING_DISCARDS:
return
if DEBUG:
print 'cycle'
pings = sum(self.pings[PING_DISCARDS:])
del self.pings[:]
if pings >= PING_THRESHHOLD: # assume flooded
if self.upload_rate == MAX_RATE:
self.upload_rate = self.measure.get_rate()*ADJUST_DOWN
else:
self.upload_rate = min(self.upload_rate,
self.measure.get_rate()*1.1)
self.upload_rate = max(int(self.upload_rate*ADJUST_DOWN),2)
self.slots = int(sqrt(self.upload_rate*SLOTS_FACTOR))
self.slotsfunc(self.slots)
if DEBUG:
print 'adjust down to '+str(self.upload_rate)
self.lasttime = clock()
self.bytes_sent = 0
self.autoadjustup = UP_DELAY_FIRST
else: # not flooded
if self.upload_rate == MAX_RATE:
return
self.autoadjustup -= 1
if self.autoadjustup:
return
self.upload_rate = int(self.upload_rate*ADJUST_UP)
self.slots = int(sqrt(self.upload_rate*SLOTS_FACTOR))
self.slotsfunc(self.slots)
if DEBUG:
print 'adjust up to '+str(self.upload_rate)
self.lasttime = clock()
self.bytes_sent = 0
self.autoadjustup = UP_DELAY_NEXT
 
 
 
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/RateMeasure.py
0,0 → 1,70
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from clock import clock
try:
True
except:
True = 1
False = 0
 
FACTOR = 0.999
 
class RateMeasure:
def __init__(self):
self.last = None
self.time = 1.0
self.got = 0.0
self.remaining = None
self.broke = False
self.got_anything = False
self.last_checked = None
self.rate = 0
 
def data_came_in(self, amount):
if not self.got_anything:
self.got_anything = True
self.last = clock()
return
self.update(amount)
 
def data_rejected(self, amount):
pass
 
def get_time_left(self, left):
t = clock()
if not self.got_anything:
return None
if t - self.last > 15:
self.update(0)
try:
remaining = left/self.rate
delta = max(remaining/20,2)
if self.remaining is None:
self.remaining = remaining
elif abs(self.remaining-remaining) > delta:
self.remaining = remaining
else:
self.remaining -= t - self.last_checked
except ZeroDivisionError:
self.remaining = None
if self.remaining is not None and self.remaining < 0.1:
self.remaining = 0.1
self.last_checked = t
return self.remaining
 
def update(self, amount):
t = clock()
t1 = int(t)
l1 = int(self.last)
for i in xrange(l1,t1):
self.time *= FACTOR
self.got *= FACTOR
self.got += amount
if t - self.last < 20:
self.time += t - self.last
self.last = t
try:
self.rate = self.got / self.time
except ZeroDivisionError:
pass
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/RawServer.py
0,0 → 1,195
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from bisect import insort
from SocketHandler import SocketHandler, UPnP_ERROR
import socket
from cStringIO import StringIO
from traceback import print_exc
from select import error
from threading import Thread, Event
from time import sleep
from clock import clock
import sys
try:
True
except:
True = 1
False = 0
 
 
def autodetect_ipv6():
try:
assert sys.version_info >= (2,3)
assert socket.has_ipv6
socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
except:
return 0
return 1
 
def autodetect_socket_style():
if sys.platform.find('linux') < 0:
return 1
else:
try:
f = open('/proc/sys/net/ipv6/bindv6only','r')
dual_socket_style = int(f.read())
f.close()
return int(not dual_socket_style)
except:
return 0
 
 
READSIZE = 100000
 
class RawServer:
def __init__(self, doneflag, timeout_check_interval, timeout, noisy = True,
ipv6_enable = True, failfunc = lambda x: None, errorfunc = None,
sockethandler = None, excflag = Event()):
self.timeout_check_interval = timeout_check_interval
self.timeout = timeout
self.servers = {}
self.single_sockets = {}
self.dead_from_write = []
self.doneflag = doneflag
self.noisy = noisy
self.failfunc = failfunc
self.errorfunc = errorfunc
self.exccount = 0
self.funcs = []
self.externally_added = []
self.finished = Event()
self.tasks_to_kill = []
self.excflag = excflag
if sockethandler is None:
sockethandler = SocketHandler(timeout, ipv6_enable, READSIZE)
self.sockethandler = sockethandler
self.add_task(self.scan_for_timeouts, timeout_check_interval)
 
def get_exception_flag(self):
return self.excflag
 
def _add_task(self, func, delay, id = None):
assert float(delay) >= 0
insort(self.funcs, (clock() + delay, func, id))
 
def add_task(self, func, delay = 0, id = None):
assert float(delay) >= 0
self.externally_added.append((func, delay, id))
 
def scan_for_timeouts(self):
self.add_task(self.scan_for_timeouts, self.timeout_check_interval)
self.sockethandler.scan_for_timeouts()
 
def bind(self, port, bind = '', reuse = False,
ipv6_socket_style = 1, upnp = False):
self.sockethandler.bind(port, bind, reuse, ipv6_socket_style, upnp)
 
def find_and_bind(self, minport, maxport, bind = '', reuse = False,
ipv6_socket_style = 1, upnp = 0, randomizer = False):
return self.sockethandler.find_and_bind(minport, maxport, bind, reuse,
ipv6_socket_style, upnp, randomizer)
 
def start_connection_raw(self, dns, socktype, handler = None):
return self.sockethandler.start_connection_raw(dns, socktype, handler)
 
def start_connection(self, dns, handler = None, randomize = False):
return self.sockethandler.start_connection(dns, handler, randomize)
 
def get_stats(self):
return self.sockethandler.get_stats()
 
def pop_external(self):
while self.externally_added:
(a, b, c) = self.externally_added.pop(0)
self._add_task(a, b, c)
 
 
def listen_forever(self, handler):
self.sockethandler.set_handler(handler)
try:
while not self.doneflag.isSet():
try:
self.pop_external()
self._kill_tasks()
if self.funcs:
period = self.funcs[0][0] + 0.001 - clock()
else:
period = 2 ** 30
if period < 0:
period = 0
events = self.sockethandler.do_poll(period)
if self.doneflag.isSet():
return
while self.funcs and self.funcs[0][0] <= clock():
garbage1, func, id = self.funcs.pop(0)
if id in self.tasks_to_kill:
pass
try:
# print func.func_name
func()
except (SystemError, MemoryError), e:
self.failfunc(str(e))
return
except KeyboardInterrupt:
# self.exception(True)
return
except:
if self.noisy:
self.exception()
self.sockethandler.close_dead()
self.sockethandler.handle_events(events)
if self.doneflag.isSet():
return
self.sockethandler.close_dead()
except (SystemError, MemoryError), e:
self.failfunc(str(e))
return
except error:
if self.doneflag.isSet():
return
except KeyboardInterrupt:
# self.exception(True)
return
except:
self.exception()
if self.exccount > 10:
return
finally:
# self.sockethandler.shutdown()
self.finished.set()
 
def is_finished(self):
return self.finished.isSet()
 
def wait_until_finished(self):
self.finished.wait()
 
def _kill_tasks(self):
if self.tasks_to_kill:
new_funcs = []
for (t, func, id) in self.funcs:
if id not in self.tasks_to_kill:
new_funcs.append((t, func, id))
self.funcs = new_funcs
self.tasks_to_kill = []
 
def kill_tasks(self, id):
self.tasks_to_kill.append(id)
 
def exception(self, kbint = False):
if not kbint:
self.excflag.set()
self.exccount += 1
if self.errorfunc is None:
print_exc()
else:
data = StringIO()
print_exc(file = data)
# print data.getvalue() # report exception here too
if not kbint: # don't report here if it's a keyboard interrupt
self.errorfunc(data.getvalue())
 
def shutdown(self):
self.sockethandler.shutdown()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/ServerPortHandler.py
0,0 → 1,188
# Written by John Hoffman
# see LICENSE.txt for license information
 
from cStringIO import StringIO
#from RawServer import RawServer
try:
True
except:
True = 1
False = 0
 
from BT1.Encrypter import protocol_name
 
default_task_id = []
 
class SingleRawServer:
def __init__(self, info_hash, multihandler, doneflag, protocol):
self.info_hash = info_hash
self.doneflag = doneflag
self.protocol = protocol
self.multihandler = multihandler
self.rawserver = multihandler.rawserver
self.finished = False
self.running = False
self.handler = None
self.taskqueue = []
 
def shutdown(self):
if not self.finished:
self.multihandler.shutdown_torrent(self.info_hash)
 
def _shutdown(self):
if not self.finished:
self.finished = True
self.running = False
self.rawserver.kill_tasks(self.info_hash)
if self.handler:
self.handler.close_all()
 
def _external_connection_made(self, c, options, already_read):
if self.running:
c.set_handler(self.handler)
self.handler.externally_handshaked_connection_made(
c, options, already_read)
 
### RawServer functions ###
 
def add_task(self, func, delay=0, id = default_task_id):
if id is default_task_id:
id = self.info_hash
if not self.finished:
self.rawserver.add_task(func, delay, id)
 
# def bind(self, port, bind = '', reuse = False):
# pass # not handled here
def start_connection(self, dns, handler = None):
if not handler:
handler = self.handler
c = self.rawserver.start_connection(dns, handler)
return c
 
# def listen_forever(self, handler):
# pass # don't call with this
def start_listening(self, handler):
self.handler = handler
self.running = True
return self.shutdown # obviously, doesn't listen forever
 
def is_finished(self):
return self.finished
 
def get_exception_flag(self):
return self.rawserver.get_exception_flag()
 
 
class NewSocketHandler: # hand a new socket off where it belongs
def __init__(self, multihandler, connection):
self.multihandler = multihandler
self.connection = connection
connection.set_handler(self)
self.closed = False
self.buffer = StringIO()
self.complete = False
self.next_len, self.next_func = 1, self.read_header_len
self.multihandler.rawserver.add_task(self._auto_close, 15)
 
def _auto_close(self):
if not self.complete:
self.close()
def close(self):
if not self.closed:
self.connection.close()
self.closed = True
 
# header format:
# connection.write(chr(len(protocol_name)) + protocol_name +
# (chr(0) * 8) + self.encrypter.download_id + self.encrypter.my_id)
 
# copied from Encrypter and modified
def read_header_len(self, s):
l = ord(s)
return l, self.read_header
 
def read_header(self, s):
self.protocol = s
return 8, self.read_reserved
 
def read_reserved(self, s):
self.options = s
return 20, self.read_download_id
 
def read_download_id(self, s):
if self.multihandler.singlerawservers.has_key(s):
if self.multihandler.singlerawservers[s].protocol == self.protocol:
return True
return None
 
def read_dead(self, s):
return None
 
def data_came_in(self, garbage, s):
while True:
if self.closed:
return
i = self.next_len - self.buffer.tell()
if i > len(s):
self.buffer.write(s)
return
self.buffer.write(s[:i])
s = s[i:]
m = self.buffer.getvalue()
self.buffer.reset()
self.buffer.truncate()
try:
x = self.next_func(m)
except:
self.next_len, self.next_func = 1, self.read_dead
raise
if x is None:
self.close()
return
if x == True: # ready to process
self.multihandler.singlerawservers[m]._external_connection_made(
self.connection, self.options, s)
self.complete = True
return
self.next_len, self.next_func = x
 
def connection_flushed(self, ss):
pass
 
def connection_lost(self, ss):
self.closed = True
 
class MultiHandler:
def __init__(self, rawserver, doneflag):
self.rawserver = rawserver
self.masterdoneflag = doneflag
self.singlerawservers = {}
self.connections = {}
self.taskqueues = {}
 
def newRawServer(self, info_hash, doneflag, protocol=protocol_name):
new = SingleRawServer(info_hash, self, doneflag, protocol)
self.singlerawservers[info_hash] = new
return new
 
def shutdown_torrent(self, info_hash):
self.singlerawservers[info_hash]._shutdown()
del self.singlerawservers[info_hash]
 
def listen_forever(self):
self.rawserver.listen_forever(self)
for srs in self.singlerawservers.values():
srs.finished = True
srs.running = False
srs.doneflag.set()
### RawServer handler functions ###
# be wary of name collisions
 
def external_connection_made(self, ss):
NewSocketHandler(self, ss)
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/SocketHandler.py
0,0 → 1,375
# Written by Bram Cohen
# see LICENSE.txt for license information
 
import socket
from errno import EWOULDBLOCK, ECONNREFUSED, EHOSTUNREACH
try:
from select import poll, error, POLLIN, POLLOUT, POLLERR, POLLHUP
timemult = 1000
except ImportError:
from selectpoll import poll, error, POLLIN, POLLOUT, POLLERR, POLLHUP
timemult = 1
from time import sleep
from clock import clock
import sys
from random import shuffle, randrange
from natpunch import UPnP_open_port, UPnP_close_port
# from BT1.StreamCheck import StreamCheck
# import inspect
try:
True
except:
True = 1
False = 0
 
all = POLLIN | POLLOUT
 
UPnP_ERROR = "unable to forward port via UPnP"
 
class SingleSocket:
def __init__(self, socket_handler, sock, handler, ip = None):
self.socket_handler = socket_handler
self.socket = sock
self.handler = handler
self.buffer = []
self.last_hit = clock()
self.fileno = sock.fileno()
self.connected = False
self.skipped = 0
# self.check = StreamCheck()
try:
self.ip = self.socket.getpeername()[0]
except:
if ip is None:
self.ip = 'unknown'
else:
self.ip = ip
def get_ip(self, real=False):
if real:
try:
self.ip = self.socket.getpeername()[0]
except:
pass
return self.ip
def close(self):
'''
for x in xrange(5,0,-1):
try:
f = inspect.currentframe(x).f_code
print (f.co_filename,f.co_firstlineno,f.co_name)
del f
except:
pass
print ''
'''
assert self.socket
self.connected = False
sock = self.socket
self.socket = None
self.buffer = []
del self.socket_handler.single_sockets[self.fileno]
self.socket_handler.poll.unregister(sock)
sock.close()
 
def shutdown(self, val):
self.socket.shutdown(val)
 
def is_flushed(self):
return not self.buffer
 
def write(self, s):
# self.check.write(s)
assert self.socket is not None
self.buffer.append(s)
if len(self.buffer) == 1:
self.try_write()
 
def try_write(self):
if self.connected:
dead = False
try:
while self.buffer:
buf = self.buffer[0]
amount = self.socket.send(buf)
if amount == 0:
self.skipped += 1
break
self.skipped = 0
if amount != len(buf):
self.buffer[0] = buf[amount:]
break
del self.buffer[0]
except socket.error, e:
try:
dead = e[0] != EWOULDBLOCK
except:
dead = True
self.skipped += 1
if self.skipped >= 3:
dead = True
if dead:
self.socket_handler.dead_from_write.append(self)
return
if self.buffer:
self.socket_handler.poll.register(self.socket, all)
else:
self.socket_handler.poll.register(self.socket, POLLIN)
 
def set_handler(self, handler):
self.handler = handler
 
class SocketHandler:
def __init__(self, timeout, ipv6_enable, readsize = 100000):
self.timeout = timeout
self.ipv6_enable = ipv6_enable
self.readsize = readsize
self.poll = poll()
# {socket: SingleSocket}
self.single_sockets = {}
self.dead_from_write = []
self.max_connects = 1000
self.port_forwarded = None
self.servers = {}
 
def scan_for_timeouts(self):
t = clock() - self.timeout
tokill = []
for s in self.single_sockets.values():
if s.last_hit < t:
tokill.append(s)
for k in tokill:
if k.socket is not None:
self._close_socket(k)
 
def bind(self, port, bind = '', reuse = False, ipv6_socket_style = 1, upnp = 0):
port = int(port)
addrinfos = []
self.servers = {}
self.interfaces = []
# if bind != "" thread it as a comma seperated list and bind to all
# addresses (can be ips or hostnames) else bind to default ipv6 and
# ipv4 address
if bind:
if self.ipv6_enable:
socktype = socket.AF_UNSPEC
else:
socktype = socket.AF_INET
bind = bind.split(',')
for addr in bind:
if sys.version_info < (2,2):
addrinfos.append((socket.AF_INET, None, None, None, (addr, port)))
else:
addrinfos.extend(socket.getaddrinfo(addr, port,
socktype, socket.SOCK_STREAM))
else:
if self.ipv6_enable:
addrinfos.append([socket.AF_INET6, None, None, None, ('', port)])
if not addrinfos or ipv6_socket_style != 0:
addrinfos.append([socket.AF_INET, None, None, None, ('', port)])
for addrinfo in addrinfos:
try:
server = socket.socket(addrinfo[0], socket.SOCK_STREAM)
if reuse:
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.setblocking(0)
server.bind(addrinfo[4])
self.servers[server.fileno()] = server
if bind:
self.interfaces.append(server.getsockname()[0])
server.listen(64)
self.poll.register(server, POLLIN)
except socket.error, e:
for server in self.servers.values():
try:
server.close()
except:
pass
if self.ipv6_enable and ipv6_socket_style == 0 and self.servers:
raise socket.error('blocked port (may require ipv6_binds_v4 to be set)')
raise socket.error(str(e))
if not self.servers:
raise socket.error('unable to open server port')
if upnp:
if not UPnP_open_port(port):
for server in self.servers.values():
try:
server.close()
except:
pass
self.servers = None
self.interfaces = None
raise socket.error(UPnP_ERROR)
self.port_forwarded = port
self.port = port
 
def find_and_bind(self, minport, maxport, bind = '', reuse = False,
ipv6_socket_style = 1, upnp = 0, randomizer = False):
e = 'maxport less than minport - no ports to check'
if maxport-minport < 50 or not randomizer:
portrange = range(minport, maxport+1)
if randomizer:
shuffle(portrange)
portrange = portrange[:20] # check a maximum of 20 ports
else:
portrange = []
while len(portrange) < 20:
listen_port = randrange(minport, maxport+1)
if not listen_port in portrange:
portrange.append(listen_port)
for listen_port in portrange:
try:
self.bind(listen_port, bind,
ipv6_socket_style = ipv6_socket_style, upnp = upnp)
return listen_port
except socket.error, e:
pass
raise socket.error(str(e))
 
 
def set_handler(self, handler):
self.handler = handler
 
 
def start_connection_raw(self, dns, socktype = socket.AF_INET, handler = None):
if handler is None:
handler = self.handler
sock = socket.socket(socktype, socket.SOCK_STREAM)
sock.setblocking(0)
try:
sock.connect_ex(dns)
except socket.error:
raise
except Exception, e:
raise socket.error(str(e))
self.poll.register(sock, POLLIN)
s = SingleSocket(self, sock, handler, dns[0])
self.single_sockets[sock.fileno()] = s
return s
 
 
def start_connection(self, dns, handler = None, randomize = False):
if handler is None:
handler = self.handler
if sys.version_info < (2,2):
s = self.start_connection_raw(dns,socket.AF_INET,handler)
else:
if self.ipv6_enable:
socktype = socket.AF_UNSPEC
else:
socktype = socket.AF_INET
try:
addrinfos = socket.getaddrinfo(dns[0], int(dns[1]),
socktype, socket.SOCK_STREAM)
except socket.error, e:
raise
except Exception, e:
raise socket.error(str(e))
if randomize:
shuffle(addrinfos)
for addrinfo in addrinfos:
try:
s = self.start_connection_raw(addrinfo[4],addrinfo[0],handler)
break
except:
pass
else:
raise socket.error('unable to connect')
return s
 
 
def _sleep(self):
sleep(1)
def handle_events(self, events):
for sock, event in events:
s = self.servers.get(sock)
if s:
if event & (POLLHUP | POLLERR) != 0:
self.poll.unregister(s)
s.close()
del self.servers[sock]
print "lost server socket"
elif len(self.single_sockets) < self.max_connects:
try:
newsock, addr = s.accept()
newsock.setblocking(0)
nss = SingleSocket(self, newsock, self.handler)
self.single_sockets[newsock.fileno()] = nss
self.poll.register(newsock, POLLIN)
self.handler.external_connection_made(nss)
except socket.error:
self._sleep()
else:
s = self.single_sockets.get(sock)
if not s:
continue
s.connected = True
if (event & (POLLHUP | POLLERR)):
self._close_socket(s)
continue
if (event & POLLIN):
try:
s.last_hit = clock()
data = s.socket.recv(100000)
if not data:
self._close_socket(s)
else:
s.handler.data_came_in(s, data)
except socket.error, e:
code, msg = e
if code != EWOULDBLOCK:
self._close_socket(s)
continue
if (event & POLLOUT) and s.socket and not s.is_flushed():
s.try_write()
if s.is_flushed():
s.handler.connection_flushed(s)
 
def close_dead(self):
while self.dead_from_write:
old = self.dead_from_write
self.dead_from_write = []
for s in old:
if s.socket:
self._close_socket(s)
 
def _close_socket(self, s):
s.close()
s.handler.connection_lost(s)
 
def do_poll(self, t):
r = self.poll.poll(t*timemult)
if r is None:
connects = len(self.single_sockets)
to_close = int(connects*0.05)+1 # close 5% of sockets
self.max_connects = connects-to_close
closelist = self.single_sockets.values()
shuffle(closelist)
closelist = closelist[:to_close]
for sock in closelist:
self._close_socket(sock)
return []
return r
 
def get_stats(self):
return { 'interfaces': self.interfaces,
'port': self.port,
'upnp': self.port_forwarded is not None }
 
 
def shutdown(self):
for ss in self.single_sockets.values():
try:
ss.close()
except:
pass
for server in self.servers.values():
try:
server.close()
except:
pass
if self.port_forwarded is not None:
UPnP_close_port(self.port_forwarded)
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/__init__.py
0,0 → 1,63
product_name = 'BitTornado'
version_short = 'T-0.3.15'
 
version = version_short+' ('+product_name+')'
report_email = version_short+'@degreez.net'
 
from types import StringType
from sha import sha
from time import time, clock
try:
from os import getpid
except ImportError:
def getpid():
return 1
 
mapbase64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-'
 
_idprefix = version_short[0]
for subver in version_short[2:].split('.'):
try:
subver = int(subver)
except:
subver = 0
_idprefix += mapbase64[subver]
_idprefix += ('-' * (6-len(_idprefix)))
_idrandom = [None]
 
def resetPeerIDs():
try:
f = open('/dev/urandom','rb')
x = f.read(20)
f.close()
except:
x = ''
 
l1 = 0
t = clock()
while t == clock():
l1 += 1
l2 = 0
t = long(time()*100)
while t == long(time()*100):
l2 += 1
l3 = 0
if l2 < 1000:
t = long(time()*10)
while t == long(clock()*10):
l3 += 1
x += ( repr(time()) + '/' + str(time()) + '/'
+ str(l1) + '/' + str(l2) + '/' + str(l3) + '/'
+ str(getpid()) )
 
s = ''
for i in sha(x).digest()[-11:]:
s += mapbase64[ord(i) & 0x3F]
_idrandom[0] = s
resetPeerIDs()
 
def createPeerID(ins = '---'):
assert type(ins) is StringType
assert len(ins) == 3
return _idprefix + ins + _idrandom[0]
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/bencode.py
0,0 → 1,319
# Written by Petru Paler, Uoti Urpala, Ross Cohen and John Hoffman
# see LICENSE.txt for license information
 
from types import IntType, LongType, StringType, ListType, TupleType, DictType
try:
from types import BooleanType
except ImportError:
BooleanType = None
try:
from types import UnicodeType
except ImportError:
UnicodeType = None
from cStringIO import StringIO
 
def decode_int(x, f):
f += 1
newf = x.index('e', f)
try:
n = int(x[f:newf])
except:
n = long(x[f:newf])
if x[f] == '-':
if x[f + 1] == '0':
raise ValueError
elif x[f] == '0' and newf != f+1:
raise ValueError
return (n, newf+1)
def decode_string(x, f):
colon = x.index(':', f)
try:
n = int(x[f:colon])
except (OverflowError, ValueError):
n = long(x[f:colon])
if x[f] == '0' and colon != f+1:
raise ValueError
colon += 1
return (x[colon:colon+n], colon+n)
 
def decode_unicode(x, f):
s, f = decode_string(x, f+1)
return (s.decode('UTF-8'),f)
 
def decode_list(x, f):
r, f = [], f+1
while x[f] != 'e':
v, f = decode_func[x[f]](x, f)
r.append(v)
return (r, f + 1)
 
def decode_dict(x, f):
r, f = {}, f+1
lastkey = None
while x[f] != 'e':
k, f = decode_string(x, f)
if lastkey >= k:
raise ValueError
lastkey = k
r[k], f = decode_func[x[f]](x, f)
return (r, f + 1)
 
decode_func = {}
decode_func['l'] = decode_list
decode_func['d'] = decode_dict
decode_func['i'] = decode_int
decode_func['0'] = decode_string
decode_func['1'] = decode_string
decode_func['2'] = decode_string
decode_func['3'] = decode_string
decode_func['4'] = decode_string
decode_func['5'] = decode_string
decode_func['6'] = decode_string
decode_func['7'] = decode_string
decode_func['8'] = decode_string
decode_func['9'] = decode_string
#decode_func['u'] = decode_unicode
def bdecode(x, sloppy = 0):
try:
r, l = decode_func[x[0]](x, 0)
# except (IndexError, KeyError):
except (IndexError, KeyError, ValueError):
raise ValueError, "bad bencoded data"
if not sloppy and l != len(x):
raise ValueError, "bad bencoded data"
return r
 
def test_bdecode():
try:
bdecode('0:0:')
assert 0
except ValueError:
pass
try:
bdecode('ie')
assert 0
except ValueError:
pass
try:
bdecode('i341foo382e')
assert 0
except ValueError:
pass
assert bdecode('i4e') == 4L
assert bdecode('i0e') == 0L
assert bdecode('i123456789e') == 123456789L
assert bdecode('i-10e') == -10L
try:
bdecode('i-0e')
assert 0
except ValueError:
pass
try:
bdecode('i123')
assert 0
except ValueError:
pass
try:
bdecode('')
assert 0
except ValueError:
pass
try:
bdecode('i6easd')
assert 0
except ValueError:
pass
try:
bdecode('35208734823ljdahflajhdf')
assert 0
except ValueError:
pass
try:
bdecode('2:abfdjslhfld')
assert 0
except ValueError:
pass
assert bdecode('0:') == ''
assert bdecode('3:abc') == 'abc'
assert bdecode('10:1234567890') == '1234567890'
try:
bdecode('02:xy')
assert 0
except ValueError:
pass
try:
bdecode('l')
assert 0
except ValueError:
pass
assert bdecode('le') == []
try:
bdecode('leanfdldjfh')
assert 0
except ValueError:
pass
assert bdecode('l0:0:0:e') == ['', '', '']
try:
bdecode('relwjhrlewjh')
assert 0
except ValueError:
pass
assert bdecode('li1ei2ei3ee') == [1, 2, 3]
assert bdecode('l3:asd2:xye') == ['asd', 'xy']
assert bdecode('ll5:Alice3:Bobeli2ei3eee') == [['Alice', 'Bob'], [2, 3]]
try:
bdecode('d')
assert 0
except ValueError:
pass
try:
bdecode('defoobar')
assert 0
except ValueError:
pass
assert bdecode('de') == {}
assert bdecode('d3:agei25e4:eyes4:bluee') == {'age': 25, 'eyes': 'blue'}
assert bdecode('d8:spam.mp3d6:author5:Alice6:lengthi100000eee') == {'spam.mp3': {'author': 'Alice', 'length': 100000}}
try:
bdecode('d3:fooe')
assert 0
except ValueError:
pass
try:
bdecode('di1e0:e')
assert 0
except ValueError:
pass
try:
bdecode('d1:b0:1:a0:e')
assert 0
except ValueError:
pass
try:
bdecode('d1:a0:1:a0:e')
assert 0
except ValueError:
pass
try:
bdecode('i03e')
assert 0
except ValueError:
pass
try:
bdecode('l01:ae')
assert 0
except ValueError:
pass
try:
bdecode('9999:x')
assert 0
except ValueError:
pass
try:
bdecode('l0:')
assert 0
except ValueError:
pass
try:
bdecode('d0:0:')
assert 0
except ValueError:
pass
try:
bdecode('d0:')
assert 0
except ValueError:
pass
 
bencached_marker = []
 
class Bencached:
def __init__(self, s):
self.marker = bencached_marker
self.bencoded = s
 
BencachedType = type(Bencached('')) # insufficient, but good as a filter
 
def encode_bencached(x,r):
assert x.marker == bencached_marker
r.append(x.bencoded)
 
def encode_int(x,r):
r.extend(('i',str(x),'e'))
 
def encode_bool(x,r):
encode_int(int(x),r)
 
def encode_string(x,r):
r.extend((str(len(x)),':',x))
 
def encode_unicode(x,r):
#r.append('u')
encode_string(x.encode('UTF-8'),r)
 
def encode_list(x,r):
r.append('l')
for e in x:
encode_func[type(e)](e, r)
r.append('e')
 
def encode_dict(x,r):
r.append('d')
ilist = x.items()
ilist.sort()
for k,v in ilist:
r.extend((str(len(k)),':',k))
encode_func[type(v)](v, r)
r.append('e')
 
encode_func = {}
encode_func[BencachedType] = encode_bencached
encode_func[IntType] = encode_int
encode_func[LongType] = encode_int
encode_func[StringType] = encode_string
encode_func[ListType] = encode_list
encode_func[TupleType] = encode_list
encode_func[DictType] = encode_dict
if BooleanType:
encode_func[BooleanType] = encode_bool
if UnicodeType:
encode_func[UnicodeType] = encode_unicode
def bencode(x):
r = []
try:
encode_func[type(x)](x, r)
except:
print "*** error *** could not encode type %s (value: %s)" % (type(x), x)
assert 0
return ''.join(r)
 
def test_bencode():
assert bencode(4) == 'i4e'
assert bencode(0) == 'i0e'
assert bencode(-10) == 'i-10e'
assert bencode(12345678901234567890L) == 'i12345678901234567890e'
assert bencode('') == '0:'
assert bencode('abc') == '3:abc'
assert bencode('1234567890') == '10:1234567890'
assert bencode([]) == 'le'
assert bencode([1, 2, 3]) == 'li1ei2ei3ee'
assert bencode([['Alice', 'Bob'], [2, 3]]) == 'll5:Alice3:Bobeli2ei3eee'
assert bencode({}) == 'de'
assert bencode({'age': 25, 'eyes': 'blue'}) == 'd3:agei25e4:eyes4:bluee'
assert bencode({'spam.mp3': {'author': 'Alice', 'length': 100000}}) == 'd8:spam.mp3d6:author5:Alice6:lengthi100000eee'
try:
bencode({1: 'foo'})
assert 0
except AssertionError:
pass
 
try:
import psyco
psyco.bind(bdecode)
psyco.bind(bencode)
except ImportError:
pass
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/bitfield.py
0,0 → 1,162
# Written by Bram Cohen, Uoti Urpala, and John Hoffman
# see LICENSE.txt for license information
 
try:
True
except:
True = 1
False = 0
bool = lambda x: not not x
 
try:
sum([1])
negsum = lambda a: len(a)-sum(a)
except:
negsum = lambda a: reduce(lambda x,y: x+(not y), a, 0)
def _int_to_booleans(x):
r = []
for i in range(8):
r.append(bool(x & 0x80))
x <<= 1
return tuple(r)
 
lookup_table = []
reverse_lookup_table = {}
for i in xrange(256):
x = _int_to_booleans(i)
lookup_table.append(x)
reverse_lookup_table[x] = chr(i)
 
 
class Bitfield:
def __init__(self, length = None, bitstring = None, copyfrom = None):
if copyfrom is not None:
self.length = copyfrom.length
self.array = copyfrom.array[:]
self.numfalse = copyfrom.numfalse
return
if length is None:
raise ValueError, "length must be provided unless copying from another array"
self.length = length
if bitstring is not None:
extra = len(bitstring) * 8 - length
if extra < 0 or extra >= 8:
raise ValueError
t = lookup_table
r = []
for c in bitstring:
r.extend(t[ord(c)])
if extra > 0:
if r[-extra:] != [0] * extra:
raise ValueError
del r[-extra:]
self.array = r
self.numfalse = negsum(r)
else:
self.array = [False] * length
self.numfalse = length
 
def __setitem__(self, index, val):
val = bool(val)
self.numfalse += self.array[index]-val
self.array[index] = val
 
def __getitem__(self, index):
return self.array[index]
 
def __len__(self):
return self.length
 
def tostring(self):
booleans = self.array
t = reverse_lookup_table
s = len(booleans) % 8
r = [ t[tuple(booleans[x:x+8])] for x in xrange(0, len(booleans)-s, 8) ]
if s:
r += t[tuple(booleans[-s:] + ([0] * (8-s)))]
return ''.join(r)
 
def complete(self):
return not self.numfalse
 
 
def test_bitfield():
try:
x = Bitfield(7, 'ab')
assert False
except ValueError:
pass
try:
x = Bitfield(7, 'ab')
assert False
except ValueError:
pass
try:
x = Bitfield(9, 'abc')
assert False
except ValueError:
pass
try:
x = Bitfield(0, 'a')
assert False
except ValueError:
pass
try:
x = Bitfield(1, '')
assert False
except ValueError:
pass
try:
x = Bitfield(7, '')
assert False
except ValueError:
pass
try:
x = Bitfield(8, '')
assert False
except ValueError:
pass
try:
x = Bitfield(9, 'a')
assert False
except ValueError:
pass
try:
x = Bitfield(7, chr(1))
assert False
except ValueError:
pass
try:
x = Bitfield(9, chr(0) + chr(0x40))
assert False
except ValueError:
pass
assert Bitfield(0, '').tostring() == ''
assert Bitfield(1, chr(0x80)).tostring() == chr(0x80)
assert Bitfield(7, chr(0x02)).tostring() == chr(0x02)
assert Bitfield(8, chr(0xFF)).tostring() == chr(0xFF)
assert Bitfield(9, chr(0) + chr(0x80)).tostring() == chr(0) + chr(0x80)
x = Bitfield(1)
assert x.numfalse == 1
x[0] = 1
assert x.numfalse == 0
x[0] = 1
assert x.numfalse == 0
assert x.tostring() == chr(0x80)
x = Bitfield(7)
assert len(x) == 7
x[6] = 1
assert x.numfalse == 6
assert x.tostring() == chr(0x02)
x = Bitfield(8)
x[7] = 1
assert x.tostring() == chr(1)
x = Bitfield(9)
x[8] = 1
assert x.numfalse == 8
assert x.tostring() == chr(0) + chr(0x80)
x = Bitfield(8, chr(0xC4))
assert len(x) == 8
assert x.numfalse == 5
assert x.tostring() == chr(0xC4)
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/clock.py
0,0 → 1,27
# Written by John Hoffman
# see LICENSE.txt for license information
 
from time import *
import sys
 
_MAXFORWARD = 100
_FUDGE = 1
 
class RelativeTime:
def __init__(self):
self.time = time()
self.offset = 0
 
def get_time(self):
t = time() + self.offset
if t < self.time or t > self.time + _MAXFORWARD:
self.time += _FUDGE
self.offset += self.time - t
return self.time
self.time = t
return t
 
if sys.platform != 'win32':
_RTIME = RelativeTime()
def clock():
return _RTIME.get_time()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/download_bt1.py
0,0 → 1,878
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from zurllib import urlopen
from urlparse import urlparse
from BT1.btformats import check_message
from BT1.Choker import Choker
from BT1.Storage import Storage
from BT1.StorageWrapper import StorageWrapper
from BT1.FileSelector import FileSelector
from BT1.Uploader import Upload
from BT1.Downloader import Downloader
from BT1.HTTPDownloader import HTTPDownloader
from BT1.Connecter import Connecter
from RateLimiter import RateLimiter
from BT1.Encrypter import Encoder
from RawServer import RawServer, autodetect_ipv6, autodetect_socket_style
from BT1.Rerequester import Rerequester
from BT1.DownloaderFeedback import DownloaderFeedback
from RateMeasure import RateMeasure
from CurrentRateMeasure import Measure
from BT1.PiecePicker import PiecePicker
from BT1.Statistics import Statistics
from ConfigDir import ConfigDir
from bencode import bencode, bdecode
from natpunch import UPnP_test
from sha import sha
from os import path, makedirs, listdir
from parseargs import parseargs, formatDefinitions, defaultargs
from socket import error as socketerror
from random import seed
from threading import Thread, Event
from clock import clock
from __init__ import createPeerID
 
try:
True
except:
True = 1
False = 0
 
defaults = [
('max_uploads', 7,
"the maximum number of uploads to allow at once."),
('keepalive_interval', 120.0,
'number of seconds to pause between sending keepalives'),
('download_slice_size', 2 ** 14,
"How many bytes to query for per request."),
('upload_unit_size', 1460,
"when limiting upload rate, how many bytes to send at a time"),
('request_backlog', 10,
"maximum number of requests to keep in a single pipe at once."),
('max_message_length', 2 ** 23,
"maximum length prefix encoding you'll accept over the wire - larger values get the connection dropped."),
('ip', '',
"ip to report you have to the tracker."),
('minport', 10000, 'minimum port to listen on, counts up if unavailable'),
('maxport', 60000, 'maximum port to listen on'),
('random_port', 1, 'whether to choose randomly inside the port range ' +
'instead of counting up linearly'),
('responsefile', '',
'file the server response was stored in, alternative to url'),
('url', '',
'url to get file from, alternative to responsefile'),
('selector_enabled', 1,
'whether to enable the file selector and fast resume function'),
('expire_cache_data', 10,
'the number of days after which you wish to expire old cache data ' +
'(0 = disabled)'),
('priority', '',
'a list of file priorities separated by commas, must be one per file, ' +
'0 = highest, 1 = normal, 2 = lowest, -1 = download disabled'),
('saveas', '',
'local file name to save the file as, null indicates query user'),
('timeout', 300.0,
'time to wait between closing sockets which nothing has been received on'),
('timeout_check_interval', 60.0,
'time to wait between checking if any connections have timed out'),
('max_slice_length', 2 ** 17,
"maximum length slice to send to peers, larger requests are ignored"),
('max_rate_period', 20.0,
"maximum amount of time to guess the current rate estimate represents"),
('bind', '',
'comma-separated list of ips/hostnames to bind to locally'),
# ('ipv6_enabled', autodetect_ipv6(),
('ipv6_enabled', 0,
'allow the client to connect to peers via IPv6'),
('ipv6_binds_v4', autodetect_socket_style(),
"set if an IPv6 server socket won't also field IPv4 connections"),
('upnp_nat_access', 1,
'attempt to autoconfigure a UPnP router to forward a server port ' +
'(0 = disabled, 1 = mode 1 [fast], 2 = mode 2 [slow])'),
('upload_rate_fudge', 5.0,
'time equivalent of writing to kernel-level TCP buffer, for rate adjustment'),
('tcp_ack_fudge', 0.03,
'how much TCP ACK download overhead to add to upload rate calculations ' +
'(0 = disabled)'),
('display_interval', .5,
'time between updates of displayed information'),
('rerequest_interval', 5 * 60,
'time to wait between requesting more peers'),
('min_peers', 20,
'minimum number of peers to not do rerequesting'),
('http_timeout', 60,
'number of seconds to wait before assuming that an http connection has timed out'),
('max_initiate', 40,
'number of peers at which to stop initiating new connections'),
('check_hashes', 1,
'whether to check hashes on disk'),
('max_upload_rate', 0,
'maximum kB/s to upload at (0 = no limit, -1 = automatic)'),
('max_download_rate', 0,
'maximum kB/s to download at (0 = no limit)'),
('alloc_type', 'normal',
'allocation type (may be normal, background, pre-allocate or sparse)'),
('alloc_rate', 2.0,
'rate (in MiB/s) to allocate space at using background allocation'),
('buffer_reads', 1,
'whether to buffer disk reads'),
('write_buffer_size', 4,
'the maximum amount of space to use for buffering disk writes ' +
'(in megabytes, 0 = disabled)'),
('breakup_seed_bitfield', 1,
'sends an incomplete bitfield and then fills with have messages, '
'in order to get around stupid ISP manipulation'),
('snub_time', 30.0,
"seconds to wait for data to come in over a connection before assuming it's semi-permanently choked"),
('spew', 0,
"whether to display diagnostic info to stdout"),
('rarest_first_cutoff', 2,
"number of downloads at which to switch from random to rarest first"),
('rarest_first_priority_cutoff', 5,
'the number of peers which need to have a piece before other partials take priority over rarest first'),
('min_uploads', 4,
"the number of uploads to fill out to with extra optimistic unchokes"),
('max_files_open', 50,
'the maximum number of files to keep open at a time, 0 means no limit'),
('round_robin_period', 30,
"the number of seconds between the client's switching upload targets"),
('super_seeder', 0,
"whether to use special upload-efficiency-maximizing routines (only for dedicated seeds)"),
('security', 1,
"whether to enable extra security features intended to prevent abuse"),
('max_connections', 0,
"the absolute maximum number of peers to connect with (0 = no limit)"),
('auto_kick', 1,
"whether to allow the client to automatically kick/ban peers that send bad data"),
('double_check', 1,
"whether to double-check data being written to the disk for errors (may increase CPU load)"),
('triple_check', 0,
"whether to thoroughly check data being written to the disk (may slow disk access)"),
('lock_files', 1,
"whether to lock files the client is working with"),
('lock_while_reading', 0,
"whether to lock access to files being read"),
('auto_flush', 0,
"minutes between automatic flushes to disk (0 = disabled)"),
('dedicated_seed_id', '',
"code to send to tracker identifying as a dedicated seed"),
]
 
argslistheader = 'Arguments are:\n\n'
 
 
def _failfunc(x):
print x
 
# old-style downloader
def download(params, filefunc, statusfunc, finfunc, errorfunc, doneflag, cols,
pathFunc = None, presets = {}, exchandler = None,
failed = _failfunc, paramfunc = None):
 
try:
config = parse_params(params, presets)
except ValueError, e:
failed('error: ' + str(e) + '\nrun with no args for parameter explanations')
return
if not config:
errorfunc(get_usage())
return
myid = createPeerID()
seed(myid)
 
rawserver = RawServer(doneflag, config['timeout_check_interval'],
config['timeout'], ipv6_enable = config['ipv6_enabled'],
failfunc = failed, errorfunc = exchandler)
 
upnp_type = UPnP_test(config['upnp_nat_access'])
try:
listen_port = rawserver.find_and_bind(config['minport'], config['maxport'],
config['bind'], ipv6_socket_style = config['ipv6_binds_v4'],
upnp = upnp_type, randomizer = config['random_port'])
except socketerror, e:
failed("Couldn't listen - " + str(e))
return
 
response = get_response(config['responsefile'], config['url'], failed)
if not response:
return
 
infohash = sha(bencode(response['info'])).digest()
 
d = BT1Download(statusfunc, finfunc, errorfunc, exchandler, doneflag,
config, response, infohash, myid, rawserver, listen_port)
 
if not d.saveAs(filefunc):
return
 
if pathFunc:
pathFunc(d.getFilename())
 
hashcheck = d.initFiles(old_style = True)
if not hashcheck:
return
if not hashcheck():
return
if not d.startEngine():
return
d.startRerequester()
d.autoStats()
 
statusfunc(activity = 'connecting to peers')
 
if paramfunc:
paramfunc({ 'max_upload_rate' : d.setUploadRate, # change_max_upload_rate(<int KiB/sec>)
'max_uploads': d.setConns, # change_max_uploads(<int max uploads>)
'listen_port' : listen_port, # int
'peer_id' : myid, # string
'info_hash' : infohash, # string
'start_connection' : d._startConnection, # start_connection((<string ip>, <int port>), <peer id>)
})
rawserver.listen_forever(d.getPortHandler())
d.shutdown()
 
 
def parse_params(params, presets = {}):
if len(params) == 0:
return None
config, args = parseargs(params, defaults, 0, 1, presets = presets)
if args:
if config['responsefile'] or config['url']:
raise ValueError,'must have responsefile or url as arg or parameter, not both'
if path.isfile(args[0]):
config['responsefile'] = args[0]
else:
try:
urlparse(args[0])
except:
raise ValueError, 'bad filename or url'
config['url'] = args[0]
elif (config['responsefile'] == '') == (config['url'] == ''):
raise ValueError, 'need responsefile or url, must have one, cannot have both'
return config
 
 
def get_usage(defaults = defaults, cols = 100, presets = {}):
return (argslistheader + formatDefinitions(defaults, cols, presets))
 
 
def get_response(file, url, errorfunc):
try:
if file:
h = open(file, 'rb')
try:
line = h.read(10) # quick test to see if responsefile contains a dict
front,garbage = line.split(':',1)
assert front[0] == 'd'
int(front[1:])
except:
errorfunc(file+' is not a valid responsefile')
return None
try:
h.seek(0)
except:
try:
h.close()
except:
pass
h = open(file, 'rb')
else:
try:
h = urlopen(url)
except:
errorfunc(url+' bad url')
return None
response = h.read()
except IOError, e:
errorfunc('problem getting response info - ' + str(e))
return None
try:
h.close()
except:
pass
try:
try:
response = bdecode(response)
except:
errorfunc("warning: bad data in responsefile")
response = bdecode(response, sloppy=1)
check_message(response)
except ValueError, e:
errorfunc("got bad file info - " + str(e))
return None
 
return response
 
 
class BT1Download:
def __init__(self, statusfunc, finfunc, errorfunc, excfunc, doneflag,
config, response, infohash, id, rawserver, port,
appdataobj = None):
self.statusfunc = statusfunc
self.finfunc = finfunc
self.errorfunc = errorfunc
self.excfunc = excfunc
self.doneflag = doneflag
self.config = config
self.response = response
self.infohash = infohash
self.myid = id
self.rawserver = rawserver
self.port = port
self.info = self.response['info']
self.pieces = [self.info['pieces'][x:x+20]
for x in xrange(0, len(self.info['pieces']), 20)]
self.len_pieces = len(self.pieces)
self.argslistheader = argslistheader
self.unpauseflag = Event()
self.unpauseflag.set()
self.downloader = None
self.storagewrapper = None
self.fileselector = None
self.super_seeding_active = False
self.filedatflag = Event()
self.spewflag = Event()
self.superseedflag = Event()
self.whenpaused = None
self.finflag = Event()
self.rerequest = None
self.tcp_ack_fudge = config['tcp_ack_fudge']
self.selector_enabled = config['selector_enabled']
if appdataobj:
self.appdataobj = appdataobj
elif self.selector_enabled:
self.appdataobj = ConfigDir()
self.appdataobj.deleteOldCacheData( config['expire_cache_data'],
[self.infohash] )
 
self.excflag = self.rawserver.get_exception_flag()
self.failed = False
self.checking = False
self.started = False
 
self.picker = PiecePicker(self.len_pieces, config['rarest_first_cutoff'],
config['rarest_first_priority_cutoff'])
self.choker = Choker(config, rawserver.add_task,
self.picker, self.finflag.isSet)
 
 
def checkSaveLocation(self, loc):
if self.info.has_key('length'):
return path.exists(loc)
for x in self.info['files']:
if path.exists(path.join(loc, x['path'][0])):
return True
return False
 
def saveAs(self, filefunc, pathfunc = None):
try:
def make(f, forcedir = False):
if not forcedir:
f = path.split(f)[0]
if f != '' and not path.exists(f):
makedirs(f)
 
if self.info.has_key('length'):
file_length = self.info['length']
file = filefunc(self.info['name'], file_length,
self.config['saveas'], False)
if file is None:
return None
make(file)
files = [(file, file_length)]
else:
file_length = 0L
for x in self.info['files']:
file_length += x['length']
file = filefunc(self.info['name'], file_length,
self.config['saveas'], True)
if file is None:
return None
 
# if this path exists, and no files from the info dict exist, we assume it's a new download and
# the user wants to create a new directory with the default name
existing = 0
if path.exists(file):
if not path.isdir(file):
self.errorfunc(file + 'is not a dir')
return None
if len(listdir(file)) > 0: # if it's not empty
for x in self.info['files']:
if path.exists(path.join(file, x['path'][0])):
existing = 1
if not existing:
file = path.join(file, self.info['name'])
if path.exists(file) and not path.isdir(file):
if file[-8:] == '.torrent':
file = file[:-8]
if path.exists(file) and not path.isdir(file):
self.errorfunc("Can't create dir - " + self.info['name'])
return None
make(file, True)
 
# alert the UI to any possible change in path
if pathfunc != None:
pathfunc(file)
 
files = []
for x in self.info['files']:
n = file
for i in x['path']:
n = path.join(n, i)
files.append((n, x['length']))
make(n)
except OSError, e:
self.errorfunc("Couldn't allocate dir - " + str(e))
return None
 
self.filename = file
self.files = files
self.datalength = file_length
 
return file
 
def getFilename(self):
return self.filename
 
 
def _finished(self):
self.finflag.set()
try:
self.storage.set_readonly()
except (IOError, OSError), e:
self.errorfunc('trouble setting readonly at end - ' + str(e))
if self.superseedflag.isSet():
self._set_super_seed()
self.choker.set_round_robin_period(
max( self.config['round_robin_period'],
self.config['round_robin_period'] *
self.info['piece length'] / 200000 ) )
self.rerequest_complete()
self.finfunc()
 
def _data_flunked(self, amount, index):
self.ratemeasure_datarejected(amount)
if not self.doneflag.isSet():
self.errorfunc('piece %d failed hash check, re-downloading it' % index)
 
def _failed(self, reason):
self.failed = True
self.doneflag.set()
if reason is not None:
self.errorfunc(reason)
 
def initFiles(self, old_style = False, statusfunc = None):
if self.doneflag.isSet():
return None
if not statusfunc:
statusfunc = self.statusfunc
 
disabled_files = None
if self.selector_enabled:
self.priority = self.config['priority']
if self.priority:
try:
self.priority = self.priority.split(',')
assert len(self.priority) == len(self.files)
self.priority = [int(p) for p in self.priority]
for p in self.priority:
assert p >= -1
assert p <= 2
except:
self.errorfunc('bad priority list given, ignored')
self.priority = None
 
data = self.appdataobj.getTorrentData(self.infohash)
try:
d = data['resume data']['priority']
assert len(d) == len(self.files)
disabled_files = [x == -1 for x in d]
except:
try:
disabled_files = [x == -1 for x in self.priority]
except:
pass
 
try:
try:
self.storage = Storage(self.files, self.info['piece length'],
self.doneflag, self.config, disabled_files)
except IOError, e:
self.errorfunc('trouble accessing files - ' + str(e))
return None
if self.doneflag.isSet():
return None
 
self.storagewrapper = StorageWrapper(self.storage, self.config['download_slice_size'],
self.pieces, self.info['piece length'], self._finished, self._failed,
statusfunc, self.doneflag, self.config['check_hashes'],
self._data_flunked, self.rawserver.add_task,
self.config, self.unpauseflag)
except ValueError, e:
self._failed('bad data - ' + str(e))
except IOError, e:
self._failed('IOError - ' + str(e))
if self.doneflag.isSet():
return None
 
if self.selector_enabled:
self.fileselector = FileSelector(self.files, self.info['piece length'],
self.appdataobj.getPieceDir(self.infohash),
self.storage, self.storagewrapper,
self.rawserver.add_task,
self._failed)
if data:
data = data.get('resume data')
if data:
self.fileselector.unpickle(data)
self.checking = True
if old_style:
return self.storagewrapper.old_style_init()
return self.storagewrapper.initialize
 
 
def getCachedTorrentData(self):
return self.appdataobj.getTorrentData(self.infohash)
 
 
def _make_upload(self, connection, ratelimiter, totalup):
return Upload(connection, ratelimiter, totalup,
self.choker, self.storagewrapper, self.picker,
self.config)
 
def _kick_peer(self, connection):
def k(connection = connection):
connection.close()
self.rawserver.add_task(k,0)
 
def _ban_peer(self, ip):
self.encoder_ban(ip)
 
def _received_raw_data(self, x):
if self.tcp_ack_fudge:
x = int(x*self.tcp_ack_fudge)
self.ratelimiter.adjust_sent(x)
# self.upmeasure.update_rate(x)
 
def _received_data(self, x):
self.downmeasure.update_rate(x)
self.ratemeasure.data_came_in(x)
 
def _received_http_data(self, x):
self.downmeasure.update_rate(x)
self.ratemeasure.data_came_in(x)
self.downloader.external_data_received(x)
 
def _cancelfunc(self, pieces):
self.downloader.cancel_piece_download(pieces)
self.httpdownloader.cancel_piece_download(pieces)
def _reqmorefunc(self, pieces):
self.downloader.requeue_piece_download(pieces)
 
def startEngine(self, ratelimiter = None, statusfunc = None):
if self.doneflag.isSet():
return False
if not statusfunc:
statusfunc = self.statusfunc
 
self.checking = False
 
for i in xrange(self.len_pieces):
if self.storagewrapper.do_I_have(i):
self.picker.complete(i)
self.upmeasure = Measure(self.config['max_rate_period'],
self.config['upload_rate_fudge'])
self.downmeasure = Measure(self.config['max_rate_period'])
 
if ratelimiter:
self.ratelimiter = ratelimiter
else:
self.ratelimiter = RateLimiter(self.rawserver.add_task,
self.config['upload_unit_size'],
self.setConns)
self.ratelimiter.set_upload_rate(self.config['max_upload_rate'])
self.ratemeasure = RateMeasure()
self.ratemeasure_datarejected = self.ratemeasure.data_rejected
 
self.downloader = Downloader(self.storagewrapper, self.picker,
self.config['request_backlog'], self.config['max_rate_period'],
self.len_pieces, self.config['download_slice_size'],
self._received_data, self.config['snub_time'], self.config['auto_kick'],
self._kick_peer, self._ban_peer)
self.downloader.set_download_rate(self.config['max_download_rate'])
self.connecter = Connecter(self._make_upload, self.downloader, self.choker,
self.len_pieces, self.upmeasure, self.config,
self.ratelimiter, self.rawserver.add_task)
self.encoder = Encoder(self.connecter, self.rawserver,
self.myid, self.config['max_message_length'], self.rawserver.add_task,
self.config['keepalive_interval'], self.infohash,
self._received_raw_data, self.config)
self.encoder_ban = self.encoder.ban
 
self.httpdownloader = HTTPDownloader(self.storagewrapper, self.picker,
self.rawserver, self.finflag, self.errorfunc, self.downloader,
self.config['max_rate_period'], self.infohash, self._received_http_data,
self.connecter.got_piece)
if self.response.has_key('httpseeds') and not self.finflag.isSet():
for u in self.response['httpseeds']:
self.httpdownloader.make_download(u)
 
if self.selector_enabled:
self.fileselector.tie_in(self.picker, self._cancelfunc,
self._reqmorefunc, self.rerequest_ondownloadmore)
if self.priority:
self.fileselector.set_priorities_now(self.priority)
self.appdataobj.deleteTorrentData(self.infohash)
# erase old data once you've started modifying it
self.started = True
return True
 
 
def rerequest_complete(self):
if self.rerequest:
self.rerequest.announce(1)
 
def rerequest_stopped(self):
if self.rerequest:
self.rerequest.announce(2)
 
def rerequest_lastfailed(self):
if self.rerequest:
return self.rerequest.last_failed
return False
 
def rerequest_ondownloadmore(self):
if self.rerequest:
self.rerequest.hit()
 
def startRerequester(self, seededfunc = None, force_rapid_update = False):
if self.response.has_key('announce-list'):
trackerlist = self.response['announce-list']
else:
trackerlist = [[self.response['announce']]]
 
self.rerequest = Rerequester(trackerlist, self.config['rerequest_interval'],
self.rawserver.add_task, self.connecter.how_many_connections,
self.config['min_peers'], self.encoder.start_connections,
self.rawserver.add_task, self.storagewrapper.get_amount_left,
self.upmeasure.get_total, self.downmeasure.get_total, self.port, self.config['ip'],
self.myid, self.infohash, self.config['http_timeout'],
self.errorfunc, self.excfunc, self.config['max_initiate'],
self.doneflag, self.upmeasure.get_rate, self.downmeasure.get_rate,
self.unpauseflag, self.config['dedicated_seed_id'],
seededfunc, force_rapid_update )
 
self.rerequest.start()
 
 
def _init_stats(self):
self.statistics = Statistics(self.upmeasure, self.downmeasure,
self.connecter, self.httpdownloader, self.ratelimiter,
self.rerequest_lastfailed, self.filedatflag)
if self.info.has_key('files'):
self.statistics.set_dirstats(self.files, self.info['piece length'])
if self.config['spew']:
self.spewflag.set()
 
def autoStats(self, displayfunc = None):
if not displayfunc:
displayfunc = self.statusfunc
 
self._init_stats()
DownloaderFeedback(self.choker, self.httpdownloader, self.rawserver.add_task,
self.upmeasure.get_rate, self.downmeasure.get_rate,
self.ratemeasure, self.storagewrapper.get_stats,
self.datalength, self.finflag, self.spewflag, self.statistics,
displayfunc, self.config['display_interval'])
 
def startStats(self):
self._init_stats()
d = DownloaderFeedback(self.choker, self.httpdownloader, self.rawserver.add_task,
self.upmeasure.get_rate, self.downmeasure.get_rate,
self.ratemeasure, self.storagewrapper.get_stats,
self.datalength, self.finflag, self.spewflag, self.statistics)
return d.gather
 
 
def getPortHandler(self):
return self.encoder
 
 
def shutdown(self, torrentdata = {}):
if self.checking or self.started:
self.storagewrapper.sync()
self.storage.close()
self.rerequest_stopped()
if self.fileselector and self.started:
if not self.failed:
self.fileselector.finish()
torrentdata['resume data'] = self.fileselector.pickle()
try:
self.appdataobj.writeTorrentData(self.infohash,torrentdata)
except:
self.appdataobj.deleteTorrentData(self.infohash) # clear it
return not self.failed and not self.excflag.isSet()
# if returns false, you may wish to auto-restart the torrent
 
 
def setUploadRate(self, rate):
try:
def s(self = self, rate = rate):
self.config['max_upload_rate'] = rate
self.ratelimiter.set_upload_rate(rate)
self.rawserver.add_task(s)
except AttributeError:
pass
 
def setConns(self, conns, conns2 = None):
if not conns2:
conns2 = conns
try:
def s(self = self, conns = conns, conns2 = conns2):
self.config['min_uploads'] = conns
self.config['max_uploads'] = conns2
if (conns > 30):
self.config['max_initiate'] = conns + 10
self.rawserver.add_task(s)
except AttributeError:
pass
def setDownloadRate(self, rate):
try:
def s(self = self, rate = rate):
self.config['max_download_rate'] = rate
self.downloader.set_download_rate(rate)
self.rawserver.add_task(s)
except AttributeError:
pass
 
def startConnection(self, ip, port, id):
self.encoder._start_connection((ip, port), id)
def _startConnection(self, ipandport, id):
self.encoder._start_connection(ipandport, id)
def setInitiate(self, initiate):
try:
def s(self = self, initiate = initiate):
self.config['max_initiate'] = initiate
self.rawserver.add_task(s)
except AttributeError:
pass
 
def getConfig(self):
return self.config
 
def getDefaults(self):
return defaultargs(defaults)
 
def getUsageText(self):
return self.argslistheader
 
def reannounce(self, special = None):
try:
def r(self = self, special = special):
if special is None:
self.rerequest.announce()
else:
self.rerequest.announce(specialurl = special)
self.rawserver.add_task(r)
except AttributeError:
pass
 
def getResponse(self):
try:
return self.response
except:
return None
 
# def Pause(self):
# try:
# if self.storagewrapper:
# self.rawserver.add_task(self._pausemaker, 0)
# except:
# return False
# self.unpauseflag.clear()
# return True
#
# def _pausemaker(self):
# self.whenpaused = clock()
# self.unpauseflag.wait() # sticks a monkey wrench in the main thread
#
# def Unpause(self):
# self.unpauseflag.set()
# if self.whenpaused and clock()-self.whenpaused > 60:
# def r(self = self):
# self.rerequest.announce(3) # rerequest automatically if paused for >60 seconds
# self.rawserver.add_task(r)
 
def Pause(self):
if not self.storagewrapper:
return False
self.unpauseflag.clear()
self.rawserver.add_task(self.onPause)
return True
 
def onPause(self):
self.whenpaused = clock()
if not self.downloader:
return
self.downloader.pause(True)
self.encoder.pause(True)
self.choker.pause(True)
def Unpause(self):
self.unpauseflag.set()
self.rawserver.add_task(self.onUnpause)
 
def onUnpause(self):
if not self.downloader:
return
self.downloader.pause(False)
self.encoder.pause(False)
self.choker.pause(False)
if self.rerequest and self.whenpaused and clock()-self.whenpaused > 60:
self.rerequest.announce(3) # rerequest automatically if paused for >60 seconds
 
def set_super_seed(self):
try:
self.superseedflag.set()
def s(self = self):
if self.finflag.isSet():
self._set_super_seed()
self.rawserver.add_task(s)
except AttributeError:
pass
 
def _set_super_seed(self):
if not self.super_seeding_active:
self.super_seeding_active = True
self.errorfunc(' ** SUPER-SEED OPERATION ACTIVE **\n' +
' please set Max uploads so each peer gets 6-8 kB/s')
def s(self = self):
self.downloader.set_super_seed()
self.choker.set_super_seed()
self.rawserver.add_task(s)
if self.finflag.isSet(): # mode started when already finished
def r(self = self):
self.rerequest.announce(3) # so after kicking everyone off, reannounce
self.rawserver.add_task(r)
 
def am_I_finished(self):
return self.finflag.isSet()
 
def get_transfer_stats(self):
return self.upmeasure.get_total(), self.downmeasure.get_total()
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/inifile.py
0,0 → 1,169
# Written by John Hoffman
# see LICENSE.txt for license information
 
'''
reads/writes a Windows-style INI file
format:
 
aa = "bb"
cc = 11
 
[eee]
ff = "gg"
 
decodes to:
d = { '': {'aa':'bb','cc':'11'}, 'eee': {'ff':'gg'} }
 
the encoder can also take this as input:
 
d = { 'aa': 'bb, 'cc': 11, 'eee': {'ff':'gg'} }
 
though it will only decode in the above format. Keywords must be strings.
Values that are strings are written surrounded by quotes, and the decoding
routine automatically strips any.
Booleans are written as integers. Anything else aside from string/int/float
may have unpredictable results.
'''
 
from cStringIO import StringIO
from traceback import print_exc
from types import DictType, StringType
try:
from types import BooleanType
except ImportError:
BooleanType = None
 
try:
True
except:
True = 1
False = 0
 
DEBUG = False
 
def ini_write(f, d, comment=''):
try:
a = {'':{}}
for k,v in d.items():
assert type(k) == StringType
k = k.lower()
if type(v) == DictType:
if DEBUG:
print 'new section:' +k
if k:
assert not a.has_key(k)
a[k] = {}
aa = a[k]
for kk,vv in v:
assert type(kk) == StringType
kk = kk.lower()
assert not aa.has_key(kk)
if type(vv) == BooleanType:
vv = int(vv)
if type(vv) == StringType:
vv = '"'+vv+'"'
aa[kk] = str(vv)
if DEBUG:
print 'a['+k+']['+kk+'] = '+str(vv)
else:
aa = a['']
assert not aa.has_key(k)
if type(v) == BooleanType:
v = int(v)
if type(v) == StringType:
v = '"'+v+'"'
aa[k] = str(v)
if DEBUG:
print 'a[\'\']['+k+'] = '+str(v)
r = open(f,'w')
if comment:
for c in comment.split('\n'):
r.write('# '+c+'\n')
r.write('\n')
l = a.keys()
l.sort()
for k in l:
if k:
r.write('\n['+k+']\n')
aa = a[k]
ll = aa.keys()
ll.sort()
for kk in ll:
r.write(kk+' = '+aa[kk]+'\n')
success = True
except:
if DEBUG:
print_exc()
success = False
try:
r.close()
except:
pass
return success
 
 
if DEBUG:
def errfunc(lineno, line, err):
print '('+str(lineno)+') '+err+': '+line
else:
errfunc = lambda lineno, line, err: None
 
def ini_read(f, errfunc = errfunc):
try:
r = open(f,'r')
ll = r.readlines()
d = {}
dd = {'':d}
for i in xrange(len(ll)):
l = ll[i]
l = l.strip()
if not l:
continue
if l[0] == '#':
continue
if l[0] == '[':
if l[-1] != ']':
errfunc(i,l,'syntax error')
continue
l1 = l[1:-1].strip().lower()
if not l1:
errfunc(i,l,'syntax error')
continue
if dd.has_key(l1):
errfunc(i,l,'duplicate section')
d = dd[l1]
continue
d = {}
dd[l1] = d
continue
try:
k,v = l.split('=',1)
except:
try:
k,v = l.split(':',1)
except:
errfunc(i,l,'syntax error')
continue
k = k.strip().lower()
v = v.strip()
if len(v) > 1 and ( (v[0] == '"' and v[-1] == '"') or
(v[0] == "'" and v[-1] == "'") ):
v = v[1:-1]
if not k:
errfunc(i,l,'syntax error')
continue
if d.has_key(k):
errfunc(i,l,'duplicate entry')
continue
d[k] = v
if DEBUG:
print dd
except:
if DEBUG:
print_exc()
dd = None
try:
r.close()
except:
pass
return dd
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/iprangeparse.py
0,0 → 1,194
# Written by John Hoffman
# see LICENSE.txt for license information
 
from bisect import bisect, insort
 
try:
True
except:
True = 1
False = 0
bool = lambda x: not not x
 
 
def to_long_ipv4(ip):
ip = ip.split('.')
if len(ip) != 4:
raise ValueError, "bad address"
b = 0L
for n in ip:
b *= 256
b += int(n)
return b
 
 
def to_long_ipv6(ip):
if ip == '':
raise ValueError, "bad address"
if ip == '::': # boundary handling
ip = ''
elif ip[:2] == '::':
ip = ip[1:]
elif ip[0] == ':':
raise ValueError, "bad address"
elif ip[-2:] == '::':
ip = ip[:-1]
elif ip[-1] == ':':
raise ValueError, "bad address"
 
b = []
doublecolon = False
for n in ip.split(':'):
if n == '': # double-colon
if doublecolon:
raise ValueError, "bad address"
doublecolon = True
b.append(None)
continue
if n.find('.') >= 0: # IPv4
n = n.split('.')
if len(n) != 4:
raise ValueError, "bad address"
for i in n:
b.append(int(i))
continue
n = ('0'*(4-len(n))) + n
b.append(int(n[:2],16))
b.append(int(n[2:],16))
bb = 0L
for n in b:
if n is None:
for i in xrange(17-len(b)):
bb *= 256
continue
bb *= 256
bb += n
return bb
 
ipv4addrmask = 65535L*256*256*256*256
 
class IP_List:
def __init__(self):
self.ipv4list = [] # starts of ranges
self.ipv4dict = {} # start: end of ranges
self.ipv6list = [] # "
self.ipv6dict = {} # "
 
def __nonzero__(self):
return bool(self.ipv4list or self.ipv6list)
 
 
def append(self, ip_beg, ip_end = None):
if ip_end is None:
ip_end = ip_beg
else:
assert ip_beg <= ip_end
if ip_beg.find(':') < 0: # IPv4
ip_beg = to_long_ipv4(ip_beg)
ip_end = to_long_ipv4(ip_end)
l = self.ipv4list
d = self.ipv4dict
else:
ip_beg = to_long_ipv6(ip_beg)
ip_end = to_long_ipv6(ip_end)
bb = ip_beg % (256*256*256*256)
if bb == ipv4addrmask:
ip_beg -= bb
ip_end -= bb
l = self.ipv4list
d = self.ipv4dict
else:
l = self.ipv6list
d = self.ipv6dict
 
pos = bisect(l,ip_beg)-1
done = pos < 0
while not done:
p = pos
while p < len(l):
range_beg = l[p]
if range_beg > ip_end+1:
done = True
break
range_end = d[range_beg]
if range_end < ip_beg-1:
p += 1
if p == len(l):
done = True
break
continue
# if neither of the above conditions is true, the ranges overlap
ip_beg = min(ip_beg, range_beg)
ip_end = max(ip_end, range_end)
del l[p]
del d[range_beg]
break
 
insort(l,ip_beg)
d[ip_beg] = ip_end
 
 
def includes(self, ip):
if not (self.ipv4list or self.ipv6list):
return False
if ip.find(':') < 0: # IPv4
ip = to_long_ipv4(ip)
l = self.ipv4list
d = self.ipv4dict
else:
ip = to_long_ipv6(ip)
bb = ip % (256*256*256*256)
if bb == ipv4addrmask:
ip -= bb
l = self.ipv4list
d = self.ipv4dict
else:
l = self.ipv6list
d = self.ipv6dict
for ip_beg in l[bisect(l,ip)-1:]:
if ip == ip_beg:
return True
ip_end = d[ip_beg]
if ip > ip_beg and ip <= ip_end:
return True
return False
 
 
# reads a list from a file in the format 'whatever:whatever:ip-ip'
# (not IPv6 compatible at all)
def read_rangelist(self, file):
f = open(file, 'r')
while True:
line = f.readline()
if not line:
break
line = line.strip()
if not line or line[0] == '#':
continue
line = line.split(':')[-1]
try:
ip1,ip2 = line.split('-')
except:
ip1 = line
ip2 = line
try:
self.append(ip1.strip(),ip2.strip())
except:
print '*** WARNING *** could not parse IP range: '+line
f.close()
 
def is_ipv4(ip):
return ip.find(':') < 0
 
def is_valid_ip(ip):
try:
if is_ipv4(ip):
a = ip.split('.')
assert len(a) == 4
for i in a:
chr(int(i))
return True
to_long_ipv6(ip)
return True
except:
return False
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/launchmanycore.py
0,0 → 1,381
#!/usr/bin/env python
 
# Written by John Hoffman
# see LICENSE.txt for license information
 
from BitTornado import PSYCO
if PSYCO.psyco:
try:
import psyco
assert psyco.__version__ >= 0x010100f0
psyco.full()
except:
pass
 
from download_bt1 import BT1Download
from RawServer import RawServer, UPnP_ERROR
from RateLimiter import RateLimiter
from ServerPortHandler import MultiHandler
from parsedir import parsedir
from natpunch import UPnP_test
from random import seed
from socket import error as socketerror
from threading import Event
from sys import argv, exit
import sys, os
from clock import clock
from __init__ import createPeerID, mapbase64, version
from cStringIO import StringIO
from traceback import print_exc
 
try:
True
except:
True = 1
False = 0
 
 
def fmttime(n):
try:
n = int(n) # n may be None or too large
assert n < 5184000 # 60 days
except:
return 'downloading'
m, s = divmod(n, 60)
h, m = divmod(m, 60)
return '%d:%02d:%02d' % (h, m, s)
 
class SingleDownload:
def __init__(self, controller, hash, response, config, myid):
self.controller = controller
self.hash = hash
self.response = response
self.config = config
self.doneflag = Event()
self.waiting = True
self.checking = False
self.working = False
self.seed = False
self.closed = False
 
self.status_msg = ''
self.status_err = ['']
self.status_errtime = 0
self.status_done = 0.0
 
self.rawserver = controller.handler.newRawServer(hash, self.doneflag)
 
d = BT1Download(self.display, self.finished, self.error,
controller.exchandler, self.doneflag, config, response,
hash, myid, self.rawserver, controller.listen_port)
self.d = d
 
def start(self):
if not self.d.saveAs(self.saveAs):
self._shutdown()
return
self._hashcheckfunc = self.d.initFiles()
if not self._hashcheckfunc:
self._shutdown()
return
self.controller.hashchecksched(self.hash)
 
 
def saveAs(self, name, length, saveas, isdir):
return self.controller.saveAs(self.hash, name, saveas, isdir)
 
def hashcheck_start(self, donefunc):
if self.is_dead():
self._shutdown()
return
self.waiting = False
self.checking = True
self._hashcheckfunc(donefunc)
 
def hashcheck_callback(self):
self.checking = False
if self.is_dead():
self._shutdown()
return
if not self.d.startEngine(ratelimiter = self.controller.ratelimiter):
self._shutdown()
return
self.d.startRerequester()
self.statsfunc = self.d.startStats()
self.rawserver.start_listening(self.d.getPortHandler())
self.working = True
 
def is_dead(self):
return self.doneflag.isSet()
 
def _shutdown(self):
self.shutdown(False)
 
def shutdown(self, quiet=True):
if self.closed:
return
self.doneflag.set()
self.rawserver.shutdown()
if self.checking or self.working:
self.d.shutdown()
self.waiting = False
self.checking = False
self.working = False
self.closed = True
self.controller.was_stopped(self.hash)
if not quiet:
self.controller.died(self.hash)
 
def display(self, activity = None, fractionDone = None):
# really only used by StorageWrapper now
if activity:
self.status_msg = activity
if fractionDone is not None:
self.status_done = float(fractionDone)
 
def finished(self):
self.seed = True
 
def error(self, msg):
if self.doneflag.isSet():
self._shutdown()
self.status_err.append(msg)
self.status_errtime = clock()
 
 
class LaunchMany:
def __init__(self, config, Output):
try:
self.config = config
self.Output = Output
 
self.torrent_dir = config['torrent_dir']
self.torrent_cache = {}
self.file_cache = {}
self.blocked_files = {}
self.scan_period = config['parse_dir_interval']
self.stats_period = config['display_interval']
 
self.torrent_list = []
self.downloads = {}
self.counter = 0
self.doneflag = Event()
 
self.hashcheck_queue = []
self.hashcheck_current = None
self.rawserver = RawServer(self.doneflag, config['timeout_check_interval'],
config['timeout'], ipv6_enable = config['ipv6_enabled'],
failfunc = self.failed, errorfunc = self.exchandler)
upnp_type = UPnP_test(config['upnp_nat_access'])
while True:
try:
self.listen_port = self.rawserver.find_and_bind(
config['minport'], config['maxport'], config['bind'],
ipv6_socket_style = config['ipv6_binds_v4'],
upnp = upnp_type, randomizer = config['random_port'])
break
except socketerror, e:
if upnp_type and e == UPnP_ERROR:
self.Output.message('WARNING: COULD NOT FORWARD VIA UPnP')
upnp_type = 0
continue
self.failed("Couldn't listen - " + str(e))
return
 
self.ratelimiter = RateLimiter(self.rawserver.add_task,
config['upload_unit_size'])
self.ratelimiter.set_upload_rate(config['max_upload_rate'])
 
self.handler = MultiHandler(self.rawserver, self.doneflag)
seed(createPeerID())
self.rawserver.add_task(self.scan, 0)
self.rawserver.add_task(self.stats, 0)
 
self.handler.listen_forever()
 
self.Output.message('shutting down')
self.hashcheck_queue = []
for hash in self.torrent_list:
self.Output.message('dropped "'+self.torrent_cache[hash]['path']+'"')
self.downloads[hash].shutdown()
self.rawserver.shutdown()
 
except:
data = StringIO()
print_exc(file = data)
Output.exception(data.getvalue())
 
 
def scan(self):
self.rawserver.add_task(self.scan, self.scan_period)
r = parsedir(self.torrent_dir, self.torrent_cache,
self.file_cache, self.blocked_files,
return_metainfo = True, errfunc = self.Output.message)
 
( self.torrent_cache, self.file_cache, self.blocked_files,
added, removed ) = r
 
for hash, data in removed.items():
self.Output.message('dropped "'+data['path']+'"')
self.remove(hash)
for hash, data in added.items():
self.Output.message('added "'+data['path']+'"')
self.add(hash, data)
 
def stats(self):
self.rawserver.add_task(self.stats, self.stats_period)
data = []
for hash in self.torrent_list:
cache = self.torrent_cache[hash]
if self.config['display_path']:
name = cache['path']
else:
name = cache['name']
size = cache['length']
d = self.downloads[hash]
progress = '0.0%'
peers = 0
seeds = 0
seedsmsg = "S"
dist = 0.0
uprate = 0.0
dnrate = 0.0
upamt = 0
dnamt = 0
t = 0
if d.is_dead():
status = 'stopped'
elif d.waiting:
status = 'waiting for hash check'
elif d.checking:
status = d.status_msg
progress = '%.1f%%' % (d.status_done*100)
else:
stats = d.statsfunc()
s = stats['stats']
if d.seed:
status = 'seeding'
progress = '100.0%'
seeds = s.numOldSeeds
seedsmsg = "s"
dist = s.numCopies
else:
if s.numSeeds + s.numPeers:
t = stats['time']
if t == 0: # unlikely
t = 0.01
status = fmttime(t)
else:
t = -1
status = 'connecting to peers'
progress = '%.1f%%' % (int(stats['frac']*1000)/10.0)
seeds = s.numSeeds
dist = s.numCopies2
dnrate = stats['down']
peers = s.numPeers
uprate = stats['up']
upamt = s.upTotal
dnamt = s.downTotal
if d.is_dead() or d.status_errtime+300 > clock():
msg = d.status_err[-1]
else:
msg = ''
 
data.append(( name, status, progress, peers, seeds, seedsmsg, dist,
uprate, dnrate, upamt, dnamt, size, t, msg ))
stop = self.Output.display(data)
if stop:
self.doneflag.set()
 
def remove(self, hash):
self.torrent_list.remove(hash)
self.downloads[hash].shutdown()
del self.downloads[hash]
def add(self, hash, data):
c = self.counter
self.counter += 1
x = ''
for i in xrange(3):
x = mapbase64[c & 0x3F]+x
c >>= 6
peer_id = createPeerID(x)
d = SingleDownload(self, hash, data['metainfo'], self.config, peer_id)
self.torrent_list.append(hash)
self.downloads[hash] = d
d.start()
 
 
def saveAs(self, hash, name, saveas, isdir):
x = self.torrent_cache[hash]
style = self.config['saveas_style']
if style == 1 or style == 3:
if saveas:
saveas = os.path.join(saveas,x['file'][:-1-len(x['type'])])
else:
saveas = x['path'][:-1-len(x['type'])]
if style == 3:
if not os.path.isdir(saveas):
try:
os.mkdir(saveas)
except:
raise OSError("couldn't create directory for "+x['path']
+" ("+saveas+")")
if not isdir:
saveas = os.path.join(saveas, name)
else:
if saveas:
saveas = os.path.join(saveas, name)
else:
saveas = os.path.join(os.path.split(x['path'])[0], name)
if isdir and not os.path.isdir(saveas):
try:
os.mkdir(saveas)
except:
raise OSError("couldn't create directory for "+x['path']
+" ("+saveas+")")
return saveas
 
 
def hashchecksched(self, hash = None):
if hash:
self.hashcheck_queue.append(hash)
if not self.hashcheck_current:
self._hashcheck_start()
 
def _hashcheck_start(self):
self.hashcheck_current = self.hashcheck_queue.pop(0)
self.downloads[self.hashcheck_current].hashcheck_start(self.hashcheck_callback)
 
def hashcheck_callback(self):
self.downloads[self.hashcheck_current].hashcheck_callback()
if self.hashcheck_queue:
self._hashcheck_start()
else:
self.hashcheck_current = None
 
def died(self, hash):
if self.torrent_cache.has_key(hash):
self.Output.message('DIED: "'+self.torrent_cache[hash]['path']+'"')
def was_stopped(self, hash):
try:
self.hashcheck_queue.remove(hash)
except:
pass
if self.hashcheck_current == hash:
self.hashcheck_current = None
if self.hashcheck_queue:
self._hashcheck_start()
 
def failed(self, s):
self.Output.message('FAILURE: '+s)
 
def exchandler(self, s):
self.Output.exception(s)
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/natpunch.py
0,0 → 1,254
# Written by John Hoffman
# derived from NATPortMapping.py by Yejun Yang
# and from example code by Myers Carpenter
# see LICENSE.txt for license information
 
import socket
from traceback import print_exc
from subnetparse import IP_List
from clock import clock
from __init__ import createPeerID
try:
True
except:
True = 1
False = 0
 
DEBUG = False
 
EXPIRE_CACHE = 30 # seconds
ID = "BT-"+createPeerID()[-4:]
 
try:
import pythoncom, win32com.client
_supported = 1
except ImportError:
_supported = 0
 
 
 
class _UPnP1: # derived from Myers Carpenter's code
# seems to use the machine's local UPnP
# system for its operation. Runs fairly fast
 
def __init__(self):
self.map = None
self.last_got_map = -10e10
 
def _get_map(self):
if self.last_got_map + EXPIRE_CACHE < clock():
try:
dispatcher = win32com.client.Dispatch("HNetCfg.NATUPnP")
self.map = dispatcher.StaticPortMappingCollection
self.last_got_map = clock()
except:
self.map = None
return self.map
 
def test(self):
try:
assert self._get_map() # make sure a map was found
success = True
except:
success = False
return success
 
 
def open(self, ip, p):
map = self._get_map()
try:
map.Add(p,'TCP',p,ip,True,ID)
if DEBUG:
print 'port opened: '+ip+':'+str(p)
success = True
except:
if DEBUG:
print "COULDN'T OPEN "+str(p)
print_exc()
success = False
return success
 
 
def close(self, p):
map = self._get_map()
try:
map.Remove(p,'TCP')
success = True
if DEBUG:
print 'port closed: '+str(p)
except:
if DEBUG:
print 'ERROR CLOSING '+str(p)
print_exc()
success = False
return success
 
 
def clean(self, retry = False):
if not _supported:
return
try:
map = self._get_map()
ports_in_use = []
for i in xrange(len(map)):
try:
mapping = map[i]
port = mapping.ExternalPort
prot = str(mapping.Protocol).lower()
desc = str(mapping.Description).lower()
except:
port = None
if port and prot == 'tcp' and desc[:3] == 'bt-':
ports_in_use.append(port)
success = True
for port in ports_in_use:
try:
map.Remove(port,'TCP')
except:
success = False
if not success and not retry:
self.clean(retry = True)
except:
pass
 
 
class _UPnP2: # derived from Yejun Yang's code
# apparently does a direct search for UPnP hardware
# may work in some cases where _UPnP1 won't, but is slow
# still need to implement "clean" method
 
def __init__(self):
self.services = None
self.last_got_services = -10e10
def _get_services(self):
if not self.services or self.last_got_services + EXPIRE_CACHE < clock():
self.services = []
try:
f=win32com.client.Dispatch("UPnP.UPnPDeviceFinder")
for t in ( "urn:schemas-upnp-org:service:WANIPConnection:1",
"urn:schemas-upnp-org:service:WANPPPConnection:1" ):
try:
conns = f.FindByType(t,0)
for c in xrange(len(conns)):
try:
svcs = conns[c].Services
for s in xrange(len(svcs)):
try:
self.services.append(svcs[s])
except:
pass
except:
pass
except:
pass
except:
pass
self.last_got_services = clock()
return self.services
 
def test(self):
try:
assert self._get_services() # make sure some services can be found
success = True
except:
success = False
return success
 
 
def open(self, ip, p):
svcs = self._get_services()
success = False
for s in svcs:
try:
s.InvokeAction('AddPortMapping',['',p,'TCP',p,ip,True,ID,0],'')
success = True
except:
pass
if DEBUG and not success:
print "COULDN'T OPEN "+str(p)
print_exc()
return success
 
 
def close(self, p):
svcs = self._get_services()
success = False
for s in svcs:
try:
s.InvokeAction('DeletePortMapping', ['',p,'TCP'], '')
success = True
except:
pass
if DEBUG and not success:
print "COULDN'T OPEN "+str(p)
print_exc()
return success
 
 
class _UPnP: # master holding class
def __init__(self):
self.upnp1 = _UPnP1()
self.upnp2 = _UPnP2()
self.upnplist = (None, self.upnp1, self.upnp2)
self.upnp = None
self.local_ip = None
self.last_got_ip = -10e10
def get_ip(self):
if self.last_got_ip + EXPIRE_CACHE < clock():
local_ips = IP_List()
local_ips.set_intranet_addresses()
try:
for info in socket.getaddrinfo(socket.gethostname(),0,socket.AF_INET):
# exception if socket library isn't recent
self.local_ip = info[4][0]
if local_ips.includes(self.local_ip):
self.last_got_ip = clock()
if DEBUG:
print 'Local IP found: '+self.local_ip
break
else:
raise ValueError('couldn\'t find intranet IP')
except:
self.local_ip = None
if DEBUG:
print 'Error finding local IP'
print_exc()
return self.local_ip
 
def test(self, upnp_type):
if DEBUG:
print 'testing UPnP type '+str(upnp_type)
if not upnp_type or not _supported or self.get_ip() is None:
if DEBUG:
print 'not supported'
return 0
pythoncom.CoInitialize() # leave initialized
self.upnp = self.upnplist[upnp_type] # cache this
if self.upnp.test():
if DEBUG:
print 'ok'
return upnp_type
if DEBUG:
print 'tested bad'
return 0
 
def open(self, p):
assert self.upnp, "must run UPnP_test() with the desired UPnP access type first"
return self.upnp.open(self.get_ip(), p)
 
def close(self, p):
assert self.upnp, "must run UPnP_test() with the desired UPnP access type first"
return self.upnp.close(p)
 
def clean(self):
return self.upnp1.clean()
 
_upnp_ = _UPnP()
 
UPnP_test = _upnp_.test
UPnP_open_port = _upnp_.open
UPnP_close_port = _upnp_.close
UPnP_reset = _upnp_.clean
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/parseargs.py
0,0 → 1,137
# Written by Bill Bumgarner and Bram Cohen
# see LICENSE.txt for license information
 
from types import *
from cStringIO import StringIO
 
 
def splitLine(line, COLS=80, indent=10):
indent = " " * indent
width = COLS - (len(indent) + 1)
if indent and width < 15:
width = COLS - 2
indent = " "
s = StringIO()
i = 0
for word in line.split():
if i == 0:
s.write(indent+word)
i = len(word)
continue
if i + len(word) >= width:
s.write('\n'+indent+word)
i = len(word)
continue
s.write(' '+word)
i += len(word) + 1
return s.getvalue()
 
def formatDefinitions(options, COLS, presets = {}):
s = StringIO()
for (longname, default, doc) in options:
s.write('--' + longname + ' <arg>\n')
default = presets.get(longname, default)
if type(default) in (IntType, LongType):
try:
default = int(default)
except:
pass
if default is not None:
doc += ' (defaults to ' + repr(default) + ')'
s.write(splitLine(doc,COLS,10))
s.write('\n\n')
return s.getvalue()
 
 
def usage(str):
raise ValueError(str)
 
 
def defaultargs(options):
l = {}
for (longname, default, doc) in options:
if default is not None:
l[longname] = default
return l
 
def parseargs(argv, options, minargs = None, maxargs = None, presets = {}):
config = {}
longkeyed = {}
for option in options:
longname, default, doc = option
longkeyed[longname] = option
config[longname] = default
for longname in presets.keys(): # presets after defaults but before arguments
config[longname] = presets[longname]
options = []
args = []
pos = 0
while pos < len(argv):
if argv[pos][:2] != '--':
args.append(argv[pos])
pos += 1
else:
if pos == len(argv) - 1:
usage('parameter passed in at end with no value')
key, value = argv[pos][2:], argv[pos+1]
pos += 2
if not longkeyed.has_key(key):
usage('unknown key --' + key)
longname, default, doc = longkeyed[key]
try:
t = type(config[longname])
if t is NoneType or t is StringType:
config[longname] = value
elif t in (IntType, LongType):
config[longname] = long(value)
elif t is FloatType:
config[longname] = float(value)
else:
assert 0
except ValueError, e:
usage('wrong format of --%s - %s' % (key, str(e)))
for key, value in config.items():
if value is None:
usage("Option --%s is required." % key)
if minargs is not None and len(args) < minargs:
usage("Must supply at least %d args." % minargs)
if maxargs is not None and len(args) > maxargs:
usage("Too many args - %d max." % maxargs)
return (config, args)
 
def test_parseargs():
assert parseargs(('d', '--a', 'pq', 'e', '--b', '3', '--c', '4.5', 'f'), (('a', 'x', ''), ('b', 1, ''), ('c', 2.3, ''))) == ({'a': 'pq', 'b': 3, 'c': 4.5}, ['d', 'e', 'f'])
assert parseargs([], [('a', 'x', '')]) == ({'a': 'x'}, [])
assert parseargs(['--a', 'x', '--a', 'y'], [('a', '', '')]) == ({'a': 'y'}, [])
try:
parseargs([], [('a', 'x', '')])
except ValueError:
pass
try:
parseargs(['--a', 'x'], [])
except ValueError:
pass
try:
parseargs(['--a'], [('a', 'x', '')])
except ValueError:
pass
try:
parseargs([], [], 1, 2)
except ValueError:
pass
assert parseargs(['x'], [], 1, 2) == ({}, ['x'])
assert parseargs(['x', 'y'], [], 1, 2) == ({}, ['x', 'y'])
try:
parseargs(['x', 'y', 'z'], [], 1, 2)
except ValueError:
pass
try:
parseargs(['--a', '2.0'], [('a', 3, '')])
except ValueError:
pass
try:
parseargs(['--a', 'z'], [('a', 2.1, '')])
except ValueError:
pass
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/parsedir.py
0,0 → 1,150
# Written by John Hoffman and Uoti Urpala
# see LICENSE.txt for license information
from bencode import bencode, bdecode
from BT1.btformats import check_info
from os.path import exists, isfile
from sha import sha
import sys, os
 
try:
True
except:
True = 1
False = 0
 
NOISY = False
 
def _errfunc(x):
print ":: "+x
 
def parsedir(directory, parsed, files, blocked,
exts = ['.torrent'], return_metainfo = False, errfunc = _errfunc):
if NOISY:
errfunc('checking dir')
dirs_to_check = [directory]
new_files = {}
new_blocked = {}
torrent_type = {}
while dirs_to_check: # first, recurse directories and gather torrents
directory = dirs_to_check.pop()
newtorrents = False
for f in os.listdir(directory):
newtorrent = None
for ext in exts:
if f.endswith(ext):
newtorrent = ext[1:]
break
if newtorrent:
newtorrents = True
p = os.path.join(directory, f)
new_files[p] = [(os.path.getmtime(p), os.path.getsize(p)), 0]
torrent_type[p] = newtorrent
if not newtorrents:
for f in os.listdir(directory):
p = os.path.join(directory, f)
if os.path.isdir(p):
dirs_to_check.append(p)
 
new_parsed = {}
to_add = []
added = {}
removed = {}
# files[path] = [(modification_time, size), hash], hash is 0 if the file
# has not been successfully parsed
for p,v in new_files.items(): # re-add old items and check for changes
oldval = files.get(p)
if not oldval: # new file
to_add.append(p)
continue
h = oldval[1]
if oldval[0] == v[0]: # file is unchanged from last parse
if h:
if blocked.has_key(p): # parseable + blocked means duplicate
to_add.append(p) # other duplicate may have gone away
else:
new_parsed[h] = parsed[h]
new_files[p] = oldval
else:
new_blocked[p] = 1 # same broken unparseable file
continue
if parsed.has_key(h) and not blocked.has_key(p):
if NOISY:
errfunc('removing '+p+' (will re-add)')
removed[h] = parsed[h]
to_add.append(p)
 
to_add.sort()
for p in to_add: # then, parse new and changed torrents
new_file = new_files[p]
v,h = new_file
if new_parsed.has_key(h): # duplicate
if not blocked.has_key(p) or files[p][0] != v:
errfunc('**warning** '+
p +' is a duplicate torrent for '+new_parsed[h]['path'])
new_blocked[p] = 1
continue
if NOISY:
errfunc('adding '+p)
try:
ff = open(p, 'rb')
d = bdecode(ff.read())
check_info(d['info'])
h = sha(bencode(d['info'])).digest()
new_file[1] = h
if new_parsed.has_key(h):
errfunc('**warning** '+
p +' is a duplicate torrent for '+new_parsed[h]['path'])
new_blocked[p] = 1
continue
 
a = {}
a['path'] = p
f = os.path.basename(p)
a['file'] = f
a['type'] = torrent_type[p]
i = d['info']
l = 0
nf = 0
if i.has_key('length'):
l = i.get('length',0)
nf = 1
elif i.has_key('files'):
for li in i['files']:
nf += 1
if li.has_key('length'):
l += li['length']
a['numfiles'] = nf
a['length'] = l
a['name'] = i.get('name', f)
def setkey(k, d = d, a = a):
if d.has_key(k):
a[k] = d[k]
setkey('failure reason')
setkey('warning message')
setkey('announce-list')
if return_metainfo:
a['metainfo'] = d
except:
errfunc('**warning** '+p+' has errors')
new_blocked[p] = 1
continue
try:
ff.close()
except:
pass
if NOISY:
errfunc('... successful')
new_parsed[h] = a
added[h] = a
 
for p,v in files.items(): # and finally, mark removed torrents
if not new_files.has_key(p) and not blocked.has_key(p):
if NOISY:
errfunc('removing '+p)
removed[v[1]] = parsed[v[1]]
 
if NOISY:
errfunc('done checking')
return (new_parsed, new_files, new_blocked, added, removed)
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/piecebuffer.py
0,0 → 1,86
# Written by John Hoffman
# see LICENSE.txt for license information
 
from array import array
from threading import Lock
# import inspect
try:
True
except:
True = 1
False = 0
DEBUG = False
 
class SingleBuffer:
def __init__(self, pool):
self.pool = pool
self.buf = array('c')
 
def init(self):
if DEBUG:
print self.count
'''
for x in xrange(6,1,-1):
try:
f = inspect.currentframe(x).f_code
print (f.co_filename,f.co_firstlineno,f.co_name)
del f
except:
pass
print ''
'''
self.length = 0
 
def append(self, s):
l = self.length+len(s)
self.buf[self.length:l] = array('c',s)
self.length = l
 
def __len__(self):
return self.length
 
def __getslice__(self, a, b):
if b > self.length:
b = self.length
if b < 0:
b += self.length
if a == 0 and b == self.length and len(self.buf) == b:
return self.buf # optimization
return self.buf[a:b]
 
def getarray(self):
return self.buf[:self.length]
 
def release(self):
if DEBUG:
print -self.count
self.pool.release(self)
 
 
class BufferPool:
def __init__(self):
self.pool = []
self.lock = Lock()
if DEBUG:
self.count = 0
 
def new(self):
self.lock.acquire()
if self.pool:
x = self.pool.pop()
else:
x = SingleBuffer(self)
if DEBUG:
self.count += 1
x.count = self.count
x.init()
self.lock.release()
return x
 
def release(self, x):
self.pool.append(x)
 
 
_pool = BufferPool()
PieceBuffer = _pool.new
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/selectpoll.py
0,0 → 1,109
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from select import select, error
from time import sleep
from types import IntType
from bisect import bisect
POLLIN = 1
POLLOUT = 2
POLLERR = 8
POLLHUP = 16
 
class poll:
def __init__(self):
self.rlist = []
self.wlist = []
def register(self, f, t):
if type(f) != IntType:
f = f.fileno()
if (t & POLLIN):
insert(self.rlist, f)
else:
remove(self.rlist, f)
if (t & POLLOUT):
insert(self.wlist, f)
else:
remove(self.wlist, f)
 
def unregister(self, f):
if type(f) != IntType:
f = f.fileno()
remove(self.rlist, f)
remove(self.wlist, f)
 
def poll(self, timeout = None):
if self.rlist or self.wlist:
try:
r, w, e = select(self.rlist, self.wlist, [], timeout)
except ValueError:
return None
else:
sleep(timeout)
return []
result = []
for s in r:
result.append((s, POLLIN))
for s in w:
result.append((s, POLLOUT))
return result
 
def remove(list, item):
i = bisect(list, item)
if i > 0 and list[i-1] == item:
del list[i-1]
 
def insert(list, item):
i = bisect(list, item)
if i == 0 or list[i-1] != item:
list.insert(i, item)
 
def test_remove():
x = [2, 4, 6]
remove(x, 2)
assert x == [4, 6]
x = [2, 4, 6]
remove(x, 4)
assert x == [2, 6]
x = [2, 4, 6]
remove(x, 6)
assert x == [2, 4]
x = [2, 4, 6]
remove(x, 5)
assert x == [2, 4, 6]
x = [2, 4, 6]
remove(x, 1)
assert x == [2, 4, 6]
x = [2, 4, 6]
remove(x, 7)
assert x == [2, 4, 6]
x = [2, 4, 6]
remove(x, 5)
assert x == [2, 4, 6]
x = []
remove(x, 3)
assert x == []
 
def test_insert():
x = [2, 4]
insert(x, 1)
assert x == [1, 2, 4]
x = [2, 4]
insert(x, 3)
assert x == [2, 3, 4]
x = [2, 4]
insert(x, 5)
assert x == [2, 4, 5]
x = [2, 4]
insert(x, 2)
assert x == [2, 4]
x = [2, 4]
insert(x, 4)
assert x == [2, 4]
x = [2, 3, 4]
insert(x, 3)
assert x == [2, 3, 4]
x = []
insert(x, 3)
assert x == [3]
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/subnetparse.py
0,0 → 1,218
# Written by John Hoffman
# see LICENSE.txt for license information
 
from bisect import bisect, insort
 
try:
True
except:
True = 1
False = 0
bool = lambda x: not not x
 
hexbinmap = {
'0': '0000',
'1': '0001',
'2': '0010',
'3': '0011',
'4': '0100',
'5': '0101',
'6': '0110',
'7': '0111',
'8': '1000',
'9': '1001',
'a': '1010',
'b': '1011',
'c': '1100',
'd': '1101',
'e': '1110',
'f': '1111',
'x': '0000',
}
 
chrbinmap = {}
for n in xrange(256):
b = []
nn = n
for i in xrange(8):
if nn & 0x80:
b.append('1')
else:
b.append('0')
nn <<= 1
chrbinmap[n] = ''.join(b)
 
 
def to_bitfield_ipv4(ip):
ip = ip.split('.')
if len(ip) != 4:
raise ValueError, "bad address"
b = []
for i in ip:
b.append(chrbinmap[int(i)])
return ''.join(b)
 
def to_bitfield_ipv6(ip):
b = ''
doublecolon = False
 
if ip == '':
raise ValueError, "bad address"
if ip == '::': # boundary handling
ip = ''
elif ip[:2] == '::':
ip = ip[1:]
elif ip[0] == ':':
raise ValueError, "bad address"
elif ip[-2:] == '::':
ip = ip[:-1]
elif ip[-1] == ':':
raise ValueError, "bad address"
for n in ip.split(':'):
if n == '': # double-colon
if doublecolon:
raise ValueError, "bad address"
doublecolon = True
b += ':'
continue
if n.find('.') >= 0: # IPv4
n = to_bitfield_ipv4(n)
b += n + '0'*(32-len(n))
continue
n = ('x'*(4-len(n))) + n
for i in n:
b += hexbinmap[i]
if doublecolon:
pos = b.find(':')
b = b[:pos]+('0'*(129-len(b)))+b[pos+1:]
if len(b) != 128: # always check size
raise ValueError, "bad address"
return b
 
ipv4addrmask = to_bitfield_ipv6('::ffff:0:0')[:96]
 
class IP_List:
def __init__(self):
self.ipv4list = []
self.ipv6list = []
 
def __nonzero__(self):
return bool(self.ipv4list or self.ipv6list)
 
 
def append(self, ip, depth = 256):
if ip.find(':') < 0: # IPv4
insort(self.ipv4list,to_bitfield_ipv4(ip)[:depth])
else:
b = to_bitfield_ipv6(ip)
if b.startswith(ipv4addrmask):
insort(self.ipv4list,b[96:][:depth-96])
else:
insort(self.ipv6list,b[:depth])
 
 
def includes(self, ip):
if not (self.ipv4list or self.ipv6list):
return False
if ip.find(':') < 0: # IPv4
b = to_bitfield_ipv4(ip)
else:
b = to_bitfield_ipv6(ip)
if b.startswith(ipv4addrmask):
b = b[96:]
if len(b) > 32:
l = self.ipv6list
else:
l = self.ipv4list
for map in l[bisect(l,b)-1:]:
if b.startswith(map):
return True
if map > b:
return False
return False
 
 
def read_fieldlist(self, file): # reads a list from a file in the format 'ip/len <whatever>'
f = open(file, 'r')
while True:
line = f.readline()
if not line:
break
line = line.strip().expandtabs()
if not line or line[0] == '#':
continue
try:
line, garbage = line.split(' ',1)
except:
pass
try:
line, garbage = line.split('#',1)
except:
pass
try:
ip, depth = line.split('/')
except:
ip = line
depth = None
try:
if depth is not None:
depth = int(depth)
self.append(ip,depth)
except:
print '*** WARNING *** could not parse IP range: '+line
f.close()
 
 
def set_intranet_addresses(self):
self.append('127.0.0.1',8)
self.append('10.0.0.0',8)
self.append('172.16.0.0',12)
self.append('192.168.0.0',16)
self.append('169.254.0.0',16)
self.append('::1')
self.append('fe80::',16)
self.append('fec0::',16)
 
def set_ipv4_addresses(self):
self.append('::ffff:0:0',96)
 
def ipv6_to_ipv4(ip):
ip = to_bitfield_ipv6(ip)
if not ip.startswith(ipv4addrmask):
raise ValueError, "not convertible to IPv4"
ip = ip[-32:]
x = ''
for i in range(4):
x += str(int(ip[:8],2))
if i < 3:
x += '.'
ip = ip[8:]
return x
 
def to_ipv4(ip):
if is_ipv4(ip):
_valid_ipv4(ip)
return ip
return ipv6_to_ipv4(ip)
 
def is_ipv4(ip):
return ip.find(':') < 0
 
def _valid_ipv4(ip):
ip = ip.split('.')
if len(ip) != 4:
raise ValueError
for i in ip:
chr(int(i))
 
def is_valid_ip(ip):
try:
if not ip:
return False
if is_ipv4(ip):
_valid_ipv4(ip)
return True
to_bitfield_ipv6(ip)
return True
except:
return False
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/torrentlistparse.py
0,0 → 1,38
# Written by John Hoffman
# see LICENSE.txt for license information
 
from binascii import unhexlify
 
try:
True
except:
True = 1
False = 0
 
 
# parses a list of torrent hashes, in the format of one hash per line in hex format
 
def parsetorrentlist(filename, parsed):
new_parsed = {}
added = {}
removed = parsed
f = open(filename, 'r')
while True:
l = f.readline()
if not l:
break
l = l.strip()
try:
if len(l) != 40:
raise ValueError, 'bad line'
h = unhexlify(l)
except:
print '*** WARNING *** could not parse line in torrent list: '+l
if parsed.has_key(h):
del removed[h]
else:
added[h] = True
new_parsed[h] = True
f.close()
return (new_parsed, added, removed)
 
/web/kaklik's_web/torrentflux/TF_BitTornado/BitTornado/zurllib.py
0,0 → 1,100
# Written by John Hoffman
# see LICENSE.txt for license information
 
from httplib import HTTPConnection, HTTPSConnection, HTTPException
from urlparse import urlparse
from bencode import bdecode
import socket
from gzip import GzipFile
from StringIO import StringIO
from urllib import quote, unquote
from __init__ import product_name, version_short
 
VERSION = product_name+'/'+version_short
MAX_REDIRECTS = 10
 
 
class btHTTPcon(HTTPConnection): # attempt to add automatic connection timeout
def connect(self):
HTTPConnection.connect(self)
try:
self.sock.settimeout(30)
except:
pass
 
class btHTTPScon(HTTPSConnection): # attempt to add automatic connection timeout
def connect(self):
HTTPSConnection.connect(self)
try:
self.sock.settimeout(30)
except:
pass
 
class urlopen:
def __init__(self, url):
self.tries = 0
self._open(url.strip())
self.error_return = None
 
def _open(self, url):
self.tries += 1
if self.tries > MAX_REDIRECTS:
raise IOError, ('http error', 500,
"Internal Server Error: Redirect Recursion")
(scheme, netloc, path, pars, query, fragment) = urlparse(url)
if scheme != 'http' and scheme != 'https':
raise IOError, ('url error', 'unknown url type', scheme, url)
url = path
if pars:
url += ';'+pars
if query:
url += '?'+query
# if fragment:
try:
if scheme == 'http':
self.connection = btHTTPcon(netloc)
else:
self.connection = btHTTPScon(netloc)
self.connection.request('GET', url, None,
{ 'User-Agent': VERSION,
'Accept-Encoding': 'gzip' } )
self.response = self.connection.getresponse()
except HTTPException, e:
raise IOError, ('http error', str(e))
status = self.response.status
if status in (301,302):
try:
self.connection.close()
except:
pass
self._open(self.response.getheader('Location'))
return
if status != 200:
try:
data = self._read()
d = bdecode(data)
if d.has_key('failure reason'):
self.error_return = data
return
except:
pass
raise IOError, ('http error', status, self.response.reason)
 
def read(self):
if self.error_return:
return self.error_return
return self._read()
 
def _read(self):
data = self.response.read()
if self.response.getheader('Content-Encoding','').find('gzip') >= 0:
try:
compressed = StringIO(data)
f = GzipFile(fileobj = compressed)
data = f.read()
except:
raise IOError, ('http error', 'got corrupt response')
return data
 
def close(self):
self.connection.close()
/web/kaklik's_web/torrentflux/TF_BitTornado/btmakemetafile.py
0,0 → 1,41
#!/usr/bin/env python
 
# Written by Bram Cohen
# multitracker extensions by John Hoffman
# see LICENSE.txt for license information
 
from BitTornado import PSYCO
if PSYCO.psyco:
try:
import psyco
assert psyco.__version__ >= 0x010100f0
psyco.full()
except:
pass
 
from sys import argv, version, exit
from os.path import split
assert version >= '2', "Install Python 2.0 or greater"
from BitTornado.BT1.makemetafile import make_meta_file, defaults, print_announcelist_details
from BitTornado.parseargs import parseargs, formatDefinitions
 
 
def prog(amount):
print '%.1f%% complete\r' % (amount * 100),
 
if len(argv) < 3:
a,b = split(argv[0])
print 'Usage: ' + b + ' <trackerurl> <file> [file...] [params...]'
print
print formatDefinitions(defaults, 80)
print_announcelist_details()
print ('')
exit(2)
 
try:
config, args = parseargs(argv[1:], defaults, 2, None)
for file in args[1:]:
make_meta_file(file, args[0], config, progress = prog)
except ValueError, e:
print 'error: ' + str(e)
print 'run with no args for parameter explanations'
/web/kaklik's_web/torrentflux/TF_BitTornado/btphptornado.py
0,0 → 1,451
#!/usr/bin/env python
 
# Written by Bram Cohen
# see LICENSE.txt for license information
 
from BitTornado import PSYCO
if PSYCO.psyco:
try:
import psyco
assert psyco.__version__ >= 0x010100f0
psyco.full()
except:
pass
from BitTornado.download_bt1 import BT1Download, defaults, parse_params, get_usage, get_response
from BitTornado.RawServer import RawServer, UPnP_ERROR
from random import seed
from socket import error as socketerror
from BitTornado.bencode import bencode
from BitTornado.natpunch import UPnP_test
from threading import Event
from os.path import abspath
from os import getpid, remove
from sys import argv, stdout
import sys
from sha import sha
from time import strftime
from BitTornado.clock import clock
from BitTornado import createPeerID, version
 
assert sys.version >= '2', "Install Python 2.0 or greater"
try:
True
except:
True = 1
False = 0
 
PROFILER = False
 
if __debug__: LOGFILE=open(argv[3]+"."+str(getpid()),"w")
 
def traceMsg(msg):
try:
if __debug__:
LOGFILE.write(msg + "\n")
LOGFILE.flush()
except:
return
 
def hours(n):
if n == 0:
return 'complete!'
try:
n = int(n)
assert n >= 0 and n < 5184000 # 60 days
except:
return '<unknown>'
m, s = divmod(n, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
if d > 0:
return '%dd %02d:%02d:%02d' % (d, h, m, s)
else:
return '%02d:%02d:%02d' % (h, m, s)
 
class HeadlessDisplayer:
def __init__(self):
self.done = False
self.file = ''
self.percentDone = ''
self.timeEst = 'Connecting to Peers'
self.downloadTo = ''
self.downRate = ''
self.upRate = ''
self.shareRating = ''
self.percentShare = ''
self.upTotal = 0
self.downTotal = 0
self.seedStatus = ''
self.peerStatus = ''
self.seeds = ''
self.peers = ''
self.errors = []
self.last_update_time = -1
self.statFile = 'percent.txt'
self.autoShutdown = 'False'
self.user = 'unknown'
self.size = 0
self.shareKill = '100'
self.distcopy = ''
self.stoppedAt = ''
 
def finished(self):
if __debug__: traceMsg('finished - begin')
self.done = True
self.percentDone = '100'
self.timeEst = 'Download Succeeded!'
self.downRate = ''
self.display()
if self.autoShutdown == 'True':
self.upRate = ''
if self.stoppedAt == '':
self.writeStatus()
if __debug__: traceMsg('finished - end - raised ki')
raise KeyboardInterrupt
if __debug__: traceMsg('finished - end')
 
def failed(self):
if __debug__: traceMsg('failed - begin')
self.done = True
self.percentDone = '0'
self.timeEst = 'Download Failed!'
self.downRate = ''
self.display()
if self.autoShutdown == 'True':
self.upRate = ''
if self.stoppedAt == '':
self.writeStatus()
if __debug__:traceMsg('failed - end - raised ki')
raise KeyboardInterrupt
if __debug__: traceMsg('failed - end')
 
def error(self, errormsg):
self.errors.append(errormsg)
self.display()
 
def display(self, dpflag = Event(), fractionDone = None, timeEst = None,
downRate = None, upRate = None, activity = None,
statistics = None, **kws):
if __debug__: traceMsg('display - begin')
if self.last_update_time + 0.1 > clock() and fractionDone not in (0.0, 1.0) and activity is not None:
return
self.last_update_time = clock()
if fractionDone is not None:
self.percentDone = str(float(int(fractionDone * 1000)) / 10)
if timeEst is not None:
self.timeEst = hours(timeEst)
if activity is not None and not self.done:
self.timeEst = activity
if downRate is not None:
self.downRate = '%.1f kB/s' % (float(downRate) / (1 << 10))
if upRate is not None:
self.upRate = '%.1f kB/s' % (float(upRate) / (1 << 10))
if statistics is not None:
if (statistics.shareRating < 0) or (statistics.shareRating > 100):
self.shareRating = 'oo (%.1f MB up / %.1f MB down)' % (float(statistics.upTotal) / (1<<20), float(statistics.downTotal) / (1<<20))
self.downTotal = statistics.downTotal
self.upTotal = statistics.upTotal
else:
self.shareRating = '%.3f (%.1f MB up / %.1f MB down)' % (statistics.shareRating, float(statistics.upTotal) / (1<<20), float(statistics.downTotal) / (1<<20))
self.downTotal = statistics.downTotal
self.upTotal = statistics.upTotal
if not self.done:
self.seedStatus = '%d seen now, plus %.3f distributed copies' % (statistics.numSeeds,0.001*int(1000*statistics.numCopies))
self.seeds = (str(statistics.numSeeds))
else:
self.seedStatus = '%d seen recently, plus %.3f distributed copies' % (statistics.numOldSeeds,0.001*int(1000*statistics.numCopies))
self.seeds = (str(statistics.numOldSeeds))
 
self.peers = '%d' % (statistics.numPeers)
self.distcopy = '%.3f' % (0.001*int(1000*statistics.numCopies))
self.peerStatus = '%d seen now, %.1f%% done at %.1f kB/s' % (statistics.numPeers,statistics.percentDone,float(statistics.torrentRate) / (1 << 10))
 
dpflag.set()
 
if __debug__: traceMsg('display - prior to self.write')
 
if self.stoppedAt == '':
self.writeStatus()
 
if __debug__: traceMsg('display - end')
 
def chooseFile(self, default, size, saveas, dir):
if __debug__: traceMsg('chooseFile - begin')
 
self.file = '%s (%.1f MB)' % (default, float(size) / (1 << 20))
self.size = size
if saveas != '':
default = saveas
self.downloadTo = abspath(default)
if __debug__: traceMsg('chooseFile - end')
return default
 
def writeStatus(self):
if __debug__: traceMsg('writeStatus - begin')
downRate = self.downTotal
die = False
 
try:
f=open(self.statFile,'r')
running = f.read(1)
f.close
except:
running = 0
self.timeEst = 'Failed To Open StatFile'
if __debug__: traceMsg('writeStatus - Failed to Open StatFile')
 
if __debug__: traceMsg('writeStatus - running :' + str(running))
if __debug__: traceMsg('writeStatus - stoppedAt :' + self.stoppedAt)
 
if running == '0':
if self.stoppedAt == '':
if self.percentDone == '100':
self.stoppedAt = '100'
else:
self.stoppedAt = str((float(self.percentDone)+100)*-1)
self.timeEst = 'Torrent Stopped'
die = True
self.upRate = ''
self.downRate = ''
self.percentDone = self.stoppedAt
else:
if downRate == 0 and self.upTotal > 0:
downRate = self.size
if self.done:
self.percentDone = '100'
downRate = self.size
if self.autoShutdown == 'True':
running = '0'
if self.upTotal > 0:
self.percentShare = '%.1f' % ((float(self.upTotal)/float(downRate))*100)
else:
self.percentShare = '0.0'
if self.done and self.percentShare is not '' and self.autoShutdown == 'False':
if (float(self.percentShare) >= float(self.shareKill)) and (self.shareKill != '0'):
die = True
running = '0'
self.upRate = ''
elif (not self.done) and (self.timeEst == 'complete!') and (self.percentDone == '100.0'):
if (float(self.percentShare) >= float(self.shareKill)) and (self.shareKill != '0'):
die = True
running = '0'
self.upRate = ''
#self.finished()
 
lcount = 0
while 1:
lcount += 1
try:
f=open(self.statFile,'w')
f.write(running + '\n')
f.write(self.percentDone + '\n')
f.write(self.timeEst + '\n')
f.write(self.downRate + '\n')
f.write(self.upRate + '\n')
f.write(self.user + '\n')
f.write(self.seeds + '+' + self.distcopy + '\n')
f.write(self.peers + '\n')
f.write(self.percentShare + '\n')
f.write(self.shareKill + '\n')
f.write(str(self.upTotal) + '\n')
f.write(str(self.downTotal) + '\n')
f.write(str(self.size))
 
try:
errs = []
errs = self.scrub_errs()
 
for errmsg in errs:
f.write('\n' + errmsg)
except:
if __debug__: traceMsg('writeStatus - Failed during writing Errors')
pass
 
f.flush()
f.close()
 
break
except:
if __debug__: traceMsg('writeStatus - Failed to Open StatFile for Writing')
if lcount > 30:
break
pass
 
if die:
if __debug__: traceMsg('writeStatus - dieing - raised ki')
raise KeyboardInterrupt
 
def newpath(self, path):
self.downloadTo = path
 
def scrub_errs(self):
new_errors = []
 
try:
if self.errors:
last_errMsg = ''
errCount = 0
for err in self.errors:
try:
if last_errMsg == '':
last_errMsg = err
elif last_errMsg == err:
errCount += 1
elif last_errMsg != err:
if errCount > 0:
new_errors.append(last_errMsg + ' (x' + str(errCount+1) + ')')
else:
new_errors.append(last_errMsg)
errCount = 0
last_errMsg = err
except:
if __debug__: traceMsg('scrub_errs - Failed scrub')
pass
 
try:
if len(new_errors) > 0:
if last_errMsg != new_errors[len(new_errors)-1]:
if errCount > 0:
new_errors.append(last_errMsg + ' (x' + str(errCount+1) + ')')
else:
new_errors.append(last_errMsg)
else:
if errCount > 0:
new_errors.append(last_errMsg + ' (x' + str(errCount+1) + ')')
else:
new_errors.append(last_errMsg)
except:
if __debug__: traceMsg('scrub_errs - Failed during scrub last Msg ')
pass
 
if len(self.errors) > 100:
while len(self.errors) > 100 :
del self.errors[0:99]
self.errors = new_errors
 
except:
if __debug__: traceMsg('scrub_errs - Failed during scrub Errors')
pass
 
return new_errors
 
def run(autoDie,shareKill,statusFile,userName,params):
 
if __debug__: traceMsg('run - begin')
 
try:
f=open(statusFile+".pid",'w')
f.write(str(getpid()).strip() + "\n")
f.flush()
f.close()
except:
if __debug__: traceMsg('run - Failed to Create PID file')
pass
 
try:
 
h = HeadlessDisplayer()
h.statFile = statusFile
h.autoShutdown = autoDie
h.shareKill = shareKill
h.user = userName
while 1:
try:
config = parse_params(params)
except ValueError, e:
print 'error: ' + str(e) + '\nrun with no args for parameter explanations'
break
if not config:
print get_usage()
break
 
myid = createPeerID()
seed(myid)
doneflag = Event()
def disp_exception(text):
print text
rawserver = RawServer(doneflag, config['timeout_check_interval'],
config['timeout'], ipv6_enable = config['ipv6_enabled'],
failfunc = h.failed, errorfunc = disp_exception)
upnp_type = UPnP_test(config['upnp_nat_access'])
while True:
try:
listen_port = rawserver.find_and_bind(config['minport'], config['maxport'],
config['bind'], ipv6_socket_style = config['ipv6_binds_v4'],
upnp = upnp_type, randomizer = config['random_port'])
break
except socketerror, e:
if upnp_type and e == UPnP_ERROR:
print 'WARNING: COULD NOT FORWARD VIA UPnP'
upnp_type = 0
continue
print "error: Couldn't listen - " + str(e)
h.failed()
return
 
response = get_response(config['responsefile'], config['url'], h.error)
if not response:
break
 
infohash = sha(bencode(response['info'])).digest()
 
dow = BT1Download(h.display, h.finished, h.error, disp_exception, doneflag,
config, response, infohash, myid, rawserver, listen_port)
if not dow.saveAs(h.chooseFile, h.newpath):
break
 
if not dow.initFiles(old_style = True):
break
 
if not dow.startEngine():
dow.shutdown()
break
dow.startRerequester()
dow.autoStats()
 
if not dow.am_I_finished():
h.display(activity = 'connecting to peers')
rawserver.listen_forever(dow.getPortHandler())
h.display(activity = 'shutting down')
dow.shutdown()
break
 
try:
rawserver.shutdown()
except:
pass
 
if not h.done:
h.failed()
 
finally:
if __debug__: traceMsg('run - removing PID file :'+statusFile+".pid")
 
remove(statusFile+".pid")
 
if __debug__: traceMsg('run - end')
 
 
if __name__ == '__main__':
if argv[1:] == ['--version']:
print version
sys.exit(0)
 
if PROFILER:
import profile, pstats
p = profile.Profile()
p.runcall(run, argv[1],argv[2],argv[3],argv[4],argv[5:])
log = open('profile_data.'+strftime('%y%m%d%H%M%S')+'.txt','a')
normalstdout = sys.stdout
sys.stdout = log
# pstats.Stats(p).strip_dirs().sort_stats('cumulative').print_stats()
pstats.Stats(p).strip_dirs().sort_stats('time').print_stats()
sys.stdout = normalstdout
else:
run(argv[1],argv[2],argv[3],argv[4],argv[5:])
/web/kaklik's_web/torrentflux/TF_BitTornado/btshowmetainfo.py
0,0 → 1,78
#!/usr/bin/env python
 
# Written by Henry 'Pi' James and Loring Holden
# modified for multitracker display by John Hoffman
# see LICENSE.txt for license information
 
from sys import *
from os.path import *
from sha import *
from BitTornado.bencode import *
 
NAME, EXT = splitext(basename(argv[0]))
VERSION = '20030621'
 
print '%s %s - decode BitTorrent metainfo files' % (NAME, VERSION)
print
 
if len(argv) == 1:
print '%s file1.torrent file2.torrent file3.torrent ...' % argv[0]
print
exit(2) # common exit code for syntax error
 
for metainfo_name in argv[1:]:
metainfo_file = open(metainfo_name, 'rb')
metainfo = bdecode(metainfo_file.read())
# print metainfo
info = metainfo['info']
info_hash = sha(bencode(info))
 
print 'metainfo file.: %s' % basename(metainfo_name)
print 'info hash.....: %s' % info_hash.hexdigest()
piece_length = info['piece length']
if info.has_key('length'):
# let's assume we just have a file
print 'file name.....: %s' % info['name']
file_length = info['length']
name ='file size.....:'
else:
# let's assume we have a directory structure
print 'directory name: %s' % info['name']
print 'files.........: '
file_length = 0;
for file in info['files']:
path = ''
for item in file['path']:
if (path != ''):
path = path + "/"
path = path + item
print ' %s (%d)' % (path, file['length'])
file_length += file['length']
name ='archive size..:'
piece_number, last_piece_length = divmod(file_length, piece_length)
print '%s %i (%i * %i + %i)' \
% (name,file_length, piece_number, piece_length, last_piece_length)
print 'announce url..: %s' % metainfo['announce']
if metainfo.has_key('announce-list'):
list = []
for tier in metainfo['announce-list']:
for tracker in tier:
list+=[tracker,',']
del list[-1]
list+=['|']
del list[-1]
liststring = ''
for i in list:
liststring+=i
print 'announce-list.: %s' % liststring
if metainfo.has_key('httpseeds'):
list = []
for seed in metainfo['httpseeds']:
list += [seed,'|']
del list[-1]
liststring = ''
for i in list:
liststring+=i
print 'http seeds....: %s' % liststring
if metainfo.has_key('comment'):
print 'comment.......: %s' % metainfo['comment']
/web/kaklik's_web/torrentflux/TF_BitTornado/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/TF_BitTornado/original_src/BitTornado-0.3.15.tar.gz
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/TF_BitTornado/original_src/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/TF_BitTornado/tfQManager.py
0,0 → 1,430
#!/usr/bin/env python
 
# Written by kboy
 
# v 1.01 Mar 20, 06
 
import commands, os, re, sys
from os import popen, getpid, remove
from sys import argv, stdout
from time import time, strftime
import thread, threading, time
 
DEBUG = False
 
if __debug__: LOGFILE=open(argv[1]+"tfQManager.log","w")
 
def run(qDirectory,maxSvrThreads,maxUsrThreads,sleepInterval,execPath):
 
displayParams(qDirectory,maxSvrThreads,maxUsrThreads,sleepInterval,execPath)
#Check to see if already running.
lastPID = "0"
try:
f=open(qDirectory+"tfQManager.pid",'r')
lastPID = f.readline().strip()
f.close()
if __debug__: traceMsg("Last QManager pid" + str(lastPID))
except:
pass
if (int(lastPID) > 0):
if (checkPIDStatus(lastPID) > 0):
if __debug__: traceMsg("Already Running on pid:" + lastPID)
raise KeyboardInterrupt
 
if __debug__: traceMsg("QManager Starting")
f=open(qDirectory+"tfQManager.pid",'w')
f.write(str(getpid()) + "\n")
f.flush()
f.close()
 
if __debug__: traceMsg("QManager PID :" + str(getpid()))
 
# Extract from the execPath the Btphptornado.py script line.
# this will be used during the process Counts to ensure we are
# unique from other running instances.
 
ePath = execPath.split(" ")
for x in ePath:
if (re.search('btphptornado', x) > 0 ):
btphp = x
if __debug__: traceMsg("btphp ->"+btphp)
 
if (re.search('btphptornado', btphp) > 0 ):
try:
while 1:
 
threadCount = checkThreadCount(btphp)
if __debug__: traceMsg("CurrentThreadCount = " + str( threadCount ))
 
#
# Start Looping untill we have maxSvrThreads.
# Or no Qinfo Files.
#
 
while int(threadCount) <= int(maxSvrThreads):
try:
#
# Get the Next File.
# Check to see if we got a file back.
# if not break out of looping we don't have any files.
#
fileList = []
fileList = getFileList(qDirectory)
for currentFile in fileList:
if currentFile == "":
break
# set the name of the current statsFile
statsFile = currentFile.replace('/queue','').strip('.Qinfo')
if __debug__: traceMsg("statsFile = " + statsFile)
#
# get the User name if we didn't get one
# something was wrong with this file.
#
currentUser = getUserName(statsFile)
if currentUser == "":
if __debug__: traceMsg("No User Found : " + currentFile)
# Prep StatsFile
updateStats(statsFile, '0')
removeFile(currentFile)
break
else:
if __debug__: traceMsg("Current User: " + currentUser)
#
# Now check user thread count
#
usrThreadCount = getUserThreadCount(currentUser, btphp)
 
#
# check UserThreadCount
#
if int(usrThreadCount) < int(maxUsrThreads):
#
# Now check to see if we start a new thread will we be over the max ?
#
threadCount = checkThreadCount(btphp)
if int(threadCount) + 1 <= int(maxSvrThreads):
if int(usrThreadCount) + 1 <= int(maxUsrThreads):
 
cmdToRun = getCommandToRun(currentFile)
#if __debug__: traceMsg(" Cmd :" + cmdToRun)
 
if (re.search(currentUser,cmdToRun) == 0):
if __debug__: traceMsg("Incorrect User found in Cmd")
cmdToRun = ''
if (re.search('\|',cmdToRun) > 0):
if __debug__: traceMsg(" Failed pipe ")
cmdToRun = ''
else:
cmdToRun = execPath + cmdToRun
 
cmdToRun = cmdToRun.replace('TFQUSERNAME', currentUser)
#if __debug__: traceMsg(" Cmd :" + cmdToRun)
 
if cmdToRun != "":
#PrepStatsFile
updateStats(statsFile, '1')
 
if __debug__: traceMsg("Fire off command")
try:
garbage = doCommand(cmdToRun)
 
#
# wait until the torrent process starts
# and creates a pid file.
# once this happens we can remove the Qinfo.
#
while 1:
try:
time.sleep(2)
f=open(statsFile+".pid",'r')
f.close()
break
except:
continue
 
# Ok this one started Remove Qinfo File.
if __debug__: traceMsg("Removing : " + currentFile)
removeFile(currentFile)
except:
continue
else:
#
# Something wrong with command file.
#
if __debug__: traceMsg("Unable to obtain valid cmdToRun : " + currentFile)
removeFile(currentFile)
else:
if __debug__: traceMsg("Skipping this file since the User has to many threads")
if __debug__: traceMsg("Skipping : " + currentFile)
 
else:
if __debug__: traceMsg("Skipping this file since the Server has to many threads")
if __debug__: traceMsg("Skipping : " + currentFile)
break
except:
break
 
threadCount = checkThreadCount(btphp)
if __debug__: traceMsg("CurrentThreadCount = " + str( threadCount ))
if __debug__: traceMsg("Sleeping...")
time.sleep(float(sleepInterval))
except:
removeFile(qDirectory+"tfQManager.pid")
else:
LOG = True
if __debug__: traceMsg("Only supported client is btphptornado.")
removeFile(qDirectory+"tfQManager.pid")
def checkThreadCount(btphp):
 
if __debug__: traceMsg("->checkTreadCount")
 
psLine = []
line = ""
counter = 0
list = doCommand("ps x -o pid,ppid,command -ww | grep '" + btphp + "' | grep -v tfQManager | grep -v grep")
 
try:
for c in list:
line += c
if c == '\n':
psLine.append(line.strip())
line = ""
 
# look for the grep line
for line in psLine:
if (re.search('btphptornado.py',line) > 0):
# now see if this is the main process and not a child.
if (re.search(' 1 /',line) > 0):
counter += 1
if __debug__: traceMsg(" -- Counted -- ")
if __debug__: traceMsg(line)
 
except:
counter = 0
return counter
 
def checkPIDStatus(pid):
 
if __debug__: traceMsg("->checkPIDStatus (" + pid + ")")
 
counter = 0
list = doCommand("ps -p "+pid+" -o pid= -ww")
 
try:
counter = len(list)
except:
counter = 0
return counter
 
def getUserThreadCount(userName, btphp):
 
if __debug__: traceMsg("->getUserThreadCount (" + userName + ")")
 
psLine = []
line = ""
counter = 0
list = doCommand("ps x -o pid,ppid,command -ww | grep '" + btphp + "' | grep -v tfQManager | grep -v grep")
 
try:
for c in list:
line += c
if c == '\n':
psLine.append(line.strip())
line = ""
 
# look for the grep line
for line in psLine:
if (re.search('btphptornado.py',line) > 0):
# now see if this is the main process and not a child.
if (re.search(' 1 /',line) > 0):
# look for the userName
if re.search(userName,line) > 0:
counter += 1
if __debug__: traceMsg(" -- Counted -- ")
if __debug__: traceMsg(line)
except:
counter = 0
 
if __debug__: traceMsg("->getUserThreadCount is (" + str(counter)+")")
return counter
 
def removeFile(currentFile):
 
if __debug__: traceMsg("->removeFile (" + currentFile + ")")
os.remove(currentFile)
 
return
 
def doCommand( command ):
 
if __debug__: traceMsg("->doCommand (" + command + ")")
 
#
# Fire off a command returning the output
#
return popen(command).read()
 
 
def doCommandPID( command ):
 
if __debug__: traceMsg("->doCommandPID (" + command + ")")
 
#
# Fire off a command returning the pid
#
#return popen2.Popen4(command).pid
garbage = doCommand(command)
return getPIDofCmd(command)
 
def getPIDofCmd(command):
 
if __debug__: traceMsg("->getPIDofCmd (" + command + ")")
cmdPID = ""
psLine = []
endOfPID = False
line = ""
list = doCommand("ps x -ww | grep \'"+command+"\' | grep -v grep")
 
if DEBUG:
print list
 
try:
for c in list:
line += c
if c == '\n':
psLine.append(line.strip(' '))
 
# look for the grep line
for line in psLine:
for e in line:
if e.isdigit() and endOfPID == False:
cmdPID += e
else:
endOfPID = True
break
except:
cmdPID = "0"
 
if __debug__: traceMsg(cmdPID)
 
return cmdPID
 
def getCommandToRun(currentFile):
if __debug__: traceMsg("->getCommandToRun (" + currentFile + ")")
 
#Open the File and return the Command to Run.
cmdToExec = ""
 
try:
f=open(currentFile,'r')
cmdToExec = f.readline()
f.close
except:
cmdToExec = ""
return cmdToExec
 
 
def getFileList(fDirectory):
 
if __debug__: traceMsg("->getFileList (" + fDirectory + ")")
 
# Get the list of Qinfo files.
fileList = []
 
try:
times = {}
for fName in os.listdir(fDirectory):
if re.search('\.Qinfo',fName) > 0:
p = os.path.join(fDirectory,fName)
times.setdefault(str(os.path.getmtime(p)),[]).append(p)
 
l = times.keys()
l.sort()
for i in l:
for f in times[i]:
fileList.append(f)
except:
fileList = ""
return fileList
 
 
def getUserName(fName):
 
if __debug__: traceMsg("->getUserName (" + fName + ")")
 
userName = ""
 
try:
f=open(fName,'r')
garbage = f.readline()
garbage = f.readline()
garbage = f.readline()
garbage = f.readline()
garbage = f.readline()
userName = f.readline().strip()
f.close()
if __debug__: traceMsg("userName : " + userName)
 
except:
userName = ""
 
return userName
 
 
def updateStats(fName, status = '1'):
 
if __debug__: traceMsg("->updateStats (" + fName + ")")
 
fp=open(fName,'r+')
fp.seek(0)
fp.write(status)
fp.flush()
fp.close
 
 
def displayParams(qDirectory,maxSvrThreads,maxUsrThreads,sleepInterval,execPath):
 
if __debug__:
traceMsg("qDir : " + qDirectory)
traceMsg("maxSvr : " + str(maxSvrThreads))
traceMsg("maxUsr : " + str(maxUsrThreads))
traceMsg("sleepI : " + str(sleepInterval))
traceMsg("execPath : " + str(execPath))
return
 
 
def traceMsg(msg):
if DEBUG:
print msg
if __debug__:
LOGFILE.write(msg + "\n")
LOGFILE.flush()
if __name__ == '__main__':
run(argv[1],argv[2],argv[3],argv[4],argv[5])
/web/kaklik's_web/torrentflux/admin.php
0,0 → 1,2167
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
if(!IsAdmin())
{
// the user probably hit this page direct
AuditAction($cfg["constants"]["access_denied"], $_SERVER['PHP_SELF']);
header("location: index.php");
}
 
//****************************************************************************
// addLink -- adding a link
//****************************************************************************
function addLink($newLink)
{
if(!empty($newLink)){
global $cfg;
addNewLink($newLink);
AuditAction($cfg["constants"]["admin"], "New "._LINKS_MENU.": ".$newLink);
}
header("location: admin.php?op=editLinks");
}
 
//****************************************************************************
// addRSS -- adding a RSS link
//****************************************************************************
function addRSS($newRSS)
{
if(!empty($newRSS)){
global $cfg;
addNewRSS($newRSS);
AuditAction($cfg["constants"]["admin"], "New RSS: ".$newRSS);
}
header("location: admin.php?op=editRSS");
}
 
//****************************************************************************
// addUser -- adding a user
//****************************************************************************
function addUser($newUser, $pass1, $userType)
{
global $cfg;
$newUser = strtolower($newUser);
if (IsUser($newUser))
{
DisplayHead(_ADMINISTRATION);
 
// Admin Menu
displayMenu();
 
echo "<br><div align=\"center\">"._TRYDIFFERENTUSERID."<br><strong>".$newUser."</strong> "._HASBEENUSED."</div><br><br><br>";
 
DisplayFoot();
}
else
{
addNewUser($newUser, $pass1, $userType);
AuditAction($cfg["constants"]["admin"], _NEWUSER.": ".$newUser);
header("location: admin.php?op=CreateUser");
}
}
 
//****************************************************************************
// updateUser -- updating a user
//****************************************************************************
function updateUser($user_id, $org_user_id, $pass1, $userType, $hideOffline)
{
global $cfg;
$user_id = strtolower($user_id);
if (IsUser($user_id) && ($user_id != $org_user_id))
{
DisplayHead(_ADMINISTRATION);
 
// Admin Menu
displayMenu();
 
echo "<br><div align=\"center\">"._TRYDIFFERENTUSERID."<br><strong>".$user_id."</strong> "._HASBEENUSED."<br><br><br>";
 
echo "[<a href=\"admin.php?op=editUser&user_id=".$org_user_id."\">"._RETURNTOEDIT." ".$org_user_id."</a>]</div><br><br><br>";
 
DisplayFoot();
}
else
{
// Admin is changing id or password through edit screen
if(($user_id == $cfg["user"] || $cfg["user"] == $org_user_id) && $pass1 != "")
{
// this will expire the user
$_SESSION['user'] = md5($cfg["pagetitle"]);
}
updateThisUser($user_id, $org_user_id, $pass1, $userType, $hideOffline);
AuditAction($cfg["constants"]["admin"], _EDITUSER.": ".$user_id);
header("location: admin.php");
}
}
 
//****************************************************************************
// deleteLink -- delete a link
//****************************************************************************
function deleteLink($lid)
{
global $cfg;
AuditAction($cfg["constants"]["admin"], _DELETE." Link: ".getLink($lid));
deleteOldLink($lid);
header("location: admin.php?op=editLinks");
}
 
//****************************************************************************
// deleteRSS -- delete a RSS link
//****************************************************************************
function deleteRSS($rid)
{
global $cfg;
AuditAction($cfg["constants"]["admin"], _DELETE." RSS: ".getRSS($rid));
deleteOldRSS($rid);
header("location: admin.php?op=editRSS");
}
 
//****************************************************************************
// deleteUser -- delete a user (only non super admin)
//****************************************************************************
function deleteUser($user_id)
{
global $cfg;
if (!IsSuperAdmin($user_id))
{
DeleteThisUser($user_id);
AuditAction($cfg["constants"]["admin"], _DELETE." "._USER.": ".$user_id);
}
header("location: admin.php");
}
 
//****************************************************************************
// showIndex -- default view
//****************************************************************************
function showIndex($min = 0)
{
global $cfg;
DisplayHead(_ADMINISTRATION);
 
// Admin Menu
displayMenu();
 
// Show User Section
displayUserSection();
 
echo "<br>";
 
// Display Activity
displayActivity($min);
 
DisplayFoot();
 
}
 
 
//****************************************************************************
// showUserActivity -- Activity for a user
//****************************************************************************
function showUserActivity($min=0, $user_id="", $srchFile="", $srchAction="")
{
global $cfg;
 
DisplayHead(_ADMINUSERACTIVITY);
 
// Admin Menu
displayMenu();
 
// display Activity for user
displayActivity($min, $user_id, $srchFile, $srchAction);
 
DisplayFoot();
 
}
 
 
 
//****************************************************************************
// backupDatabase -- backup the database
//****************************************************************************
function backupDatabase()
{
global $cfg;
 
$file = $cfg["db_name"]."_".date("Ymd").".tar.gz";
$back_file = $cfg["torrent_file_path"].$file;
$sql_file = $cfg["torrent_file_path"].$cfg["db_name"].".sql";
 
$sCommand = "";
switch($cfg["db_type"])
{
case "mysql":
$sCommand = "mysqldump -h ".$cfg["db_host"]." -u ".$cfg["db_user"]." --password=".$cfg["db_pass"]." --all -f ".$cfg["db_name"]." > ".$sql_file;
break;
default:
// no support for backup-on-demand.
$sCommand = "";
break;
}
 
if($sCommand != "")
{
shell_exec($sCommand);
shell_exec("tar -czvf ".$back_file." ".$sql_file);
 
// Get the file size
$file_size = filesize($back_file);
 
// open the file to read
$fo = fopen($back_file, 'r');
$fr = fread($fo, $file_size);
fclose($fo);
 
// Set the headers
header("Content-type: APPLICATION/OCTET-STREAM");
header("Content-Length: ".$file_size.";");
header("Content-Disposition: attachement; filename=".$file);
 
// send the tar baby
echo $fr;
 
// Cleanup
shell_exec("rm ".$sql_file);
shell_exec("rm ".$back_file);
AuditAction($cfg["constants"]["admin"], _BACKUP_MENU.": ".$file);
}
}
 
 
//****************************************************************************
// displayMenu -- displays Admin Menu
//****************************************************************************
function displayMenu()
{
global $cfg;
echo "<table width=\"760\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\"><div align=\"center\">";
echo "<a href=\"admin.php\"><font class=\"adminlink\">"._ADMIN_MENU."</font></a> | ";
echo "<a href=\"admin.php?op=configSettings\"><font class=\"adminlink\">"._SETTINGS_MENU."</font></a> | ";
echo "<a href=\"admin.php?op=queueSettings\"><font class=\"adminlink\">"._QMANAGER_MENU."</font></a> | ";
echo "<a href=\"admin.php?op=searchSettings\"><font class=\"adminlink\">"._SEARCHSETTINGS_MENU."</font></a> | ";
echo "<a href=\"admin.php?op=showUserActivity\"><font class=\"adminlink\">"._ACTIVITY_MENU."</font></a> | ";
echo "<a href=\"admin.php?op=editLinks\"><font class=\"adminlink\">"._LINKS_MENU."</font></a> | ";
echo "<a href=\"admin.php?op=editRSS\"><font class=\"adminlink\">rss</font></a> | ";
echo "<a href=\"admin.php?op=CreateUser\"><font class=\"adminlink\">"._NEWUSER_MENU."</font></a> | ";
echo "<a href=\"admin.php?op=backupDatabase\"><font class=\"adminlink\">"._BACKUP_MENU."</font></a>";
echo "</div></td></tr>";
echo "</table><br>";
 
}
 
 
//****************************************************************************
// displayActivity -- displays Activity
//****************************************************************************
function displayActivity($min=0, $user="", $srchFile="", $srchAction="")
{
global $cfg, $db;
 
$sqlForSearch = "";
 
$userdisplay = $user;
 
if($user != "")
{
$sqlForSearch .= "user_id='".$user."' AND ";
}
else
{
$userdisplay = _ALLUSERS;
}
 
if($srchFile != "")
{
$sqlForSearch .= "file like '%".$srchFile."%' AND ";
}
 
if($srchAction != "")
{
$sqlForSearch .= "action like '%".$srchAction."%' AND ";
}
 
$offset = 50;
$inx = 0;
if (!isset($min)) $min=0;
$max = $min+$offset;
$output = "";
$morelink = "";
 
$sql = "SELECT user_id, file, action, ip, ip_resolved, user_agent, time FROM tf_log WHERE ".$sqlForSearch."action!=".$db->qstr($cfg["constants"]["hit"])." ORDER BY time desc";
 
$result = $db->SelectLimit($sql, $offset, $min);
while(list($user_id, $file, $action, $ip, $ip_resolved, $user_agent, $time) = $result->FetchRow())
{
$user_icon = "images/user_offline.gif";
if (IsOnline($user_id))
{
$user_icon = "images/user.gif";
}
 
$ip_info = $ip_resolved."<br>".$user_agent;
 
$output .= "<tr>";
if (IsUser($user_id))
{
$output .= "<td><a href=\"message.php?to_user=".$user_id."\"><img src=\"".$user_icon."\" width=17 height=14 title=\""._SENDMESSAGETO." ".$user_id."\" border=0 align=\"bottom\">".$user_id."</a>&nbsp;&nbsp;</td>";
}
else
{
$output .= "<td><img src=\"".$user_icon."\" width=17 height=14 title=\"n/a\" border=0 align=\"bottom\">".$user_id."&nbsp;&nbsp;</td>";
}
$output .= "<td><div class=\"tiny\">".$action."</div></td>";
$output .= "<td><div align=center><div class=\"tiny\" align=\"left\">";
$output .= $file;
$output .= "</div></td>";
$output .= "<td><div class=\"tiny\" align=\"left\"><a href=\"javascript:void(0)\" onclick=\"return overlib('".$ip_info."<br>', STICKY, CSSCLASS);\" onmouseover=\"return overlib('".$ip_info."<br>', CSSCLASS);\" onmouseout=\"return nd();\"><img src=\"images/properties.png\" width=\"18\" height=\"13\" border=\"0\"><font class=tiny>".$ip."</font></a></div></td>";
$output .= "<td><div class=\"tiny\" align=\"center\">".date(_DATETIMEFORMAT, $time)."</div></td>";
$output .= "</tr>";
 
$inx++;
}
 
if($inx == 0)
{
$output = "<tr><td colspan=6><center><strong>-- "._NORECORDSFOUND." --</strong></center></td></tr>";
}
 
$prev = ($min-$offset);
if ($prev>=0)
{
$prevlink = "<a href=\"admin.php?op=showUserActivity&min=".$prev."&user_id=".$user."&srchFile=".$srchFile."&srchAction=".$srchAction."\">";
$prevlink .= "<font class=\"TinyWhite\">&lt;&lt;".$min." "._SHOWPREVIOUS."]</font></a> &nbsp;";
}
if ($inx>=$offset)
{
$morelink = "<a href=\"admin.php?op=showUserActivity&min=".$max."&user_id=".$user."&srchFile=".$srchFile."&srchAction=".$srchAction."\">";
$morelink .= "<font class=\"TinyWhite\">["._SHOWMORE."&gt;&gt;</font></a>";
}
?>
<div id="overDiv" style="position:absolute;visibility:hidden;z-index:1000;"></div>
<script language="JavaScript">
var ol_closeclick = "1";
var ol_close = "<font color=#ffffff><b>X</b></font>";
var ol_fgclass = "fg";
var ol_bgclass = "bg";
var ol_captionfontclass = "overCaption";
var ol_closefontclass = "overClose";
var ol_textfontclass = "overBody";
var ol_cap = "&nbsp;IP Info";
</script>
<script src="overlib.js" type="text/javascript"></script>
<div align="center">
<table>
<form action="admin.php?op=showUserActivity" name="searchForm" method="post">
<tr>
<td>
<strong><?php echo _ACTIVITYSEARCH ?></strong>&nbsp;&nbsp;&nbsp;
<?php echo _FILE ?>:
<input type="Text" name="srchFile" value="<?php echo $srchFile ?>" width="30"> &nbsp;&nbsp;
<?php echo _ACTION ?>:
<select name="srchAction">
<option value="">-- <?php echo _ALL ?> --</option>
<?php
$selected = "";
foreach ($cfg["constants"] as $action)
{
$selected = "";
if($action != $cfg["constants"]["hit"])
{
if($srchAction == $action)
{
$selected = "selected";
}
echo "<option value=\"".$action."\" ".$selected.">".$action."</option>";
}
}
?>
</select>&nbsp;&nbsp;
<?php echo _USER ?>:
<select name="user_id">
<option value="">-- <?php echo _ALL ?> --</option>
<?php
$users = GetUsers();
$selected = "";
for($inx = 0; $inx < sizeof($users); $inx++)
{
$selected = "";
if($user == $users[$inx])
{
$selected = "selected";
}
echo "<option value=\"".$users[$inx]."\" ".$selected.">".$users[$inx]."</option>";
}
?>
</select>
<input type="Submit" value="<?php echo _SEARCH ?>">
 
</td>
</tr>
</form>
</table>
</div>
 
 
<?php
echo "<table width=\"760\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr><td>";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\">"._ACTIVITYLOG." ".$cfg["days_to_keep"]." "._DAYS." (".$userdisplay.")</font>";
if(!empty($prevlink) && !empty($morelink))
echo "</td><td align=\"right\">".$prevlink.$morelink."</td></tr></table>";
elseif(!empty($prevlink))
echo "</td><td align=\"right\">".$prevlink."</td></tr></table>";
elseif(!empty($prevlink))
echo "</td><td align=\"right\">".$morelink."</td></tr></table>";
else
echo "</td><td align=\"right\"></td></tr></table>";
echo "</td></tr>";
echo "<tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._USER."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._ACTION."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._FILE."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"13%\"><div align=center class=\"title\">"._IP."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"15%\"><div align=center class=\"title\">"._TIMESTAMP."</div></td>";
echo "</tr>";
 
echo $output;
 
if(!empty($prevlink) || !empty($morelink))
{
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\">";
echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr><td align=\"left\">";
if(!empty($prevlink)) echo $prevlink;
echo "</td><td align=\"right\">";
if(!empty($morelink)) echo $morelink;
echo "</td></tr></table>";
echo "</td></tr>";
}
 
echo "</table>";
 
}
 
 
 
//****************************************************************************
// displayUserSection -- displays the user section
//****************************************************************************
function displayUserSection()
{
global $cfg, $db;
 
echo "<table width=\"760\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\"><img src=\"images/user_group.gif\" width=17 height=14 border=0>&nbsp;&nbsp;<font class=\"title\">"._USERDETAILS."</font></div></td></tr>";
echo "<tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"15%\"><div align=center class=\"title\">"._USER."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"6%\"><div align=center class=\"title\">"._HITS."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._UPLOADACTIVITY." (".$cfg["days_to_keep"]." "._DAYS.")</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"6%\"><div align=center class=\"title\">"._JOINED."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"15%\"><div align=center class=\"title\">"._LASTVISIT."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"8%\"><div align=center class=\"title\">"._ADMIN."</div></td>";
echo "</tr>";
 
$total_activity = GetActivityCount();
 
$sql= "SELECT user_id, hits, last_visit, time_created, user_level FROM tf_users ORDER BY user_id";
$result = $db->Execute($sql);
while(list($user_id, $hits, $last_visit, $time_created, $user_level) = $result->FetchRow())
{
$user_activity = GetActivityCount($user_id);
 
if ($user_activity == 0)
{
$user_percent = 0;
}
else
{
$user_percent = number_format(($user_activity/$total_activity)*100);
}
$user_icon = "images/user_offline.gif";
if (IsOnline($user_id))
{
$user_icon = "images/user.gif";
}
 
echo "<tr>";
if (IsUser($user_id))
{
echo "<td><a href=\"message.php?to_user=".$user_id."\"><img src=\"".$user_icon."\" width=17 height=14 title=\""._SENDMESSAGETO." ".$user_id."\" border=0 align=\"bottom\">".$user_id."</a></td>";
}
else
{
echo "<td><img src=\"".$user_icon."\" width=17 height=14 title=\"n/a\" border=0 align=\"bottom\">".$user_id."</td>";
}
echo "<td><div class=\"tiny\" align=\"right\">".$hits."</div></td>";
echo "<td><div align=center>";
?>
<table width="310" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="200">
<table width="200" border="0" cellpadding="0" cellspacing="0">
<tr>
<td background="themes/<?php echo $cfg["theme"] ?>/images/proglass.gif" width="<?php echo $user_percent*2 ?>"><img src="images/blank.gif" width="1" height="12" border="0"></td>
<td background="themes/<?php echo $cfg["theme"] ?>/images/noglass.gif" width="<?php echo (200 - ($user_percent*2)) ?>"><img src="images/blank.gif" width="1" height="12" border="0"></td>
</tr>
</table>
</td>
<td align="right" width="40"><div class="tiny" align="right"><?php echo $user_activity ?></div></td>
<td align="right" width="40"><div class="tiny" align="right"><?php echo $user_percent ?>%</div></td>
<td align="right"><a href="admin.php?op=showUserActivity&user_id=<?php echo $user_id ?>"><img src="images/properties.png" width="18" height="13" title="<?php echo $user_id."'s "._USERSACTIVITY ?>" border="0"></a></td>
</tr>
</table>
<?php
echo "</td>";
echo "<td><div class=\"tiny\" align=\"center\">".date(_DATEFORMAT, $time_created)."</div></td>";
echo "<td><div class=\"tiny\" align=\"center\">".date(_DATETIMEFORMAT, $last_visit)."</div></td>";
echo "<td><div align=\"right\" class=\"tiny\">";
$user_image = "images/user.gif";
$type_user = _NORMALUSER;
if ($user_level == 1)
{
$user_image = "images/admin_user.gif";
$type_user = _ADMINISTRATOR;
}
if ($user_level == 2)
{
$user_image = "images/superadmin.gif";
$type_user = _SUPERADMIN;
}
if ($user_level <= 1 || IsSuperAdmin())
{
echo "<a href=\"admin.php?op=editUser&user_id=".$user_id."\"><img src=\"images/edit.png\" width=12 height=13 title=\""._EDIT." ".$user_id."\" border=0></a>";
}
echo "<img src=\"".$user_image."\" title=\"".$user_id." - ".$type_user."\">";
if ($user_level <= 1)
{
echo "<a href=\"admin.php?op=deleteUser&user_id=".$user_id."\"><img src=\"images/delete_on.gif\" border=0 width=16 height=16 title=\""._DELETE." ".$user_id."\" onclick=\"return ConfirmDeleteUser('".$user_id."')\"></a>";
}
else
{
echo "<img src=\"images/delete_off.gif\" width=16 height=16 title=\"n/a\">";
}
 
echo "</div></td>";
echo "</tr>";
}
 
echo "</table>";
?>
<script language="JavaScript">
function ConfirmDeleteUser(user)
{
return confirm("<?php echo _WARNING.": "._ABOUTTODELETE ?>: " + user)
}
</script>
<?php
}
 
 
//****************************************************************************
// editUser -- edit a user
//****************************************************************************
function editUser($user_id)
{
global $cfg, $db;
DisplayHead(_USERADMIN);
 
$editUserImage = "images/user.gif";
$selected_n = "selected";
$selected_a = "";
 
$hide_checked = "";
 
// Admin Menu
displayMenu();
 
$total_activity = GetActivityCount();
 
$sql= "SELECT user_id, hits, last_visit, time_created, user_level, hide_offline, theme, language_file FROM tf_users WHERE user_id=".$db->qstr($user_id);
 
list($user_id, $hits, $last_visit, $time_created, $user_level, $hide_offline, $theme, $language_file) = $db->GetRow($sql);
 
$user_type = _NORMALUSER;
if ($user_level == 1)
{
$user_type = _ADMINISTRATOR;
$selected_n = "";
$selected_a = "selected";
$editUserImage = "images/admin_user.gif";
}
if ($user_level >= 2)
{
$user_type = _SUPERADMIN;
$editUserImage = "images/superadmin.gif";
}
 
if ($hide_offline == 1)
{
$hide_checked = "checked";
}
 
 
$user_activity = GetActivityCount($user_id);
 
if ($user_activity == 0)
{
$user_percent = 0;
}
else
{
$user_percent = number_format(($user_activity/$total_activity)*100);
}
 
echo "<div align=\"center\">";
echo "<table width=\"100%\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"".$editUserImage."\" width=17 height=14 border=0>&nbsp;&nbsp;&nbsp;<font class=\"title\">"._EDITUSER.": ".$user_id."</font>";
echo "</td></tr><tr><td align=\"center\">";
?>
 
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td width="50%" bgcolor="<?php echo $cfg["table_data_bg"]?>" valign="top">
 
<div align="center">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="right"><?php echo $user_id." "._JOINED ?>:&nbsp;</td>
<td><strong><?php echo date(_DATETIMEFORMAT, $time_created) ?></strong></td>
</tr>
<tr>
<td align="right"><?php echo _LASTVISIT ?>:&nbsp;</td>
<td><strong><?php echo date(_DATETIMEFORMAT, $last_visit) ?></strong></td>
</tr>
<tr>
<td colspan="2" align="center">&nbsp;</td>
</tr>
<tr>
<td align="right"><?php echo _UPLOADPARTICIPATION ?>:&nbsp;</td>
<td>
<table width="200" border="0" cellpadding="0" cellspacing="0">
<tr>
<td background="themes/<?php echo $cfg["theme"] ?>/images/proglass.gif" width="<?php echo $user_percent*2 ?>"><img src="images/blank.gif" width="1" height="12" border="0"></td>
<td background="themes/<?php echo $cfg["theme"] ?>/images/noglass.gif" width="<?php echo (200 - ($user_percent*2)) ?>"><img src="images/blank.gif" width="1" height="12" border="0"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="right"><?php echo _UPLOADS ?>:&nbsp;</td>
<td><strong><?php echo $user_activity ?></strong></td>
</tr>
<tr>
<td align="right"><?php echo _PERCENTPARTICIPATION ?>:&nbsp;</td>
<td><strong><?php echo $user_percent ?>%</strong></td>
</tr>
<tr>
<td colspan="2" align="center"><div align="center" class="tiny">(<?php echo _PARTICIPATIONSTATEMENT. " ".$cfg['days_to_keep']." "._DAYS ?>)</div><br></td>
</tr>
<tr>
<td align="right"><?php echo _TOTALPAGEVIEWS ?>:&nbsp;</td>
<td><strong><?php echo $hits ?></strong></td>
</tr>
<tr>
<td align="right" valign="top"><?php echo _THEME ?>:&nbsp;</td>
<td valign="top"><strong><?php echo $theme ?></strong><br></td>
</tr>
<tr>
<td align="right" valign="top"><?php echo _LANGUAGE ?>:&nbsp;</td>
<td valign="top"><strong><?php echo GetLanguageFromFile($language_file) ?></strong><br><br></td>
</tr>
<tr>
<td align="right" valign="top"><?php echo _USERTYPE ?>:&nbsp;</td>
<td valign="top"><strong><?php echo $user_type ?></strong><br></td>
</tr>
<tr>
<td colspan="2" align="center"><div align="center">[<a href="admin.php?op=showUserActivity&user_id=<?php echo $user_id ?>"><?php echo _USERSACTIVITY ?></a>]</div></td>
</tr>
</table>
</div>
 
</td>
<td valign="top" bgcolor="<?php echo $cfg["body_data_bg"] ?>">
<div align="center">
<table cellpadding="5" cellspacing="0" border="0">
<form name="theForm" action="admin.php?op=updateUser" method="post" onsubmit="return validateUser()">
<tr>
<td align="right"><?php echo _USER ?>:</td>
<td>
<input name="user_id" type="Text" value="<?php echo $user_id ?>" size="15">
<input name="org_user_id" type="Hidden" value="<?php echo $user_id ?>">
</td>
</tr>
<tr>
<td align="right"><?php echo _NEWPASSWORD ?>:</td>
<td>
<input name="pass1" type="Password" value="" size="15">
</td>
</tr>
<tr>
<td align="right"><?php echo _CONFIRMPASSWORD ?>:</td>
<td>
<input name="pass2" type="Password" value="" size="15">
</td>
</tr>
<tr>
<td align="right"><?php echo _USERTYPE ?>:</td>
<td>
<?php if ($user_level <= 1) { ?>
<select name="userType">
<option value="0" <?php echo $selected_n ?>><?php echo _NORMALUSER ?></option>
<option value="1" <?php echo $selected_a ?>><?php echo _ADMINISTRATOR ?></option>
</select>
<?php } else { ?>
<strong><?php echo _SUPERADMIN ?></strong>
<input type="Hidden" name="userType" value="2">
<?php } ?>
</td>
</tr>
<tr>
<td colspan="2">
<input name="hideOffline" type="Checkbox" value="1" <?php echo $hide_checked ?>> <?php echo _HIDEOFFLINEUSERS ?><br>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="Submit" value="<?php echo _UPDATE ?>">
</td>
</tr>
</form>
</table>
</div>
</td>
</tr>
</table>
 
 
<script language="JavaScript">
function validateUser()
{
var msg = ""
if (theForm.user_id.value == "")
{
msg = msg + "* <?php echo _USERIDREQUIRED ?>\n";
theForm.user_id.focus();
}
 
if (theForm.pass1.value != "" || theForm.pass2.value != "")
{
if (theForm.pass1.value.length <= 5 || theForm.pass2.value.length <= 5)
{
msg = msg + "* <?php echo _PASSWORDLENGTH ?>\n";
theForm.pass1.focus();
}
if (theForm.pass1.value != theForm.pass2.value)
{
msg = msg + "* <?php echo _PASSWORDNOTMATCH ?>\n";
theForm.pass1.value = "";
theForm.pass2.value = "";
theForm.pass1.focus();
}
}
 
if (msg != "")
{
alert("<?php echo _PLEASECHECKFOLLOWING ?>:\n\n" + msg);
return false;
}
else
{
return true;
}
}
</script>
 
<?php
echo "</td></tr>";
echo "</table></div>";
echo "<br><br>";
 
// Show User Section
displayUserSection();
 
echo "<br><br>";
 
DisplayFoot();
}
 
 
//****************************************************************************
// CreateUser -- Create a user
//****************************************************************************
function CreateUser()
{
global $cfg;
DisplayHead(_USERADMIN);
 
// Admin Menu
displayMenu();
echo "<div align=\"center\">";
echo "<table border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"images/user.gif\" width=17 height=14 border=0>&nbsp;&nbsp;&nbsp;<font class=\"title\">"._NEWUSER."</font>";
echo "</td></tr><tr><td align=\"center\">";
?>
<div align="center">
<table cellpadding="5" cellspacing="0" border="0">
<form name="theForm" action="admin.php?op=addUser" method="post" onsubmit="return validateProfile()">
<tr>
<td align="right"><?php echo _USER ?>:</td>
<td>
<input name="newUser" type="Text" value="" size="15">
</td>
</tr>
<tr>
<td align="right"><?php echo _PASSWORD ?>:</td>
<td>
<input name="pass1" type="Password" value="" size="15">
</td>
</tr>
<tr>
<td align="right"><?php echo _CONFIRMPASSWORD ?>:</td>
<td>
<input name="pass2" type="Password" value="" size="15">
</td>
</tr>
<tr>
<td align="right"><?php echo _USERTYPE ?>:</td>
<td>
<select name="userType">
<option value="0"><?php echo _NORMALUSER ?></option>
<option value="1"><?php echo _ADMINISTRATOR ?></option>
</select>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="Submit" value="<?php echo _CREATE ?>">
</td>
</tr>
</form>
</table>
</div>
 
<br>
 
<script language="JavaScript">
function validateProfile()
{
var msg = ""
if (theForm.newUser.value == "")
{
msg = msg + "* <?php echo _USERIDREQUIRED ?>\n";
theForm.newUser.focus();
}
if (theForm.pass1.value != "" || theForm.pass2.value != "")
{
if (theForm.pass1.value.length <= 5 || theForm.pass2.value.length <= 5)
{
msg = msg + "* <?php echo _PASSWORDLENGTH ?>\n";
theForm.pass1.focus();
}
if (theForm.pass1.value != theForm.pass2.value)
{
msg = msg + "* <?php echo _PASSWORDNOTMATCH ?>\n";
theForm.pass1.value = "";
theForm.pass2.value = "";
theForm.pass1.focus();
}
}
else
{
msg = msg + "* <?php echo _PASSWORDLENGTH ?>\n";
theForm.pass1.focus();
}
 
if (msg != "")
{
alert("<?php echo _PLEASECHECKFOLLOWING ?>:\n\n" + msg);
return false;
}
else
{
return true;
}
}
</script>
 
<?php
echo "</td></tr>";
echo "</table></div>";
echo "<br><br>";
 
// Show User Section
displayUserSection();
 
echo "<br><br>";
 
DisplayFoot();
}
 
//****************************************************************************
// editLinks -- Edit Links
//****************************************************************************
function editLinks()
{
global $cfg;
DisplayHead(_ADMINEDITLINKS);
 
// Admin Menu
displayMenu();
echo "<div align=\"center\">";
echo "<table border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\">"._ADMINEDITLINKS."</font>";
echo "</td></tr><tr><td align=\"center\">";
?>
<form action="admin.php?op=addLink" method="post">
<?php echo _FULLURLLINK ?>:
<input type="Text" size="50" maxlength="255" name="newLink">
<input type="Submit" value="<?php echo _UPDATE ?>"><br>
</form>
<?php
echo "</td></tr>";
$arLinks = GetLinks();
$arLid = Array_Keys($arLinks);
$inx = 0;
foreach($arLinks as $link)
{
$lid = $arLid[$inx++];
echo "<tr><td><a href=\"admin.php?op=deleteLink&lid=".$lid."\"><img src=\"images/delete_on.gif\" width=16 height=16 border=0 title=\""._DELETE." ".$lid."\" align=\"absmiddle\"></a>&nbsp;";
echo "<a href=\"".$link."\" target=\"_blank\">".$link."</a></td></tr>\n";
}
 
echo "</table></div><br><br><br>";
 
DisplayFoot();
 
}
 
 
//****************************************************************************
// editRSS -- Edit RSS Feeds
//****************************************************************************
function editRSS()
{
global $cfg;
DisplayHead("Administration - RSS");
 
// Admin Menu
displayMenu();
echo "<div align=\"center\">";
echo "<table border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\">RSS Feeds</font>";
echo "</td></tr><tr><td align=\"center\">";
?>
<form action="admin.php?op=addRSS" method="post">
<?php echo _FULLURLLINK ?>:
<input type="Text" size="50" maxlength="255" name="newRSS">
<input type="Submit" value="<?php echo _UPDATE ?>"><br>
</form>
<?php
echo "</td></tr>";
$arLinks = GetRSSLinks();
$arRid = Array_Keys($arLinks);
$inx = 0;
foreach($arLinks as $link)
{
$rid = $arRid[$inx++];
echo "<tr><td><a href=\"admin.php?op=deleteRSS&rid=".$rid."\"><img src=\"images/delete_on.gif\" width=16 height=16 border=0 title=\""._DELETE." ".$rid."\" align=\"absmiddle\"></a>&nbsp;";
echo "<a href=\"".$link."\" target=\"_blank\">".$link."</a></td></tr>\n";
}
 
echo "</table></div><br><br><br>";
 
DisplayFoot();
 
}
 
//****************************************************************************
// validateFile -- Validates the existance of a file and returns the status image
//****************************************************************************
function validateFile($the_file)
{
$msg = "<img src=\"images/red.gif\" align=\"absmiddle\" title=\"Path is not Valid\"><br><font color=\"#ff0000\">Path is not Valid</font>";
if (isFile($the_file))
{
$msg = "<img src=\"images/green.gif\" align=\"absmiddle\" title=\"Valid\">";
}
return $msg;
}
 
//****************************************************************************
// validatePath -- Validates TF Path and Permissions
//****************************************************************************
function validatePath($path)
{
$msg = "<img src=\"images/red.gif\" align=\"absmiddle\" title=\"Path is not Valid\"><br><font color=\"#ff0000\">Path is not Valid</font>";
if (is_dir($path))
{
if (is_writable($path))
{
$msg = "<img src=\"images/green.gif\" align=\"absmiddle\" title=\"Valid\">";
}
else
{
$msg = "<img src=\"images/red.gif\" align=\"absmiddle\" title=\"Path is not Writable\"><br><font color=\"#ff0000\">Path is not Writable -- make sure you chmod +w this path</font>";
}
}
return $msg;
}
 
//****************************************************************************
// configSettings -- Config the Application Settings
//****************************************************************************
function configSettings()
{
global $cfg;
include_once("AliasFile.php");
include_once("RunningTorrent.php");
 
DisplayHead("Administration - Settings");
 
// Admin Menu
displayMenu();
 
// Main Settings Section
echo "<div align=\"center\">";
echo "<table width=\"100%\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\">TorrentFlux Settings</font>";
echo "</td></tr><tr><td align=\"center\">";
 
?>
 
<script language="JavaScript">
function validateSettings()
{
var rtnValue = true;
var msg = "";
if (isNumber(document.theForm.max_upload_rate.value) == false)
{
msg = msg + "* Max Upload Rate must be a valid number.\n";
document.theForm.max_upload_rate.focus();
}
if (isNumber(document.theForm.max_download_rate.value) == false)
{
msg = msg + "* Max Download Rate must be a valid number.\n";
document.theForm.max_download_rate.focus();
}
if (isNumber(document.theForm.max_uploads.value) == false)
{
msg = msg + "* Max # Uploads must be a valid number.\n";
document.theForm.max_uploads.focus();
}
if ((isNumber(document.theForm.minport.value) == false) || (isNumber(document.theForm.maxport.value) == false))
{
msg = msg + "* Port Range must have valid numbers.\n";
document.theForm.minport.focus();
}
if (isNumber(document.theForm.rerequest_interval.value) == false)
{
msg = msg + "* Rerequest Interval must have a valid number.\n";
document.theForm.rerequest_interval.focus();
}
if (document.theForm.rerequest_interval.value < 10)
{
msg = msg + "* Rerequest Interval must 10 or greater.\n";
document.theForm.rerequest_interval.focus();
}
if (isNumber(document.theForm.days_to_keep.value) == false)
{
msg = msg + "* Days to keep Audit Actions must be a valid number.\n";
document.theForm.days_to_keep.focus();
}
if (isNumber(document.theForm.minutes_to_keep.value) == false)
{
msg = msg + "* Minutes to keep user online must be a valid number.\n";
document.theForm.minutes_to_keep.focus();
}
if (isNumber(document.theForm.rss_cache_min.value) == false)
{
msg = msg + "* Minutes to Cache RSS Feeds must be a valid number.\n";
document.theForm.rss_cache_min.focus();
}
if (isNumber(document.theForm.page_refresh.value) == false)
{
msg = msg + "* Page Refresh must be a valid number.\n";
document.theForm.page_refresh.focus();
}
if (isNumber(document.theForm.sharekill.value) == false)
{
msg = msg + "* Keep seeding until Sharing % must be a valid number.\n";
document.theForm.sharekill.focus();
}
if ((document.theForm.maxport.value > 65535) || (document.theForm.minport.value > 65535))
{
msg = msg + "* Port can not be higher than 65535.\n";
document.theForm.minport.focus();
}
if ((document.theForm.maxport.value < 0) || (document.theForm.minport.value < 0))
{
msg = msg + "* Can not have a negative number for port value.\n";
document.theForm.minport.focus();
}
if (document.theForm.maxport.value < document.theForm.minport.value)
{
msg = msg + "* Port Range is not valid.\n";
document.theForm.minport.focus();
}
 
if (msg != "")
{
rtnValue = false;
alert("Please check the following:\n\n" + msg);
}
 
return rtnValue;
}
 
function isNumber(sText)
{
var ValidChars = "0123456789";
var IsNumber = true;
var Char;
 
for (i = 0; i < sText.length && IsNumber == true; i++)
{
Char = sText.charAt(i);
if (ValidChars.indexOf(Char) == -1)
{
IsNumber = false;
}
}
 
return IsNumber;
}
</script>
 
<div align="center">
 
<table cellpadding="5" cellspacing="0" border="0" width="100%">
<form name="theForm" action="admin.php?op=updateConfigSettings" method="post" onsubmit="return validateSettings()">
<input type="Hidden" name="continue" value="configSettings">
<tr>
<td align="left" width="350" valign="top"><strong>Path</strong><br>
Define the PATH where the downloads will go <br>(make sure it ends with a / [slash]).
It must be chmod'd to 777:
</td>
<td valign="top">
<input name="path" type="Text" maxlength="254" value="<?php echo($cfg["path"]); ?>" size="55"><?php echo validatePath($cfg["path"]) ?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Python Path</strong><br>
Specify the path to the Python binary (usually /usr/bin/python or /usr/local/bin/python):
</td>
<td valign="top">
<input name="pythonCmd" type="Text" maxlength="254" value="<?php echo($cfg["pythonCmd"]); ?>" size="55"><?php echo validateFile($cfg["pythonCmd"]) ?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>btphptornado.py Path</strong><br>
Specify the path to the btphptornado.py python script:
</td>
<td valign="top">
<input name="btphpbin" type="Text" maxlength="254" value="<?php echo($cfg["btphpbin"]); ?>" size="55"><?php echo validateFile($cfg["btphpbin"]) ?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>btshowmetainfo.py Path</strong><br>
Specify the path to the btshowmetainfo.py python script:
</td>
<td valign="top">
<input name="btshowmetainfo" type="Text" maxlength="254" value="<?php echo($cfg["btshowmetainfo"]); ?>" size="55"><?php echo validateFile($cfg["btshowmetainfo"]) ?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Use Advanced Start Dialog</strong><br>
When enabled, users will be given the advanced start dialog popup when starting a torrent:
</td>
<td valign="top">
<select name="advanced_start">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["advanced_start"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Enable File Priority</strong><br>
When enabled, users will be allowed to select particular files from the torrent to download:
</td>
<td valign="top">
<select name="enable_file_priority">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["enable_file_priority"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Max Upload Rate</strong><br>
Set the default value for the max upload rate per torrent:
</td>
<td valign="top">
<input name="max_upload_rate" type="Text" maxlength="5" value="<?php echo($cfg["max_upload_rate"]); ?>" size="5"> KB/second
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Max Download Rate</strong><br>
Set the default value for the max download rate per torrent (0 for no limit):
</td>
<td valign="top">
<input name="max_download_rate" type="Text" maxlength="5" value="<?php echo($cfg["max_download_rate"]); ?>" size="5"> KB/second
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Max Upload Connections</strong><br>
Set the default value for the max number of upload connections per torrent:
</td>
<td valign="top">
<input name="max_uploads" type="Text" maxlength="5" value="<?php echo($cfg["max_uploads"]); ?>" size="5">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Port Range</strong><br>
Set the default values for the for port range (Min - Max):
</td>
<td valign="top">
<input name="minport" type="Text" maxlength="5" value="<?php echo($cfg["minport"]); ?>" size="5"> -
<input name="maxport" type="Text" maxlength="5" value="<?php echo($cfg["maxport"]); ?>" size="5">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Rerequest Interval</strong><br>
Set the default value for the rerequest interval to the tracker (default 1800 seconds):
</td>
<td valign="top">
<input name="rerequest_interval" type="Text" maxlength="5" value="<?php echo($cfg["rerequest_interval"]); ?>" size="5">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Extra BitTornado Commandline Options</strong><br>
DO NOT include --max_upload_rate, --minport, --maxport, --max_uploads here as they are
included by TorrentFlux settings above:
</td>
<td valign="top">
<input name="cmd_options" type="Text" maxlength="254" value="<?php echo($cfg["cmd_options"]); ?>" size="55">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Enable Torrent Search</strong><br>
When enabled, users will be allowed to perform torrent searches from the home page:
</td>
<td valign="top">
<select name="enable_search">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["enable_search"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Default Torrent Search Engine</strong><br>
Select the default search engine for torrent searches:
</td>
<td valign="top">
<?php
echo buildSearchEngineDDL($cfg["searchEngine"]);
?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Enable Make Torrent</strong><br>
When enabled, users will be allowed make torrent files from the directory view:
</td>
<td valign="top">
<select name="enable_maketorrent">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["enable_maketorrent"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>btmakemetafile.py Path</strong><br>
Specify the path to the btmakemetafile.py python script (used for making torrents):
</td>
<td valign="top">
<input name="btmakemetafile" type="Text" maxlength="254" value="<?php echo($cfg["btmakemetafile"]); ?>" size="55"><?php echo validateFile($cfg["btmakemetafile"]); ?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Enable Torrent File Download</strong><br>
When enabled, users will be allowed download the torrent meta file from the torrent list view:
</td>
<td valign="top">
<select name="enable_torrent_download">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["enable_torrent_download"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Enable File Download</strong><br>
When enabled, users will be allowed download from the directory view:
</td>
<td valign="top">
<select name="enable_file_download">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["enable_file_download"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Enable Text/NFO Viewer</strong><br>
When enabled, users will be allowed to view Text/NFO files from the directory listing:
</td>
<td valign="top">
<select name="enable_view_nfo">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["enable_view_nfo"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Download Package Type</strong><br>
When File Download is enabled, users will be allowed download from the directory view using
a packaging system. Make sure your server supports the package type you select:
</td>
<td valign="top">
<select name="package_type">
<option value="tar" selected>tar</option>
<option value="zip" <?php
if ($cfg["package_type"] == "zip")
{
echo "selected";
}
?>>zip</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Show Server Load</strong><br>
Enable showing the average server load over the last 15 minutes from <? echo $cfg["loadavg_path"] ?> file:
</td>
<td valign="top">
<select name="show_server_load">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["show_server_load"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>loadavg Path</strong><br>
Path to the loadavg file:
</td>
<td valign="top">
<input name="loadavg_path" type="Text" maxlength="254" value="<?php echo($cfg["loadavg_path"]); ?>" size="55"><?php echo validateFile($cfg["loadavg_path"]) ?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Days to keep Audit Actions in the Log</strong><br>
Number of days that audit actions will be held in the database:
</td>
<td valign="top">
<input name="days_to_keep" type="Text" maxlength="3" value="<?php echo($cfg["days_to_keep"]); ?>" size="3">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Minutes to Keep User Online Status</strong><br>
Number of minutes before a user status changes to offline after leaving TorrentFlux:
</td>
<td valign="top">
<input name="minutes_to_keep" type="Text" maxlength="2" value="<?php echo($cfg["minutes_to_keep"]); ?>" size="2">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Minutes to Cache RSS Feeds</strong><br>
Number of minutes to cache the RSS XML feed on server (speeds up reload):
</td>
<td valign="top">
<input name="rss_cache_min" type="Text" maxlength="3" value="<?php echo($cfg["rss_cache_min"]); ?>" size="3">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Page Refresh (in seconds)</strong><br>
Number of seconds before the torrent list page refreshes:
</td>
<td valign="top">
<input name="page_refresh" type="Text" maxlength="3" value="<?php echo($cfg["page_refresh"]); ?>" size="3">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Default Theme</strong><br>
Select the default theme that users will have (including login screen):
</td>
<td valign="top">
<select name="default_theme">
<?php
$arThemes = GetThemes();
for($inx = 0; $inx < sizeof($arThemes); $inx++)
{
$selected = "";
if ($cfg["default_theme"] == $arThemes[$inx])
{
$selected = "selected";
}
echo "<option value=\"".$arThemes[$inx]."\" ".$selected.">".$arThemes[$inx]."</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Default Language</strong><br>
Select the default language that users will have:
</td>
<td valign="top">
<select name="default_language">
<?php
$arLanguage = GetLanguages();
for($inx = 0; $inx < sizeof($arLanguage); $inx++)
{
$selected = "";
if ($cfg["default_language"] == $arLanguage[$inx])
{
$selected = "selected";
}
echo "<option value=\"".$arLanguage[$inx]."\" ".$selected.">".GetLanguageFromFile($arLanguage[$inx])."</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Show SQL Debug Statements</strong><br>
SQL Errors will always be displayed but when this feature is enabled the SQL Statement
that caused the error will be displayed as well:
</td>
<td valign="top">
<select name="debug_sql">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["debug_sql"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Default Torrent Completion Activity</strong><br>
Select whether or not a torrent should keep seeding when download is complete
(please seed your torrents):
</td>
<td valign="top">
<select name="torrent_dies_when_done">
<option value="True">Die When Done</option>
<option value="False" <?php
if ($cfg["torrent_dies_when_done"] == "False")
{
echo "selected";
}
?>>Keep Seeding</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Default Percentage When Seeding should Stop</strong><br>
Set the default share pecentage where torrents will shutoff
when running torrents that do not die when done.
Value '0' will seed forever.
</td>
<td valign="top">
<input name="sharekill" type="Text" maxlength="3" value="<?php echo($cfg["sharekill"]); ?>" size="3">%
</td>
</tr>
</table>
<br>
<input type="Submit" value="Update Settings">
</form>
</div>
<br>
<?php
echo "</td></tr>";
echo "</table></div>";
 
DisplayFoot();
}
 
//****************************************************************************
// updateConfigSettings -- updating App Settings
//****************************************************************************
function updateConfigSettings()
{
global $cfg;
$tmpPath = getRequestVar("path");
if (!empty($tmpPath) && substr( $_POST["path"], -1 ) != "/")
{
// path requires a / on the end
$_POST["path"] = $_POST["path"] . "/";
}
if ($_POST["AllowQueing"] != $cfg["AllowQueing"] ||
$_POST["maxServerThreads"] != $cfg["maxServerThreads"] ||
$_POST["maxUserThreads"] != $cfg["maxUserThreads"] ||
$_POST["sleepInterval"] != $cfg["sleepInterval"] ||
$_POST["debugTorrents"] != $cfg["debugTorrents"] ||
$_POST["tfQManager"] != $cfg["tfQManager"] ||
$_POST["btphpbin"] != $cfg["btphpbin"]
)
{
// kill QManager process;
if(getQManagerPID() != "")
{
stopQManager();
}
 
$settings = $_POST;
 
saveSettings($settings);
AuditAction($cfg["constants"]["admin"], " Updating TorrentFlux Settings");
 
// if enabling Start QManager
if($_POST["AllowQueing"])
{
sleep(2);
startQManager($_POST["maxServerThreads"], $_POST["maxUserThreads"], $_POST["sleepInterval"]);
sleep(1);
}
}
else
{
$settings = $_POST;
 
saveSettings($settings);
AuditAction($cfg["constants"]["admin"], " Updating TorrentFlux Settings");
}
 
$continue = getRequestVar('continue');
header("Location: admin.php?op=".$continue);
}
 
//****************************************************************************
// queueSettings -- Config the Queue Settings
//****************************************************************************
function queueSettings()
{
global $cfg;
include_once("AliasFile.php");
include_once("RunningTorrent.php");
 
DisplayHead("Administration - Search Settings");
 
// Admin Menu
displayMenu();
 
// Queue Manager Section
echo "<div align=\"center\">";
echo "<a name=\"QManager\" id=\"QManager\"></a>";
echo "<table width=\"100%\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<font class=\"title\">";
if(checkQManager() > 0)
{
echo "&nbsp;&nbsp;<img src=\"images/green.gif\" align=\"absmiddle\" align=\"absmiddle\"> Queue Manager Running [PID=".getQManagerPID()." with ".strval(getRunningTorrentCount())." torrent(s)]";
}
else
{
echo "&nbsp;&nbsp;<img src=\"images/black.gif\" align=\"absmiddle\"> Queue Manager Off";
}
echo "</font>";
echo "</td></tr><tr><td align=\"center\">";
?>
<script language="JavaScript">
function validateSettings()
{
var rtnValue = true;
var msg = "";
if (isNumber(document.theForm.maxServerThreads.value) == false)
{
msg = msg + "* Max Server Threads must be a valid number.\n";
document.theForm.maxServerThreads.focus();
}
if (isNumber(document.theForm.maxUserThreads.value) == false)
{
msg = msg + "* Max User Threads must be a valid number.\n";
document.theForm.maxUserThreads.focus();
}
if (isNumber(document.theForm.sleepInterval.value) == false)
{
msg = msg + "* Sleep Interval must be a valid number.\n";
document.theForm.sleepInterval.focus();
}
 
if (msg != "")
{
rtnValue = false;
alert("Please check the following:\n\n" + msg);
}
 
return rtnValue;
}
 
function isNumber(sText)
{
var ValidChars = "0123456789.";
var IsNumber = true;
var Char;
 
for (i = 0; i < sText.length && IsNumber == true; i++)
{
Char = sText.charAt(i);
if (ValidChars.indexOf(Char) == -1)
{
IsNumber = false;
}
}
 
return IsNumber;
}
</script>
 
<div align="center">
 
<table cellpadding="5" cellspacing="0" border="0" width="100%">
<form name="theForm" action="admin.php?op=updateConfigSettings" method="post" onsubmit="return validateSettings()">
<input type="Hidden" name="continue" value="queueSettings">
<tr>
<td align="left" width="350" valign="top"><strong>Enable Queue Manager</strong><br>
Enable the Queue Manager to allow users to queue torrents:
</td>
<td>
<select name="AllowQueing">
<option value="1">true</option>
<option value="0" <?php
if (!$cfg["AllowQueing"])
{
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>tfQManager Path</strong><br>
Specify the path to the tfQManager.py python script:
</td>
<td valign="top">
<input name="tfQManager" type="Text" maxlength="254" value="<?php echo($cfg["tfQManager"]); ?>" size="55"><?php echo validateFile($cfg["tfQManager"]) ?>
</td>
</tr>
<!-- Only used for develpment or if you really really know what you are doing
<tr>
<td align="left" width="350" valign="top"><strong>Enable Queue Manager Debugging</strong><br>
Creates huge log files only for debugging. DO NOT KEEP THIS MODE ON:
</td>
<td>
<select name="debugTorrents">
<option value="1">true</option>
<option value="0" <?php
if (array_key_exists("debugTorrents",$cfg))
{
if (!$cfg["debugTorrents"])
{
echo "selected";
}
}
else
{
insertSetting("debugTorrents",false);
echo "selected";
}
?>>false</option>
</select>
</td>
</tr>
-->
<tr>
<td align="left" width="350" valign="top"><strong>Max Server Threads</strong><br>
Specify the maximum number of torrents the server will allow to run at
one time (admins may override this):
</td>
<td valign="top">
<input name="maxServerThreads" type="Text" maxlength="3" value="<?php echo($cfg["maxServerThreads"]); ?>" size="3">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Max User Threads</strong><br>
Specify the maximum number of torrents a single user may run at
one time:
</td>
<td valign="top">
<input name="maxUserThreads" type="Text" maxlength="3" value="<?php echo($cfg["maxUserThreads"]); ?>" size="3">
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Polling Interval</strong><br>
Number of seconds the Queue Manager will sleep before checking for new torrents to run:
</td>
<td valign="top">
<input name="sleepInterval" type="Text" maxlength="3" value="<?php echo($cfg["sleepInterval"]); ?>" size="3">
</td>
</tr>
<tr>
<td align="center" colspan="2">
<br><br>
<input type="Submit" value="Update Settings">
</td>
</tr>
</form>
</table>
 
 
</div>
<br>
<?php
echo "</td></tr>";
echo "</table></div>";
 
$displayQueue = True;
$displayRunningTorrents = True;
 
// Its a timming thing.
if ($displayRunningTorrents)
{
// get Running Torrents.
$runningTorrents = getRunningTorrents();
}
 
if ($displayQueue)
{
$output = "";
 
echo "\n";
echo "<table width=\"760\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr>";
echo "<td><img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\"> Queued Items </font></td>";
echo "</tr></table>";
echo "</td></tr>";
echo "<tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"15%\"><div align=center class=\"title\">"._USER."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._FILE."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"15%\"><div align=center class=\"title\">"._TIMESTAMP."</div></td>";
echo "</tr>";
echo "\n";
 
$qDir = $cfg["torrent_file_path"]."queue/";
if (is_dir($cfg["torrent_file_path"]))
{
if (is_writable($cfg["torrent_file_path"]) && !is_dir($qDir))
{
@mkdir($qDir, 0777);
}
 
// get Queued Items and List them out.
$output .= "";
$handle = @opendir($qDir);
while($filename = readdir($handle))
{
if ($filename != "tfQManager.log")
{
if ($filename != "." && $filename != ".." && strpos($filename,".pid") == 0)
{
$output .= "<tr>";
$output .= "<td><div class=\"tiny\">";
$af = new AliasFile(str_replace("queue/","",$qDir).str_replace(".Qinfo","",$filename), "");
$output .= $af->torrentowner;
$output .= "</div></td>";
$output .= "<td><div align=center><div class=\"tiny\" align=\"left\">".str_replace(array(".Qinfo",".stat"),"",$filename)."</div></td>";
$output .= "<td><div class=\"tiny\" align=\"center\">".date(_DATETIMEFORMAT, strval(filectime($qDir.$filename)))."</div></td>";
$output .= "</tr>";
$output .= "\n";
}
}
}
closedir($handle);
}
 
if( strlen($output) == 0 )
{
$output = "<tr><td colspan=3><div class=\"tiny\" align=center>Queue is Empty</div></td></tr>";
}
echo $output;
 
echo "</table>";
}
 
if ($displayRunningTorrents)
{
$output = "";
 
echo "\n";
echo "<table width=\"760\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr>";
echo "<td><img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\"> Running Items </font></td>";
echo "</tr></table>";
echo "</td></tr>";
echo "<tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"15%\"><div align=center class=\"title\">"._USER."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._FILE."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"1%\"><div align=center class=\"title\">".str_replace(" ","<br>",_FORCESTOP)."</div></td>";
echo "</tr>";
echo "\n";
 
// get running torrents and List them out.
$runningTorrents = getRunningTorrents();
foreach ($runningTorrents as $key => $value)
{
$rt = new RunningTorrent($value);
$output .= $rt->BuildAdminOutput();
}
 
if( strlen($output) == 0 )
{
$output = "<tr><td colspan=3><div class=\"tiny\" align=center>No Running Torrents</div></td></tr>";
}
echo $output;
 
echo "</table>";
 
}
 
DisplayFoot();
}
 
 
//****************************************************************************
// searchSettings -- Config the Search Engine Settings
//****************************************************************************
function searchSettings()
{
global $cfg;
include_once("AliasFile.php");
include_once("RunningTorrent.php");
include_once("searchEngines/SearchEngineBase.php");
 
DisplayHead("Administration - Search Settings");
 
// Admin Menu
displayMenu();
 
// Main Settings Section
echo "<div align=\"center\">";
echo "<table width=\"100%\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\">Search Settings</font>";
echo "</td></tr><tr><td align=\"center\">";
 
?>
<div align="center">
 
<table cellpadding="5" cellspacing="0" border="0" width="100%">
<form name="theForm" action="admin.php?op=searchSettings" method="post">
<tr>
<td align="right" width="350" valign="top"><strong>Select Search Engine</strong><br>
</td>
<td valign="top">
<?php
$searchEngine = getRequestVar('searchEngine');
if (empty($searchEngine)) $searchEngine = $cfg["searchEngine"];
echo buildSearchEngineDDL($searchEngine,true)
?>
</td>
</tr>
</form>
</table>
 
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr><td>
<?php
if (is_file('searchEngines/'.$searchEngine.'Engine.php'))
{
include_once('searchEngines/'.$searchEngine.'Engine.php');
$sEngine = new SearchEngine(serialize($cfg));
if ($sEngine->initialized)
{
echo "<table width=\"100%\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\"><tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\"><img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\">".$sEngine->mainTitle." Search Settings</font></td>";
echo "</tr></table></td>";
echo "<form name=\"theSearchEngineSettings\" action=\"admin.php?op=updateSearchSettings\" method=\"post\">\n";
echo "<input type=\"hidden\" name=\"searchEngine\" value=\"".$searchEngine."\">";
?>
</td>
</tr>
<tr>
<td>
 
<table cellpadding="5" cellspacing="0" border="0" width="100%">
<tr>
<td align="left" width="350" valign="top"><strong>Search Engine URL:</strong></td>
<td valign="top">
<?php echo "<a href=\"http://".$sEngine->mainURL."\" target=\"_blank\">".$sEngine->mainTitle."</a>"; ?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Search Module Author:</strong></td>
<td valign="top">
<?php echo $sEngine->author; ?>
</td>
</tr>
<tr>
<td align="left" width="350" valign="top"><strong>Version:</strong></td>
<td valign="top">
<?php echo $sEngine->version; ?>
</td>
</tr>
<?php
if(strlen($sEngine->updateURL)>0)
{
?>
<tr>
<td align="left" width="350" valign="top"><strong>Update Location:</strong></td>
<td valign="top">
<?php echo "<a href=\"".$sEngine->updateURL."\" target=\"_blank\">Check for Update</a>"; ?>
</td>
</tr>
<?php
}
if (! $sEngine->catFilterName == '')
{
?>
<tr>
<td align="left" width="350" valign="top"><strong>Search Filter:</strong><br>
Select the items that you DO NOT want to show in the torrent search:
</td>
<td valign="top">
<?php
echo "<select multiple name=\"".$sEngine->catFilterName."[]\" size=\"8\" STYLE=\"width: 125px\">";
echo "<option value=\"\">[NO FILTER]</option>";
foreach ($sEngine->getMainCategories(false) as $mainId => $mainName)
{
echo "<option value=\"".$mainId."\" ";
if (@in_array($mainId, $sEngine->catFilter))
{
echo " selected";
}
echo ">".$mainName."</option>";
}
echo "</select>";
echo " </td>\n";
echo " </tr>\n";
}
}
}
 
echo " </table>\n";
echo " </td></tr></table>";
echo " <br>\n";
echo " <input type=\"Submit\" value=\"Update Settings\">";
echo " </form>\n";
echo " </div>\n";
echo " <br>\n";
echo "</td></tr>";
echo "</table></div>";
 
DisplayFoot();
}
 
//****************************************************************************
// updateSearchSettings -- updating Search Engine Settings
//****************************************************************************
function updateSearchSettings()
{
global $cfg;
 
foreach ($_POST as $key => $value)
{
if ($key != "searchEngine")
{
$settings[$key] = $value;
}
}
 
saveSettings($settings);
AuditAction($cfg["constants"]["admin"], " Updating TorrentFlux Search Settings");
 
$searchEngine = getRequestVar('searchEngine');
if (empty($searchEngine)) $searchEngine = $cfg["searchEngine"];
header("location: admin.php?op=searchSettings&searchEngine=".$searchEngine);
}
 
//****************************************************************************
//****************************************************************************
//****************************************************************************
//****************************************************************************
// TRAFFIC CONTROLER
$op = getRequestVar('op');
 
switch ($op)
{
 
default:
$min = getRequestVar('min');
if(empty($min)) $min=0;
showIndex($min);
break;
 
case "showUserActivity":
$min = getRequestVar('min');
if(empty($min)) $min=0;
$user_id = getRequestVar('user_id');
$srchFile = getRequestVar('srchFile');
$srchAction = getRequestVar('srchAction');
showUserActivity($min, $user_id, $srchFile, $srchAction);
break;
 
case "backupDatabase":
backupDatabase();
break;
 
case "editRSS":
editRSS();
break;
 
case "addRSS":
$newRSS = getRequestVar('newRSS');
addRSS($newRSS);
break;
 
case "deleteRSS":
$rid = getRequestVar('rid');
deleteRSS($rid);
break;
 
case "editLinks":
editLinks();
break;
 
case "addLink":
$newLink = getRequestVar('newLink');
addLink($newLink);
break;
 
case "deleteLink":
$lid = getRequestVar('lid');
deleteLink($lid);
break;
 
case "CreateUser":
CreateUser();
break;
 
case "addUser":
$newUser = getRequestVar('newUser');
$pass1 = getRequestVar('pass1');
$userType = getRequestVar('userType');
addUser($newUser, $pass1, $userType);
break;
 
case "deleteUser":
$user_id = getRequestVar('user_id');
deleteUser($user_id);
break;
 
case "editUser":
$user_id = getRequestVar('user_id');
editUser($user_id);
break;
 
case "updateUser":
$user_id = getRequestVar('user_id');
$org_user_id = getRequestVar('org_user_id');
$pass1 = getRequestVar('pass1');
$userType = getRequestVar('userType');
$hideOffline = getRequestVar('hideOffline');
updateUser($user_id, $org_user_id, $pass1, $userType, $hideOffline);
break;
 
case "configSettings":
configSettings();
break;
 
case "updateConfigSettings":
if (! array_key_exists("debugTorrents", $_REQUEST))
{
$_REQUEST["debugTorrents"] = false;
}
updateConfigSettings();
break;
 
case "queueSettings":
queueSettings();
break;
 
case "searchSettings":
searchSettings();
break;
 
case "updateSearchSettings":
updateSearchSettings();
break;
 
}
//****************************************************************************
//****************************************************************************
//****************************************************************************
//****************************************************************************
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-active-record.inc.php
0,0 → 1,536
<?php
/*
 
@version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
Latest version is available at http://adodb.sourceforge.net
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Active Record implementation. Superset of Zend Framework's.
Version 0.02
*/
 
global $_ADODB_ACTIVE_DBS;
 
// array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat
$_ADODB_ACTIVE_DBS = array();
 
 
class ADODB_Active_DB {
var $db; // ADOConnection
var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename
}
 
class ADODB_Active_Table {
var $name; // table name
var $flds; // assoc array of adofieldobjs, indexed by fieldname
var $keys; // assoc array of primary keys, indexed by fieldname
}
 
// returns index into $_ADODB_ACTIVE_DBS
function ADODB_SetDatabaseAdapter(&$db)
{
global $_ADODB_ACTIVE_DBS;
foreach($_ADODB_ACTIVE_DBS as $k => $d) {
if ($d->db == $db) return $k;
}
$obj = new ADODB_Active_DB();
$obj->db =& $db;
$obj->tables = array();
$_ADODB_ACTIVE_DBS[] = $obj;
return sizeof($_ADODB_ACTIVE_DBS)-1;
}
 
class ADODB_Active_Record {
var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat]
var $_table; // tablename
var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat]
var $_where; // where clause set in Load()
var $_saved = false; // indicates whether data is already inserted.
var $_lasterr = false; // last error message
// should be static
function SetDatabaseAdapter(&$db)
{
return ADODB_SetDatabaseAdapter($db);
}
// php4 constructor
function ADODB_Active_Record($table = false, $pkeyarr=false, $db=false)
{
ADODB_Active_Record::__construct($table,$pkeyarr,$db);
}
// php5 constructor
function __construct($table = false, $pkeyarr=false, $db=false)
{
global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS;
if ($db == false && is_object($pkeyarr)) {
$db = $pkeyarr;
$pkeyarr = false;
}
if (!$table) $table = $this->_pluralize(get_class($this));
if ($db) {
$this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db);
} else
$this->_dbat = sizeof($_ADODB_ACTIVE_DBS)-1;
if ($this->_dbat < 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor');
$this->_table = $table;
$this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future
$this->UpdateActiveTable($pkeyarr);
}
function _pluralize($table)
{
$ut = strtoupper($table);
$len = strlen($table);
$lastc = $ut[$len-1];
$lastc2 = substr($ut,$len-2);
switch ($lastc) {
case 'S':
return $table.'es';
case 'Y':
return substr($table,0,$len-1).'ies';
case 'X':
return $table.'es';
case 'H':
if ($lastc2 == 'CH' || $lastc2 == 'SH')
return $table.'es';
default:
return $table.'s';
}
}
//////////////////////////////////
// update metadata
function UpdateActiveTable($pkeys=false,$forceUpdate=false)
{
global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS;
$activedb =& $_ADODB_ACTIVE_DBS[$this->_dbat];
 
$table = $this->_table;
$tables = $activedb->tables;
$tableat = $this->_tableat;
if (!$forceUpdate && !empty($tables[$tableat])) {
$tobj =& $tables[$tableat];
foreach($tobj->flds as $name => $fld)
$this->$name = null;
return;
}
$activetab = new ADODB_Active_Table();
$activetab->name = $table;
$db =& $activedb->db;
$cols = $db->MetaColumns($table);
if (!$cols) {
$this->Error("Invalid table name: $table",'UpdateActiveTable');
return false;
}
$fld = reset($cols);
if (!$pkeys) {
if (isset($fld->primary_key)) {
$pkeys = array();
foreach($cols as $name => $fld) {
if (!empty($fld->primary_key)) $pkeys[] = $name;
}
} else
$pkeys = $this->GetPrimaryKeys($db, $table);
}
if (empty($pkeys)) {
$this->Error("No primary key found for table $table",'UpdateActiveTable');
return false;
}
$attr = array();
$keys = array();
switch($ADODB_ASSOC_CASE) {
case 0:
foreach($cols as $name => $fldobj) {
$name = strtolower($name);
$this->$name = null;
$attr[$name] = $fldobj;
}
foreach($pkeys as $k => $name) {
$keys[strtolower($name)] = strtolower($name);
}
break;
case 1:
foreach($cols as $name => $fldobj) {
$name = strtoupper($name);
$this->$name = null;
$attr[$name] = $fldobj;
}
foreach($pkeys as $k => $name) {
$keys[strtoupper($name)] = strtoupper($name);
}
break;
default:
foreach($cols as $name => $fldobj) {
$name = ($name);
$this->$name = null;
$attr[$name] = $fldobj;
}
foreach($pkeys as $k => $name) {
$keys[$name] = ($name);
}
break;
}
$activetab->keys = $keys;
$activetab->flds = $attr;
$activedb->tables[$table] = $activetab;
}
function GetPrimaryKeys(&$db, $table)
{
return $db->MetaPrimaryKeys($table);
}
// error handler for both PHP4+5.
function Error($err,$fn)
{
global $_ADODB_ACTIVE_DBS;
$fn = get_class($this).'::'.$fn;
$this->_lasterr = $fn.': '.$err;
if ($this->_dbat < 0) $db = false;
else {
$activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
$db =& $activedb->db;
}
if (function_exists('adodb_throw')) {
if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false);
else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db);
} else
if (!$db || $db->debug) ADOConnection::outp($this->_lasterr);
}
// return last error message
function ErrorMsg()
{
if (!function_exists('adodb_throw')) {
if ($this->_dbat < 0) $db = false;
else $db = $this->DB();
// last error could be database error too
if ($db && $db->ErrorMsg()) return $db->ErrorMsg();
}
return $this->_lasterr;
}
// retrieve ADOConnection from _ADODB_Active_DBs
function &DB()
{
global $_ADODB_ACTIVE_DBS;
if ($this->_dbat < 0) {
$false = false;
$this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB");
return $false;
}
$activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
$db =& $activedb->db;
return $db;
}
// retrieve ADODB_Active_Table
function &TableInfo()
{
global $_ADODB_ACTIVE_DBS;
$activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
$table =& $activedb->tables[$this->_tableat];
return $table;
}
// set a numeric array (using natural table field ordering) as object properties
function Set(&$row)
{
$db =& $this->DB();
if (!$row) {
$this->_saved = false;
return false;
}
$this->_saved = true;
$table =& $this->TableInfo();
if (sizeof($table->flds) != sizeof($row)) {
$this->Error("Table structure of $this->_table has changed","Load");
return false;
}
$cnt = 0;
foreach($table->flds as $name=>$fld) {
$this->$name = $row[$cnt];
$cnt += 1;
}
#$this->_original =& $row;
return true;
}
// get last inserted id for INSERT
function LastInsertID(&$db,$fieldname)
{
if ($db->hasInsertID)
$val = $db->Insert_ID($this->_table,$fieldname);
else
$val = false;
if (is_null($val) || $val === false) {
// this might not work reliably in multi-user environment
return $db->GetOne("select max(".$fieldname.") from ".$this->_table);
}
return $val;
}
// quote data in where clause
function doquote(&$db, $val,$t)
{
switch($t) {
case 'D':
case 'T':
if (empty($val)) return 'null';
case 'C':
case 'X':
if (is_null($val)) return 'null';
if (strncmp($val,"'",1) != 0 && substr($val,strlen($val)-1,1) != "'") {
return $db->qstr($val);
break;
}
default:
return $val;
break;
}
}
// generate where clause for an UPDATE/SELECT
function GenWhere(&$db, &$table)
{
$keys = $table->keys;
$parr = array();
foreach($keys as $k) {
$f = $table->flds[$k];
if ($f) {
$parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type));
}
}
return implode(' and ', $parr);
}
//------------------------------------------------------------ Public functions below
function Load($where,$bindarr=false)
{
$db =& $this->DB(); if (!$db) return false;
$this->_where = $where;
$save = $db->SetFetchMode(ADODB_FETCH_NUM);
$row = $db->GetRow("select * from ".$this->_table.' WHERE '.$where,$bindarr);
$db->SetFetchMode($save);
return $this->Set($row);
}
// false on error
function Save()
{
if ($this->_saved) $ok = $this->Update();
else $ok = $this->Insert();
return $ok;
}
// false on error
function Insert()
{
$db =& $this->DB(); if (!$db) return false;
$cnt = 0;
$table =& $this->TableInfo();
 
foreach($table->flds as $name=>$fld) {
$val = $this->$name;
/*
if (is_null($val)) {
if (isset($fld->not_null) && $fld->not_null) {
if (isset($fld->default_value) && strlen($fld->default_value)) continue;
else $this->Error("Cannot insert null into $name","Insert");
}
}*/
$valarr[] = $val;
$names[] = $name;
$valstr[] = $db->Param($cnt);
$cnt += 1;
}
$sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')';
$ok = $db->Execute($sql,$valarr);
if ($ok) {
$this->_saved = true;
$autoinc = false;
foreach($table->keys as $k) {
if (is_null($this->$k)) {
$autoinc = true;
break;
}
}
if ($autoinc && sizeof($table->keys) == 1) {
$k = reset($table->keys);
$this->$k = $this->LastInsertID($db,$k);
}
}
#$this->_original =& $valarr;
return !empty($ok);
}
function Delete()
{
$db =& $this->DB(); if (!$db) return false;
$table =& $this->TableInfo();
$where = $this->GenWhere($db,$table);
$sql = 'DELETE FROM '.$this->_table.' WHERE '.$where;
$db->Execute($sql);
}
// returns 0 on error, 1 on update, 2 on insert
function Replace()
{
global $ADODB_ASSOC_CASE;
$db =& $this->DB(); if (!$db) return false;
$table =& $this->TableInfo();
$pkey = $table->keys;
foreach($table->flds as $name=>$fld) {
$val = $this->$name;
/*
if (is_null($val)) {
if (isset($fld->not_null) && $fld->not_null) {
if (isset($fld->default_value) && strlen($fld->default_value)) continue;
else {
$this->Error("Cannot update null into $name","Replace");
return false;
}
}
}*/
$t = $db->MetaType($fld->type);
$arr[$name] = $this->doquote($db,$val,$t);
$valarr[] = $val;
}
if (!is_array($pkey)) $pkey = array($pkey);
if ($ADODB_ASSOC_CASE == 0)
foreach($pkey as $k => $v)
$pkey[$k] = strtolower($v);
elseif ($ADODB_ASSOC_CASE == 0)
foreach($pkey as $k => $v)
$pkey[$k] = strtoupper($v);
$ok = $db->Replace($this->_table,$arr,$pkey);
if ($ok) {
$this->_saved = true; // 1= update 2=insert
if ($ok == 2) {
$autoinc = false;
foreach($table->keys as $k) {
if (is_null($this->$k)) {
$autoinc = true;
break;
}
}
if ($autoinc && sizeof($table->keys) == 1) {
$k = reset($table->keys);
$this->$k = $this->LastInsertID($db,$k);
}
}
#$this->_original =& $valarr;
}
return $ok;
}
 
// returns false on error
function Update()
{
$db =& $this->DB(); if (!$db) return false;
$table =& $this->TableInfo();
$where = $this->GenWhere($db, $table);
if (!$where) {
$this->error("Where missing for table $table", "Update");
return false;
}
$cnt = 0;
foreach($table->flds as $name=>$fld) {
if (isset($table->keys[$name])) continue;
$val = $this->$name;
if (is_null($val)) {
if (isset($fld->not_null) && $fld->not_null) {
if (isset($fld->default_value) && strlen($fld->default_value)) continue;
else {
$this->Error("Cannot set field $name to NULL","Update");
return false;
}
}
}
$valarr[] = $val;
$pairs[] = $name.'='.$db->Param($cnt);
$cnt += 1;
}
#$this->_original =& $valarr;
$sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where;
$ok = $db->Execute($sql,$valarr);
return !empty($ok);
}
function GetAttributeNames()
{
$table =& $this->TableInfo();
if (!$table) return false;
return array_keys($table->flds);
}
};
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-csvlib.inc.php
0,0 → 1,312
<?php
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
global $ADODB_INCLUDED_CSV;
$ADODB_INCLUDED_CSV = 1;
 
/*
 
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Library for CSV serialization. This is used by the csv/proxy driver and is the
CacheExecute() serialization format.
==== NOTE ====
Format documented at http://php.weblogs.com/ADODB_CSV
==============
*/
 
/**
* convert a recordset into special format
*
* @param rs the recordset
*
* @return the CSV formated data
*/
function _rs2serialize(&$rs,$conn=false,$sql='')
{
$max = ($rs) ? $rs->FieldCount() : 0;
if ($sql) $sql = urlencode($sql);
// metadata setup
if ($max <= 0 || $rs->dataProvider == 'empty') { // is insert/update/delete
if (is_object($conn)) {
$sql .= ','.$conn->Affected_Rows();
$sql .= ','.$conn->Insert_ID();
} else
$sql .= ',,';
$text = "====-1,0,$sql\n";
return $text;
}
$tt = ($rs->timeCreated) ? $rs->timeCreated : time();
## changed format from ====0 to ====1
$line = "====1,$tt,$sql\n";
if ($rs->databaseType == 'array') {
$rows =& $rs->_array;
} else {
$rows = array();
while (!$rs->EOF) {
$rows[] = $rs->fields;
$rs->MoveNext();
}
}
for($i=0; $i < $max; $i++) {
$o =& $rs->FetchField($i);
$flds[] = $o;
}
$savefetch = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode;
$class = $rs->connection->arrayClass;
$rs2 = new $class();
$rs2->sql = $rs->sql;
$rs2->oldProvider = $rs->dataProvider;
$rs2->InitArrayFields($rows,$flds);
$rs2->fetchMode = $savefetch;
return $line.serialize($rs2);
}
 
/**
* Open CSV file and convert it into Data.
*
* @param url file/ftp/http url
* @param err returns the error message
* @param timeout dispose if recordset has been alive for $timeout secs
*
* @return recordset, or false if error occured. If no
* error occurred in sql INSERT/UPDATE/DELETE,
* empty recordset is returned
*/
function &csv2rs($url,&$err,$timeout=0, $rsclass='ADORecordSet_array')
{
$false = false;
$err = false;
$fp = @fopen($url,'rb');
if (!$fp) {
$err = $url.' file/URL not found';
return $false;
}
@flock($fp, LOCK_SH);
$arr = array();
$ttl = 0;
if ($meta = fgetcsv($fp, 32000, ",")) {
// check if error message
if (strncmp($meta[0],'****',4) === 0) {
$err = trim(substr($meta[0],4,1024));
fclose($fp);
return $false;
}
// check for meta data
// $meta[0] is -1 means return an empty recordset
// $meta[1] contains a time
if (strncmp($meta[0], '====',4) === 0) {
if ($meta[0] == "====-1") {
if (sizeof($meta) < 5) {
$err = "Corrupt first line for format -1";
fclose($fp);
return $false;
}
fclose($fp);
if ($timeout > 0) {
$err = " Illegal Timeout $timeout ";
return $false;
}
$rs = new $rsclass($val=true);
$rs->fields = array();
$rs->timeCreated = $meta[1];
$rs->EOF = true;
$rs->_numOfFields = 0;
$rs->sql = urldecode($meta[2]);
$rs->affectedrows = (integer)$meta[3];
$rs->insertid = $meta[4];
return $rs;
}
# Under high volume loads, we want only 1 thread/process to _write_file
# so that we don't have 50 processes queueing to write the same data.
# We use probabilistic timeout, ahead of time.
#
# -4 sec before timeout, give processes 1/32 chance of timing out
# -2 sec before timeout, give processes 1/16 chance of timing out
# -1 sec after timeout give processes 1/4 chance of timing out
# +0 sec after timeout, give processes 100% chance of timing out
if (sizeof($meta) > 1) {
if($timeout >0){
$tdiff = (integer)( $meta[1]+$timeout - time());
if ($tdiff <= 2) {
switch($tdiff) {
case 4:
case 3:
if ((rand() & 31) == 0) {
fclose($fp);
$err = "Timeout 3";
return $false;
}
break;
case 2:
if ((rand() & 15) == 0) {
fclose($fp);
$err = "Timeout 2";
return $false;
}
break;
case 1:
if ((rand() & 3) == 0) {
fclose($fp);
$err = "Timeout 1";
return $false;
}
break;
default:
fclose($fp);
$err = "Timeout 0";
return $false;
} // switch
} // if check flush cache
}// (timeout>0)
$ttl = $meta[1];
}
//================================================
// new cache format - use serialize extensively...
if ($meta[0] === '====1') {
// slurp in the data
$MAXSIZE = 128000;
$text = fread($fp,$MAXSIZE);
if (strlen($text)) {
while ($txt = fread($fp,$MAXSIZE)) {
$text .= $txt;
}
}
fclose($fp);
$rs = unserialize($text);
if (is_object($rs)) $rs->timeCreated = $ttl;
else {
$err = "Unable to unserialize recordset";
//echo htmlspecialchars($text),' !--END--!<p>';
}
return $rs;
}
$meta = false;
$meta = fgetcsv($fp, 32000, ",");
if (!$meta) {
fclose($fp);
$err = "Unexpected EOF 1";
return $false;
}
}
 
// Get Column definitions
$flds = array();
foreach($meta as $o) {
$o2 = explode(':',$o);
if (sizeof($o2)!=3) {
$arr[] = $meta;
$flds = false;
break;
}
$fld = new ADOFieldObject();
$fld->name = urldecode($o2[0]);
$fld->type = $o2[1];
$fld->max_length = $o2[2];
$flds[] = $fld;
}
} else {
fclose($fp);
$err = "Recordset had unexpected EOF 2";
return $false;
}
// slurp in the data
$MAXSIZE = 128000;
$text = '';
while ($txt = fread($fp,$MAXSIZE)) {
$text .= $txt;
}
fclose($fp);
@$arr = unserialize($text);
//var_dump($arr);
if (!is_array($arr)) {
$err = "Recordset had unexpected EOF (in serialized recordset)";
if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!";
return $false;
}
$rs = new $rsclass();
$rs->timeCreated = $ttl;
$rs->InitArrayFields($arr,$flds);
return $rs;
}
 
/**
* Save a file $filename and its $contents (normally for caching) with file locking
*/
function adodb_write_file($filename, $contents,$debug=false)
{
# http://www.php.net/bugs.php?id=9203 Bug that flock fails on Windows
# So to simulate locking, we assume that rename is an atomic operation.
# First we delete $filename, then we create a $tempfile write to it and
# rename to the desired $filename. If the rename works, then we successfully
# modified the file exclusively.
# What a stupid need - having to simulate locking.
# Risks:
# 1. $tempfile name is not unique -- very very low
# 2. unlink($filename) fails -- ok, rename will fail
# 3. adodb reads stale file because unlink fails -- ok, $rs timeout occurs
# 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated
if (strncmp(PHP_OS,'WIN',3) === 0) {
// skip the decimal place
$mtime = substr(str_replace(' ','_',microtime()),2);
// getmypid() actually returns 0 on Win98 - never mind!
$tmpname = $filename.uniqid($mtime).getmypid();
if (!($fd = @fopen($tmpname,'a'))) return false;
$ok = ftruncate($fd,0);
if (!fwrite($fd,$contents)) $ok = false;
fclose($fd);
chmod($tmpname,0644);
// the tricky moment
@unlink($filename);
if (!@rename($tmpname,$filename)) {
unlink($tmpname);
$ok = false;
}
if (!$ok) {
if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed'));
}
return $ok;
}
if (!($fd = @fopen($filename, 'a'))) return false;
if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) {
$ok = fwrite( $fd, $contents );
fclose($fd);
chmod($filename,0644);
}else {
fclose($fd);
if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename<br>\n");
$ok = false;
}
return $ok;
}
?>
/web/kaklik's_web/torrentflux/adodb/adodb-datadict.inc.php
0,0 → 1,784
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
DOCUMENTATION:
See adodb/tests/test-datadict.php for docs and examples.
*/
 
/*
Test script for parser
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
function Lens_ParseTest()
{
$str = "`zcol ACOL` NUMBER(32,2) DEFAULT 'The \"cow\" (and Jim''s dog) jumps over the moon' PRIMARY, INTI INT AUTO DEFAULT 0, zcol2\"afs ds";
print "<p>$str</p>";
$a= Lens_ParseArgs($str);
print "<pre>";
print_r($a);
print "</pre>";
}
 
 
if (!function_exists('ctype_alnum')) {
function ctype_alnum($text) {
return preg_match('/^[a-z0-9]*$/i', $text);
}
}
 
//Lens_ParseTest();
 
/**
Parse arguments, treat "text" (text) and 'text' as quotation marks.
To escape, use "" or '' or ))
Will read in "abc def" sans quotes, as: abc def
Same with 'abc def'.
However if `abc def`, then will read in as `abc def`
@param endstmtchar Character that indicates end of statement
@param tokenchars Include the following characters in tokens apart from A-Z and 0-9
@returns 2 dimensional array containing parsed tokens.
*/
function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
{
$pos = 0;
$intoken = false;
$stmtno = 0;
$endquote = false;
$tokens = array();
$tokens[$stmtno] = array();
$max = strlen($args);
$quoted = false;
$tokarr = array();
while ($pos < $max) {
$ch = substr($args,$pos,1);
switch($ch) {
case ' ':
case "\t":
case "\n":
case "\r":
if (!$quoted) {
if ($intoken) {
$intoken = false;
$tokens[$stmtno][] = implode('',$tokarr);
}
break;
}
$tokarr[] = $ch;
break;
case '`':
if ($intoken) $tokarr[] = $ch;
case '(':
case ')':
case '"':
case "'":
if ($intoken) {
if (empty($endquote)) {
$tokens[$stmtno][] = implode('',$tokarr);
if ($ch == '(') $endquote = ')';
else $endquote = $ch;
$quoted = true;
$intoken = true;
$tokarr = array();
} else if ($endquote == $ch) {
$ch2 = substr($args,$pos+1,1);
if ($ch2 == $endquote) {
$pos += 1;
$tokarr[] = $ch2;
} else {
$quoted = false;
$intoken = false;
$tokens[$stmtno][] = implode('',$tokarr);
$endquote = '';
}
} else
$tokarr[] = $ch;
}else {
if ($ch == '(') $endquote = ')';
else $endquote = $ch;
$quoted = true;
$intoken = true;
$tokarr = array();
if ($ch == '`') $tokarr[] = '`';
}
break;
default:
if (!$intoken) {
if ($ch == $endstmtchar) {
$stmtno += 1;
$tokens[$stmtno] = array();
break;
}
$intoken = true;
$quoted = false;
$endquote = false;
$tokarr = array();
}
if ($quoted) $tokarr[] = $ch;
else if (ctype_alnum($ch) || strpos($tokenchars,$ch) !== false) $tokarr[] = $ch;
else {
if ($ch == $endstmtchar) {
$tokens[$stmtno][] = implode('',$tokarr);
$stmtno += 1;
$tokens[$stmtno] = array();
$intoken = false;
$tokarr = array();
break;
}
$tokens[$stmtno][] = implode('',$tokarr);
$tokens[$stmtno][] = $ch;
$intoken = false;
}
}
$pos += 1;
}
if ($intoken) $tokens[$stmtno][] = implode('',$tokarr);
return $tokens;
}
 
 
class ADODB_DataDict {
var $connection;
var $debug = false;
var $dropTable = 'DROP TABLE %s';
var $renameTable = 'RENAME TABLE %s TO %s';
var $dropIndex = 'DROP INDEX %s';
var $addCol = ' ADD';
var $alterCol = ' ALTER COLUMN';
var $dropCol = ' DROP COLUMN';
var $renameColumn = 'ALTER TABLE %s RENAME COLUMN %s TO %s'; // table, old-column, new-column, column-definitions (not used by default)
var $nameRegex = '\w';
var $nameRegexBrackets = 'a-zA-Z0-9_\(\)';
var $schema = false;
var $serverInfo = array();
var $autoIncrement = false;
var $dataProvider;
var $invalidResizeTypes4 = array('CLOB','BLOB','TEXT','DATE','TIME'); // for changetablesql
var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob
/// in other words, we use a text area for editting.
function GetCommentSQL($table,$col)
{
return false;
}
function SetCommentSQL($table,$col,$cmt)
{
return false;
}
function MetaTables()
{
if (!$this->connection->IsConnected()) return array();
return $this->connection->MetaTables();
}
function MetaColumns($tab, $upper=true, $schema=false)
{
if (!$this->connection->IsConnected()) return array();
return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema);
}
function MetaPrimaryKeys($tab,$owner=false,$intkey=false)
{
if (!$this->connection->IsConnected()) return array();
return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey);
}
function MetaIndexes($table, $primary = false, $owner = false)
{
if (!$this->connection->IsConnected()) return array();
return $this->connection->MetaIndexes($this->TableName($table), $primary, $owner);
}
function MetaType($t,$len=-1,$fieldobj=false)
{
return ADORecordSet::MetaType($t,$len,$fieldobj);
}
function NameQuote($name = NULL,$allowBrackets=false)
{
if (!is_string($name)) {
return FALSE;
}
$name = trim($name);
if ( !is_object($this->connection) ) {
return $name;
}
$quote = $this->connection->nameQuote;
// if name is of the form `name`, quote it
if ( preg_match('/^`(.+)`$/', $name, $matches) ) {
return $quote . $matches[1] . $quote;
}
// if name contains special characters, quote it
$regex = ($allowBrackets) ? $this->nameRegexBrackets : $this->nameRegex;
if ( !preg_match('/^[' . $regex . ']+$/', $name) ) {
return $quote . $name . $quote;
}
return $name;
}
function TableName($name)
{
if ( $this->schema ) {
return $this->NameQuote($this->schema) .'.'. $this->NameQuote($name);
}
return $this->NameQuote($name);
}
// Executes the sql array returned by GetTableSQL and GetIndexSQL
function ExecuteSQLArray($sql, $continueOnError = true)
{
$rez = 2;
$conn = &$this->connection;
$saved = $conn->debug;
foreach($sql as $line) {
if ($this->debug) $conn->debug = true;
$ok = $conn->Execute($line);
$conn->debug = $saved;
if (!$ok) {
if ($this->debug) ADOConnection::outp($conn->ErrorMsg());
if (!$continueOnError) return 0;
$rez = 1;
}
}
return $rez;
}
/*
Returns the actual type given a character code.
C: varchar
X: CLOB (character large object) or largest varchar size if CLOB is not supported
C2: Multibyte varchar
X2: Multibyte CLOB
B: BLOB (binary large object)
D: Date
T: Date-time
L: Integer field suitable for storing booleans (0 or 1)
I: Integer
F: Floating point number
N: Numeric or decimal number
*/
function ActualType($meta)
{
return $meta;
}
function CreateDatabase($dbname,$options=false)
{
$options = $this->_Options($options);
$sql = array();
$s = 'CREATE DATABASE ' . $this->NameQuote($dbname);
if (isset($options[$this->upperName]))
$s .= ' '.$options[$this->upperName];
$sql[] = $s;
return $sql;
}
/*
Generates the SQL to create index. Returns an array of sql strings.
*/
function CreateIndexSQL($idxname, $tabname, $flds, $idxoptions = false)
{
if (!is_array($flds)) {
$flds = explode(',',$flds);
}
foreach($flds as $key => $fld) {
# some indexes can use partial fields, eg. index first 32 chars of "name" with NAME(32)
$flds[$key] = $this->NameQuote($fld,$allowBrackets=true);
}
return $this->_IndexSQL($this->NameQuote($idxname), $this->TableName($tabname), $flds, $this->_Options($idxoptions));
}
function DropIndexSQL ($idxname, $tabname = NULL)
{
return array(sprintf($this->dropIndex, $this->NameQuote($idxname), $this->TableName($tabname)));
}
function SetSchema($schema)
{
$this->schema = $schema;
}
function AddColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
$sql = array();
list($lines,$pkey) = $this->_GenFields($flds);
$alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' ';
foreach($lines as $v) {
$sql[] = $alter . $v;
}
return $sql;
}
/**
* Change the definition of one column
*
* As some DBM's can't do that on there own, you need to supply the complete defintion of the new table,
* to allow, recreating the table and copying the content over to the new table
* @param string $tabname table-name
* @param string $flds column-name and type for the changed column
* @param string $tableflds='' complete defintion of the new table, eg. for postgres, default ''
* @param array/string $tableoptions='' options for the new table see CreateTableSQL, default ''
* @return array with SQL strings
*/
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
{
$tabname = $this->TableName ($tabname);
$sql = array();
list($lines,$pkey) = $this->_GenFields($flds);
$alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' ';
foreach($lines as $v) {
$sql[] = $alter . $v;
}
return $sql;
}
/**
* Rename one column
*
* Some DBM's can only do this together with changeing the type of the column (even if that stays the same, eg. mysql)
* @param string $tabname table-name
* @param string $oldcolumn column-name to be renamed
* @param string $newcolumn new column-name
* @param string $flds='' complete column-defintion-string like for AddColumnSQL, only used by mysql atm., default=''
* @return array with SQL strings
*/
function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='')
{
$tabname = $this->TableName ($tabname);
if ($flds) {
list($lines,$pkey) = $this->_GenFields($flds);
list(,$first) = each($lines);
list(,$column_def) = split("[\t ]+",$first,2);
}
return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def));
}
/**
* Drop one column
*
* Some DBM's can't do that on there own, you need to supply the complete defintion of the new table,
* to allow, recreating the table and copying the content over to the new table
* @param string $tabname table-name
* @param string $flds column-name and type for the changed column
* @param string $tableflds='' complete defintion of the new table, eg. for postgres, default ''
* @param array/string $tableoptions='' options for the new table see CreateTableSQL, default ''
* @return array with SQL strings
*/
function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
{
$tabname = $this->TableName ($tabname);
if (!is_array($flds)) $flds = explode(',',$flds);
$sql = array();
$alter = 'ALTER TABLE ' . $tabname . $this->dropCol . ' ';
foreach($flds as $v) {
$sql[] = $alter . $this->NameQuote($v);
}
return $sql;
}
function DropTableSQL($tabname)
{
return array (sprintf($this->dropTable, $this->TableName($tabname)));
}
function RenameTableSQL($tabname,$newname)
{
return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname)));
}
/*
Generate the SQL to create table. Returns an array of sql strings.
*/
function CreateTableSQL($tabname, $flds, $tableoptions=false)
{
if (!$tableoptions) $tableoptions = array();
list($lines,$pkey) = $this->_GenFields($flds, true);
$taboptions = $this->_Options($tableoptions);
$tabname = $this->TableName ($tabname);
$sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions);
$tsql = $this->_Triggers($tabname,$taboptions);
foreach($tsql as $s) $sql[] = $s;
return $sql;
}
function _GenFields($flds,$widespacing=false)
{
if (is_string($flds)) {
$padding = ' ';
$txt = $flds.$padding;
$flds = array();
$flds0 = Lens_ParseArgs($txt,',');
$hasparam = false;
foreach($flds0 as $f0) {
$f1 = array();
foreach($f0 as $token) {
switch (strtoupper($token)) {
case 'CONSTRAINT':
case 'DEFAULT':
$hasparam = $token;
break;
default:
if ($hasparam) $f1[$hasparam] = $token;
else $f1[] = $token;
$hasparam = false;
break;
}
}
$flds[] = $f1;
}
}
$this->autoIncrement = false;
$lines = array();
$pkey = array();
foreach($flds as $fld) {
$fld = _array_change_key_case($fld);
$fname = false;
$fdefault = false;
$fautoinc = false;
$ftype = false;
$fsize = false;
$fprec = false;
$fprimary = false;
$fnoquote = false;
$fdefts = false;
$fdefdate = false;
$fconstraint = false;
$fnotnull = false;
$funsigned = false;
//-----------------
// Parse attributes
foreach($fld as $attr => $v) {
if ($attr == 2 && is_numeric($v)) $attr = 'SIZE';
else if (is_numeric($attr) && $attr > 1 && !is_numeric($v)) $attr = strtoupper($v);
switch($attr) {
case '0':
case 'NAME': $fname = $v; break;
case '1':
case 'TYPE': $ty = $v; $ftype = $this->ActualType(strtoupper($v)); break;
case 'SIZE':
$dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,',');
if ($dotat === false) $fsize = $v;
else {
$fsize = substr($v,0,$dotat);
$fprec = substr($v,$dotat+1);
}
break;
case 'UNSIGNED': $funsigned = true; break;
case 'AUTOINCREMENT':
case 'AUTO': $fautoinc = true; $fnotnull = true; break;
case 'KEY':
case 'PRIMARY': $fprimary = $v; $fnotnull = true; break;
case 'DEF':
case 'DEFAULT': $fdefault = $v; break;
case 'NOTNULL': $fnotnull = $v; break;
case 'NOQUOTE': $fnoquote = $v; break;
case 'DEFDATE': $fdefdate = $v; break;
case 'DEFTIMESTAMP': $fdefts = $v; break;
case 'CONSTRAINT': $fconstraint = $v; break;
} //switch
} // foreach $fld
//--------------------
// VALIDATE FIELD INFO
if (!strlen($fname)) {
if ($this->debug) ADOConnection::outp("Undefined NAME");
return false;
}
$fid = strtoupper(preg_replace('/^`(.+)`$/', '$1', $fname));
$fname = $this->NameQuote($fname);
if (!strlen($ftype)) {
if ($this->debug) ADOConnection::outp("Undefined TYPE for field '$fname'");
return false;
} else {
$ftype = strtoupper($ftype);
}
$ftype = $this->_GetSize($ftype, $ty, $fsize, $fprec);
if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls
if ($fprimary) $pkey[] = $fname;
// some databases do not allow blobs to have defaults
if ($ty == 'X') $fdefault = false;
//--------------------
// CONSTRUCT FIELD SQL
if ($fdefts) {
if (substr($this->connection->databaseType,0,5) == 'mysql') {
$ftype = 'TIMESTAMP';
} else {
$fdefault = $this->connection->sysTimeStamp;
}
} else if ($fdefdate) {
if (substr($this->connection->databaseType,0,5) == 'mysql') {
$ftype = 'TIMESTAMP';
} else {
$fdefault = $this->connection->sysDate;
}
} else if ($fdefault !== false && !$fnoquote)
if ($ty == 'C' or $ty == 'X' or
( substr($fdefault,0,1) != "'" && !is_numeric($fdefault)))
if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ')
$fdefault = trim($fdefault);
else if (strtolower($fdefault) != 'null')
$fdefault = $this->connection->qstr($fdefault);
$suffix = $this->_CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned);
if ($widespacing) $fname = str_pad($fname,24);
$lines[$fid] = $fname.' '.$ftype.$suffix;
if ($fautoinc) $this->autoIncrement = true;
} // foreach $flds
return array($lines,$pkey);
}
/*
GENERATE THE SIZE PART OF THE DATATYPE
$ftype is the actual type
$ty is the type defined originally in the DDL
*/
function _GetSize($ftype, $ty, $fsize, $fprec)
{
if (strlen($fsize) && $ty != 'X' && $ty != 'B' && strpos($ftype,'(') === false) {
$ftype .= "(".$fsize;
if (strlen($fprec)) $ftype .= ",".$fprec;
$ftype .= ')';
}
return $ftype;
}
// return string must begin with space
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
{
$suffix = '';
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fnotnull) $suffix .= ' NOT NULL';
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
{
$sql = array();
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
$sql[] = sprintf ($this->dropIndex, $idxname);
if ( isset($idxoptions['DROP']) )
return $sql;
}
if ( empty ($flds) ) {
return $sql;
}
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' ';
if ( isset($idxoptions[$this->upperName]) )
$s .= $idxoptions[$this->upperName];
if ( is_array($flds) )
$flds = implode(', ',$flds);
$s .= '(' . $flds . ')';
$sql[] = $s;
return $sql;
}
function _DropAutoIncrement($tabname)
{
return false;
}
function _TableSQL($tabname,$lines,$pkey,$tableoptions)
{
$sql = array();
if (isset($tableoptions['REPLACE']) || isset ($tableoptions['DROP'])) {
$sql[] = sprintf($this->dropTable,$tabname);
if ($this->autoIncrement) {
$sInc = $this->_DropAutoIncrement($tabname);
if ($sInc) $sql[] = $sInc;
}
if ( isset ($tableoptions['DROP']) ) {
return $sql;
}
}
$s = "CREATE TABLE $tabname (\n";
$s .= implode(",\n", $lines);
if (sizeof($pkey)>0) {
$s .= ",\n PRIMARY KEY (";
$s .= implode(", ",$pkey).")";
}
if (isset($tableoptions['CONSTRAINTS']))
$s .= "\n".$tableoptions['CONSTRAINTS'];
if (isset($tableoptions[$this->upperName.'_CONSTRAINTS']))
$s .= "\n".$tableoptions[$this->upperName.'_CONSTRAINTS'];
$s .= "\n)";
if (isset($tableoptions[$this->upperName])) $s .= $tableoptions[$this->upperName];
$sql[] = $s;
return $sql;
}
/*
GENERATE TRIGGERS IF NEEDED
used when table has auto-incrementing field that is emulated using triggers
*/
function _Triggers($tabname,$taboptions)
{
return array();
}
/*
Sanitize options, so that array elements with no keys are promoted to keys
*/
function _Options($opts)
{
if (!is_array($opts)) return array();
$newopts = array();
foreach($opts as $k => $v) {
if (is_numeric($k)) $newopts[strtoupper($v)] = $v;
else $newopts[strtoupper($k)] = $v;
}
return $newopts;
}
/*
"Florian Buzin [ easywe ]" <florian.buzin#easywe.de>
This function changes/adds new fields to your table. You don't
have to know if the col is new or not. It will check on its own.
*/
function ChangeTableSQL($tablename, $flds, $tableoptions = false)
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
if ($this->connection->fetchMode !== false) $savem = $this->connection->SetFetchMode(false);
// check table exists
$save_handler = $this->connection->raiseErrorFn;
$this->connection->raiseErrorFn = '';
$cols = $this->MetaColumns($tablename);
$this->connection->raiseErrorFn = $save_handler;
if (isset($savem)) $this->connection->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ( empty($cols)) {
return $this->CreateTableSQL($tablename, $flds, $tableoptions);
}
if (is_array($flds)) {
// Cycle through the update fields, comparing
// existing fields to fields to update.
// if the Metatype and size is exactly the
// same, ignore - by Mark Newham
$holdflds = array();
foreach($flds as $k=>$v) {
if ( isset($cols[$k]) && is_object($cols[$k]) ) {
// If already not allowing nulls, then don't change
$obj = $cols[$k];
if (isset($obj->not_null) && $obj->not_null)
$v = str_replace('NOT NULL','',$v);
 
$c = $cols[$k];
$ml = $c->max_length;
$mt = $this->MetaType($c->type,$ml);
if ($ml == -1) $ml = '';
if ($mt == 'X') $ml = $v['SIZE'];
if (($mt != $v['TYPE']) || $ml != $v['SIZE']) {
$holdflds[$k] = $v;
}
} else {
$holdflds[$k] = $v;
}
}
$flds = $holdflds;
}
 
// already exists, alter table instead
list($lines,$pkey) = $this->_GenFields($flds);
$alter = 'ALTER TABLE ' . $this->TableName($tablename);
$sql = array();
 
foreach ( $lines as $id => $v ) {
if ( isset($cols[$id]) && is_object($cols[$id]) ) {
$flds = Lens_ParseArgs($v,',');
// We are trying to change the size of the field, if not allowed, simply ignore the request.
if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) continue;
$sql[] = $alter . $this->alterCol . ' ' . $v;
} else {
$sql[] = $alter . $this->addCol . ' ' . $v;
}
}
return $sql;
}
} // class
?>
/web/kaklik's_web/torrentflux/adodb/adodb-error.inc.php
0,0 → 1,258
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* The following code is adapted from the PEAR DB error handling code.
* Portions (c)1997-2002 The PHP Group.
*/
 
 
if (!defined("DB_ERROR")) define("DB_ERROR",-1);
 
if (!defined("DB_ERROR_SYNTAX")) {
define("DB_ERROR_SYNTAX", -2);
define("DB_ERROR_CONSTRAINT", -3);
define("DB_ERROR_NOT_FOUND", -4);
define("DB_ERROR_ALREADY_EXISTS", -5);
define("DB_ERROR_UNSUPPORTED", -6);
define("DB_ERROR_MISMATCH", -7);
define("DB_ERROR_INVALID", -8);
define("DB_ERROR_NOT_CAPABLE", -9);
define("DB_ERROR_TRUNCATED", -10);
define("DB_ERROR_INVALID_NUMBER", -11);
define("DB_ERROR_INVALID_DATE", -12);
define("DB_ERROR_DIVZERO", -13);
define("DB_ERROR_NODBSELECTED", -14);
define("DB_ERROR_CANNOT_CREATE", -15);
define("DB_ERROR_CANNOT_DELETE", -16);
define("DB_ERROR_CANNOT_DROP", -17);
define("DB_ERROR_NOSUCHTABLE", -18);
define("DB_ERROR_NOSUCHFIELD", -19);
define("DB_ERROR_NEED_MORE_DATA", -20);
define("DB_ERROR_NOT_LOCKED", -21);
define("DB_ERROR_VALUE_COUNT_ON_ROW", -22);
define("DB_ERROR_INVALID_DSN", -23);
define("DB_ERROR_CONNECT_FAILED", -24);
define("DB_ERROR_EXTENSION_NOT_FOUND",-25);
define("DB_ERROR_NOSUCHDB", -25);
define("DB_ERROR_ACCESS_VIOLATION", -26);
}
 
function adodb_errormsg($value)
{
global $ADODB_LANG,$ADODB_LANG_ARRAY;
 
if (empty($ADODB_LANG)) $ADODB_LANG = 'en';
if (isset($ADODB_LANG_ARRAY['LANG']) && $ADODB_LANG_ARRAY['LANG'] == $ADODB_LANG) ;
else {
include_once(ADODB_DIR."/lang/adodb-$ADODB_LANG.inc.php");
}
return isset($ADODB_LANG_ARRAY[$value]) ? $ADODB_LANG_ARRAY[$value] : $ADODB_LANG_ARRAY[DB_ERROR];
}
 
function adodb_error($provider,$dbType,$errno)
{
//var_dump($errno);
if (is_numeric($errno) && $errno == 0) return 0;
switch($provider) {
case 'mysql': $map = adodb_error_mysql(); break;
case 'oracle':
case 'oci8': $map = adodb_error_oci8(); break;
case 'ibase': $map = adodb_error_ibase(); break;
case 'odbc': $map = adodb_error_odbc(); break;
case 'mssql':
case 'sybase': $map = adodb_error_mssql(); break;
case 'informix': $map = adodb_error_ifx(); break;
case 'postgres': return adodb_error_pg($errno); break;
case 'sqlite': return $map = adodb_error_sqlite(); break;
default:
return DB_ERROR;
}
//print_r($map);
//var_dump($errno);
if (isset($map[$errno])) return $map[$errno];
return DB_ERROR;
}
 
//**************************************************************************************
 
function adodb_error_pg($errormsg)
{
if (is_numeric($errormsg)) return (integer) $errormsg;
static $error_regexps = array(
'/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => DB_ERROR_NOSUCHTABLE,
'/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/' => DB_ERROR_ALREADY_EXISTS,
'/divide by zero$/' => DB_ERROR_DIVZERO,
'/pg_atoi: error in .*: can\'t parse /' => DB_ERROR_INVALID_NUMBER,
'/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => DB_ERROR_NOSUCHFIELD,
'/parser: parse error at or near \"/' => DB_ERROR_SYNTAX,
'/referential integrity violation/' => DB_ERROR_CONSTRAINT,
'/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/'
=> DB_ERROR_ALREADY_EXISTS
);
reset($error_regexps);
while (list($regexp,$code) = each($error_regexps)) {
if (preg_match($regexp, $errormsg)) {
return $code;
}
}
// Fall back to DB_ERROR if there was no mapping.
return DB_ERROR;
}
function adodb_error_odbc()
{
static $MAP = array(
'01004' => DB_ERROR_TRUNCATED,
'07001' => DB_ERROR_MISMATCH,
'21S01' => DB_ERROR_MISMATCH,
'21S02' => DB_ERROR_MISMATCH,
'22003' => DB_ERROR_INVALID_NUMBER,
'22008' => DB_ERROR_INVALID_DATE,
'22012' => DB_ERROR_DIVZERO,
'23000' => DB_ERROR_CONSTRAINT,
'24000' => DB_ERROR_INVALID,
'34000' => DB_ERROR_INVALID,
'37000' => DB_ERROR_SYNTAX,
'42000' => DB_ERROR_SYNTAX,
'IM001' => DB_ERROR_UNSUPPORTED,
'S0000' => DB_ERROR_NOSUCHTABLE,
'S0001' => DB_ERROR_NOT_FOUND,
'S0002' => DB_ERROR_NOSUCHTABLE,
'S0011' => DB_ERROR_ALREADY_EXISTS,
'S0012' => DB_ERROR_NOT_FOUND,
'S0021' => DB_ERROR_ALREADY_EXISTS,
'S0022' => DB_ERROR_NOT_FOUND,
'S1000' => DB_ERROR_NOSUCHTABLE,
'S1009' => DB_ERROR_INVALID,
'S1090' => DB_ERROR_INVALID,
'S1C00' => DB_ERROR_NOT_CAPABLE
);
return $MAP;
}
 
function adodb_error_ibase()
{
static $MAP = array(
-104 => DB_ERROR_SYNTAX,
-150 => DB_ERROR_ACCESS_VIOLATION,
-151 => DB_ERROR_ACCESS_VIOLATION,
-155 => DB_ERROR_NOSUCHTABLE,
-157 => DB_ERROR_NOSUCHFIELD,
-158 => DB_ERROR_VALUE_COUNT_ON_ROW,
-170 => DB_ERROR_MISMATCH,
-171 => DB_ERROR_MISMATCH,
-172 => DB_ERROR_INVALID,
-204 => DB_ERROR_INVALID,
-205 => DB_ERROR_NOSUCHFIELD,
-206 => DB_ERROR_NOSUCHFIELD,
-208 => DB_ERROR_INVALID,
-219 => DB_ERROR_NOSUCHTABLE,
-297 => DB_ERROR_CONSTRAINT,
-530 => DB_ERROR_CONSTRAINT,
-803 => DB_ERROR_CONSTRAINT,
-551 => DB_ERROR_ACCESS_VIOLATION,
-552 => DB_ERROR_ACCESS_VIOLATION,
-922 => DB_ERROR_NOSUCHDB,
-923 => DB_ERROR_CONNECT_FAILED,
-924 => DB_ERROR_CONNECT_FAILED
);
return $MAP;
}
 
function adodb_error_ifx()
{
static $MAP = array(
'-201' => DB_ERROR_SYNTAX,
'-206' => DB_ERROR_NOSUCHTABLE,
'-217' => DB_ERROR_NOSUCHFIELD,
'-329' => DB_ERROR_NODBSELECTED,
'-1204' => DB_ERROR_INVALID_DATE,
'-1205' => DB_ERROR_INVALID_DATE,
'-1206' => DB_ERROR_INVALID_DATE,
'-1209' => DB_ERROR_INVALID_DATE,
'-1210' => DB_ERROR_INVALID_DATE,
'-1212' => DB_ERROR_INVALID_DATE
);
return $MAP;
}
 
function adodb_error_oci8()
{
static $MAP = array(
1 => DB_ERROR_ALREADY_EXISTS,
900 => DB_ERROR_SYNTAX,
904 => DB_ERROR_NOSUCHFIELD,
923 => DB_ERROR_SYNTAX,
942 => DB_ERROR_NOSUCHTABLE,
955 => DB_ERROR_ALREADY_EXISTS,
1476 => DB_ERROR_DIVZERO,
1722 => DB_ERROR_INVALID_NUMBER,
2289 => DB_ERROR_NOSUCHTABLE,
2291 => DB_ERROR_CONSTRAINT,
2449 => DB_ERROR_CONSTRAINT
);
return $MAP;
}
 
function adodb_error_mssql()
{
static $MAP = array(
208 => DB_ERROR_NOSUCHTABLE,
2601 => DB_ERROR_ALREADY_EXISTS
);
return $MAP;
}
 
function adodb_error_sqlite()
{
static $MAP = array(
1 => DB_ERROR_SYNTAX
);
return $MAP;
}
 
function adodb_error_mysql()
{
static $MAP = array(
1004 => DB_ERROR_CANNOT_CREATE,
1005 => DB_ERROR_CANNOT_CREATE,
1006 => DB_ERROR_CANNOT_CREATE,
1007 => DB_ERROR_ALREADY_EXISTS,
1008 => DB_ERROR_CANNOT_DROP,
1045 => DB_ERROR_ACCESS_VIOLATION,
1046 => DB_ERROR_NODBSELECTED,
1049 => DB_ERROR_NOSUCHDB,
1050 => DB_ERROR_ALREADY_EXISTS,
1051 => DB_ERROR_NOSUCHTABLE,
1054 => DB_ERROR_NOSUCHFIELD,
1062 => DB_ERROR_ALREADY_EXISTS,
1064 => DB_ERROR_SYNTAX,
1100 => DB_ERROR_NOT_LOCKED,
1136 => DB_ERROR_VALUE_COUNT_ON_ROW,
1146 => DB_ERROR_NOSUCHTABLE,
1048 => DB_ERROR_CONSTRAINT,
2002 => DB_ERROR_CONNECT_FAILED,
2005 => DB_ERROR_CONNECT_FAILED
);
return $MAP;
}
?>
/web/kaklik's_web/torrentflux/adodb/adodb-errorhandler.inc.php
0,0 → 1,79
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://php.weblogs.com
*
*/
 
 
// added Claudio Bustos clbustos#entelchile.net
if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR);
 
if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_Handler');
 
/**
* Default Error Handler. This will be called with the following params
*
* @param $dbms the RDBMS you are connecting to
* @param $fn the name of the calling function (in uppercase)
* @param $errno the native error number from the database
* @param $errmsg the native error msg from the database
* @param $p1 $fn specific parameter - see below
* @param $p2 $fn specific parameter - see below
* @param $thisConn $current connection object - can be false if no connection object created
*/
function ADODB_Error_Handler($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection)
{
if (error_reporting() == 0) return; // obey @ protocol
switch($fn) {
case 'EXECUTE':
$sql = $p1;
$inputparams = $p2;
 
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$sql\")\n";
break;
 
case 'PCONNECT':
case 'CONNECT':
$host = $p1;
$database = $p2;
 
$s = "$dbms error: [$errno: $errmsg] in $fn($host, '****', '****', $database)\n";
break;
default:
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n";
break;
}
/*
* Log connection error somewhere
* 0 message is sent to PHP's system logger, using the Operating System's system
* logging mechanism or a file, depending on what the error_log configuration
* directive is set to.
* 1 message is sent by email to the address in the destination parameter.
* This is the only message type where the fourth parameter, extra_headers is used.
* This message type uses the same internal function as mail() does.
* 2 message is sent through the PHP debugging connection.
* This option is only available if remote debugging has been enabled.
* In this case, the destination parameter specifies the host name or IP address
* and optionally, port number, of the socket receiving the debug information.
* 3 message is appended to the file destination
*/
if (defined('ADODB_ERROR_LOG_TYPE')) {
$t = date('Y-m-d H:i:s');
if (defined('ADODB_ERROR_LOG_DEST'))
error_log("($t) $s", ADODB_ERROR_LOG_TYPE, ADODB_ERROR_LOG_DEST);
else
error_log("($t) $s", ADODB_ERROR_LOG_TYPE);
}
 
 
//print "<p>$s</p>";
trigger_error($s,ADODB_ERROR_HANDLER_TYPE);
}
?>
/web/kaklik's_web/torrentflux/adodb/adodb-errorpear.inc.php
0,0 → 1,88
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://php.weblogs.com
*
*/
include_once('PEAR.php');
 
if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_PEAR');
 
/*
* Enabled the following if you want to terminate scripts when an error occurs
*/
//PEAR::setErrorHandling (PEAR_ERROR_DIE);
 
/*
* Name of the PEAR_Error derived class to call.
*/
if (!defined('ADODB_PEAR_ERROR_CLASS')) define('ADODB_PEAR_ERROR_CLASS','PEAR_Error');
 
/*
* Store the last PEAR_Error object here
*/
global $ADODB_Last_PEAR_Error; $ADODB_Last_PEAR_Error = false;
 
/**
* Error Handler with PEAR support. This will be called with the following params
*
* @param $dbms the RDBMS you are connecting to
* @param $fn the name of the calling function (in uppercase)
* @param $errno the native error number from the database
* @param $errmsg the native error msg from the database
* @param $p1 $fn specific parameter - see below
* @param $P2 $fn specific parameter - see below
*/
function ADODB_Error_PEAR($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false)
{
global $ADODB_Last_PEAR_Error;
if (error_reporting() == 0) return; // obey @ protocol
switch($fn) {
case 'EXECUTE':
$sql = $p1;
$inputparams = $p2;
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$sql\")";
break;
case 'PCONNECT':
case 'CONNECT':
$host = $p1;
$database = $p2;
$s = "$dbms error: [$errno: $errmsg] in $fn('$host', ?, ?, '$database')";
break;
default:
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)";
break;
}
$class = ADODB_PEAR_ERROR_CLASS;
$ADODB_Last_PEAR_Error = new $class($s, $errno,
$GLOBALS['_PEAR_default_error_mode'],
$GLOBALS['_PEAR_default_error_options'],
$errmsg);
//print "<p>!$s</p>";
}
 
/**
* Returns last PEAR_Error object. This error might be for an error that
* occured several sql statements ago.
*/
function &ADODB_PEAR_Error()
{
global $ADODB_Last_PEAR_Error;
 
return $ADODB_Last_PEAR_Error;
}
?>
/web/kaklik's_web/torrentflux/adodb/adodb-exceptions.inc.php
0,0 → 1,82
<?php
 
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://php.weblogs.com
*
* Exception-handling code using PHP5 exceptions (try-catch-throw).
*/
 
 
if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR);
define('ADODB_ERROR_HANDLER','adodb_throw');
 
class ADODB_Exception extends Exception {
var $dbms;
var $fn;
var $sql = '';
var $params = '';
var $host = '';
var $database = '';
function __construct($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
{
switch($fn) {
case 'EXECUTE':
$this->sql = $p1;
$this->params = $p2;
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$p1\")\n";
break;
case 'PCONNECT':
case 'CONNECT':
$user = $thisConnection->user;
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, '$user', '****', $p2)\n";
break;
default:
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n";
break;
}
$this->dbms = $dbms;
if ($thisConnection) {
$this->host = $thisConnection->host;
$this->database = $thisConnection->database;
}
$this->fn = $fn;
$this->msg = $errmsg;
if (!is_numeric($errno)) $errno = -1;
parent::__construct($s,$errno);
}
}
 
/**
* Default Error Handler. This will be called with the following params
*
* @param $dbms the RDBMS you are connecting to
* @param $fn the name of the calling function (in uppercase)
* @param $errno the native error number from the database
* @param $errmsg the native error msg from the database
* @param $p1 $fn specific parameter - see below
* @param $P2 $fn specific parameter - see below
*/
 
function adodb_throw($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
{
global $ADODB_EXCEPTION;
if (error_reporting() == 0) return; // obey @ protocol
if (is_string($ADODB_EXCEPTION)) $errfn = $ADODB_EXCEPTION;
else $errfn = 'ADODB_EXCEPTION';
throw new $errfn($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection);
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-iterator.inc.php
0,0 → 1,85
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4.
Declares the ADODB Base Class for PHP5 "ADODB_BASE_RS", and supports iteration with
the ADODB_Iterator class.
$rs = $db->Execute("select * from adoxyz");
foreach($rs as $k => $v) {
echo $k; print_r($v); echo "<br>";
}
Iterator code based on http://cvs.php.net/cvs.php/php-src/ext/spl/examples/cachingiterator.inc?login=2
*/
 
class ADODB_Iterator implements Iterator {
 
private $rs;
 
function __construct($rs)
{
$this->rs = $rs;
}
function rewind()
{
$this->rs->MoveFirst();
}
 
function valid()
{
return !$this->rs->EOF;
}
function key()
{
return $this->rs->_currentRow;
}
function current()
{
return $this->rs->fields;
}
function next()
{
$this->rs->MoveNext();
}
function __call($func, $params)
{
return call_user_func_array(array($this->rs, $func), $params);
}
 
function hasMore()
{
return !$this->rs->EOF;
}
 
}
 
 
class ADODB_BASE_RS implements IteratorAggregate {
function getIterator() {
return new ADODB_Iterator($this);
}
/* this is experimental - i don't really know what to return... */
function __toString()
{
include_once(ADODB_DIR.'/toexport.inc.php');
return _adodb_export($this,',',',',false,true);
}
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-lib.inc.php
0,0 → 1,1021
<?php
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
global $ADODB_INCLUDED_LIB;
$ADODB_INCLUDED_LIB = 1;
 
/*
@version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim\@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Less commonly used functions are placed here to reduce size of adodb.inc.php.
*/
 
 
// Force key to upper.
// See also http://www.php.net/manual/en/function.array-change-key-case.php
function _array_change_key_case($an_array)
{
if (is_array($an_array)) {
$new_array = array();
foreach($an_array as $key=>$value)
$new_array[strtoupper($key)] = $value;
 
return $new_array;
}
 
return $an_array;
}
 
function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc)
{
if (count($fieldArray) == 0) return 0;
$first = true;
$uSet = '';
if (!is_array($keyCol)) {
$keyCol = array($keyCol);
}
foreach($fieldArray as $k => $v) {
if ($autoQuote && !is_numeric($v) and strncmp($v,"'",1) !== 0 and strcasecmp($v,'null')!=0) {
$v = $zthis->qstr($v);
$fieldArray[$k] = $v;
}
if (in_array($k,$keyCol)) continue; // skip UPDATE if is key
if ($first) {
$first = false;
$uSet = "$k=$v";
} else
$uSet .= ",$k=$v";
}
$where = false;
foreach ($keyCol as $v) {
if (isset($fieldArray[$v])) {
if ($where) $where .= ' and '.$v.'='.$fieldArray[$v];
else $where = $v.'='.$fieldArray[$v];
}
}
if ($uSet && $where) {
$update = "UPDATE $table SET $uSet WHERE $where";
 
$rs = $zthis->Execute($update);
if ($rs) {
if ($zthis->poorAffectedRows) {
/*
The Select count(*) wipes out any errors that the update would have returned.
http://phplens.com/lens/lensforum/msgs.php?id=5696
*/
if ($zthis->ErrorNo()<>0) return 0;
# affected_rows == 0 if update field values identical to old values
# for mysql - which is silly.
$cnt = $zthis->GetOne("select count(*) from $table where $where");
if ($cnt > 0) return 1; // record already exists
} else {
if (($zthis->Affected_Rows()>0)) return 1;
}
} else
return 0;
}
// print "<p>Error=".$this->ErrorNo().'<p>';
$first = true;
foreach($fieldArray as $k => $v) {
if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col
if ($first) {
$first = false;
$iCols = "$k";
$iVals = "$v";
} else {
$iCols .= ",$k";
$iVals .= ",$v";
}
}
$insert = "INSERT INTO $table ($iCols) VALUES ($iVals)";
$rs = $zthis->Execute($insert);
return ($rs) ? 2 : 0;
}
 
// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM
function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false,
$size=0, $selectAttr='',$compareFields0=true)
{
$hasvalue = false;
 
if ($multiple or is_array($defstr)) {
if ($size==0) $size=5;
$attr = ' multiple size="'.$size.'"';
if (!strpos($name,'[]')) $name .= '[]';
} else if ($size) $attr = ' size="'.$size.'"';
else $attr ='';
$s = '<select name="'.$name.'"'.$attr.' '.$selectAttr.'>';
if ($blank1stItem)
if (is_string($blank1stItem)) {
$barr = explode(':',$blank1stItem);
if (sizeof($barr) == 1) $barr[] = '';
$s .= "\n<option value=\"".$barr[0]."\">".$barr[1]."</option>";
} else $s .= "\n<option></option>";
 
if ($zthis->FieldCount() > 1) $hasvalue=true;
else $compareFields0 = true;
$value = '';
$optgroup = null;
$firstgroup = true;
$fieldsize = $zthis->FieldCount();
while(!$zthis->EOF) {
$zval = rtrim(reset($zthis->fields));
 
if ($blank1stItem && $zval=="") {
$zthis->MoveNext();
continue;
}
 
if ($fieldsize > 1) {
if (isset($zthis->fields[1]))
$zval2 = rtrim($zthis->fields[1]);
else
$zval2 = rtrim(next($zthis->fields));
}
$selected = ($compareFields0) ? $zval : $zval2;
$group = '';
if ($fieldsize > 2) {
$group = rtrim($zthis->fields[2]);
}
if ($optgroup != $group) {
$optgroup = $group;
if ($firstgroup) {
$firstgroup = false;
$s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
} else {
$s .="\n</optgroup>";
$s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
}
}
if ($hasvalue)
$value = " value='".htmlspecialchars($zval2)."'";
if (is_array($defstr)) {
if (in_array($selected,$defstr))
$s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>';
else
$s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';
}
else {
if (strcasecmp($selected,$defstr)==0)
$s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>';
else
$s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';
}
$zthis->MoveNext();
} // while
// closing last optgroup
if($optgroup != null) {
$s .= "\n</optgroup>";
}
return $s ."\n</select>\n";
}
 
// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM
function _adodb_getmenu_gp(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false,
$size=0, $selectAttr='',$compareFields0=true)
{
$hasvalue = false;
 
if ($multiple or is_array($defstr)) {
if ($size==0) $size=5;
$attr = ' multiple size="'.$size.'"';
if (!strpos($name,'[]')) $name .= '[]';
} else if ($size) $attr = ' size="'.$size.'"';
else $attr ='';
$s = '<select name="'.$name.'"'.$attr.' '.$selectAttr.'>';
if ($blank1stItem)
if (is_string($blank1stItem)) {
$barr = explode(':',$blank1stItem);
if (sizeof($barr) == 1) $barr[] = '';
$s .= "\n<option value=\"".$barr[0]."\">".$barr[1]."</option>";
} else $s .= "\n<option></option>";
 
if ($zthis->FieldCount() > 1) $hasvalue=true;
else $compareFields0 = true;
$value = '';
$optgroup = null;
$firstgroup = true;
$fieldsize = sizeof($zthis->fields);
while(!$zthis->EOF) {
$zval = rtrim(reset($zthis->fields));
 
if ($blank1stItem && $zval=="") {
$zthis->MoveNext();
continue;
}
 
if ($fieldsize > 1) {
if (isset($zthis->fields[1]))
$zval2 = rtrim($zthis->fields[1]);
else
$zval2 = rtrim(next($zthis->fields));
}
$selected = ($compareFields0) ? $zval : $zval2;
$group = '';
if (isset($zthis->fields[2])) {
$group = rtrim($zthis->fields[2]);
}
if ($optgroup != $group) {
$optgroup = $group;
if ($firstgroup) {
$firstgroup = false;
$s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
} else {
$s .="\n</optgroup>";
$s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
}
}
if ($hasvalue)
$value = " value='".htmlspecialchars($zval2)."'";
if (is_array($defstr)) {
if (in_array($selected,$defstr))
$s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>';
else
$s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';
}
else {
if (strcasecmp($selected,$defstr)==0)
$s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>';
else
$s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';
}
$zthis->MoveNext();
} // while
// closing last optgroup
if($optgroup != null) {
$s .= "\n</optgroup>";
}
return $s ."\n</select>\n";
}
 
 
/*
Count the number of records this sql statement will return by using
query rewriting heuristics...
Does not work with UNIONs, except with postgresql and oracle.
Usage:
$conn->Connect(...);
$cnt = _adodb_getcount($conn, $sql);
*/
function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0)
{
$qryRecs = 0;
if (preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) ||
preg_match('/\s+GROUP\s+BY\s+/is',$sql) ||
preg_match('/\s+UNION\s+/is',$sql)) {
// ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias
// but this is only supported by oracle and postgresql...
if ($zthis->dataProvider == 'oci8') {
$rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
// Allow Oracle hints to be used for query optimization, Chris Wrye
if (preg_match('#/\\*+.*?\\*\\/#', $sql, $hint)) {
$rewritesql = "SELECT ".$hint[0]." COUNT(*) FROM (".$rewritesql.")";
} else
$rewritesql = "SELECT COUNT(*) FROM (".$rewritesql.")";
} else if (strncmp($zthis->databaseType,'postgres',8) == 0) {
$info = $zthis->ServerInfo();
if (substr($info['version'],0,3) >= 7.1) { // good till version 999
$rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$sql);
$rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_";
}
}
} else {
// now replace SELECT ... FROM with SELECT COUNT(*) FROM
$rewritesql = preg_replace(
'/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql);
 
// fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails
// with mssql, access and postgresql. Also a good speedup optimization - skips sorting!
// also see http://phplens.com/lens/lensforum/msgs.php?id=12752
if (preg_match('/\sORDER\s+BY\s*\(/i',$rewritesql))
$rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$rewritesql);
else
$rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$rewritesql);
}
if (isset($rewritesql) && $rewritesql != $sql) {
if ($secs2cache) {
// we only use half the time of secs2cache because the count can quickly
// become inaccurate if new records are added
$qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr);
} else {
$qryRecs = $zthis->GetOne($rewritesql,$inputarr);
}
if ($qryRecs !== false) return $qryRecs;
}
//--------------------------------------------
// query rewrite failed - so try slower way...
// strip off unneeded ORDER BY if no UNION
if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql;
else $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
$rstest = &$zthis->Execute($rewritesql,$inputarr);
if (!$rstest) $rstest = $zthis->Execute($sql,$inputarr);
if ($rstest) {
$qryRecs = $rstest->RecordCount();
if ($qryRecs == -1) {
global $ADODB_EXTENSION;
// some databases will return -1 on MoveLast() - change to MoveNext()
if ($ADODB_EXTENSION) {
while(!$rstest->EOF) {
adodb_movenext($rstest);
}
} else {
while(!$rstest->EOF) {
$rstest->MoveNext();
}
}
$qryRecs = $rstest->_currentRow;
}
$rstest->Close();
if ($qryRecs == -1) return 0;
}
return $qryRecs;
}
 
/*
Code originally from "Cornel G" <conyg@fx.ro>
 
This code might not work with SQL that has UNION in it
Also if you are using CachePageExecute(), there is a strong possibility that
data will get out of synch. use CachePageExecute() only with tables that
rarely change.
*/
function &_adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page,
$inputarr=false, $secs2cache=0)
{
$atfirstpage = false;
$atlastpage = false;
$lastpageno=1;
 
// If an invalid nrows is supplied,
// we assume a default value of 10 rows per page
if (!isset($nrows) || $nrows <= 0) $nrows = 10;
 
$qryRecs = false; //count records for no offset
$qryRecs = _adodb_getcount($zthis,$sql,$inputarr,$secs2cache);
$lastpageno = (int) ceil($qryRecs / $nrows);
$zthis->_maxRecordCount = $qryRecs;
 
 
// ***** Here we check whether $page is the last page or
// whether we are trying to retrieve
// a page number greater than the last page number.
if ($page >= $lastpageno) {
$page = $lastpageno;
$atlastpage = true;
}
// If page number <= 1, then we are at the first page
if (empty($page) || $page <= 1) {
$page = 1;
$atfirstpage = true;
}
// We get the data we want
$offset = $nrows * ($page-1);
if ($secs2cache > 0)
$rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr);
else
$rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache);
 
// Before returning the RecordSet, we set the pagination properties we need
if ($rsreturn) {
$rsreturn->_maxRecordCount = $qryRecs;
$rsreturn->rowsPerPage = $nrows;
$rsreturn->AbsolutePage($page);
$rsreturn->AtFirstPage($atfirstpage);
$rsreturn->AtLastPage($atlastpage);
$rsreturn->LastPageNo($lastpageno);
}
return $rsreturn;
}
 
// Iván Oliva version
function &_adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0)
{
 
$atfirstpage = false;
$atlastpage = false;
if (!isset($page) || $page <= 1) { // If page number <= 1, then we are at the first page
$page = 1;
$atfirstpage = true;
}
if ($nrows <= 0) $nrows = 10; // If an invalid nrows is supplied, we assume a default value of 10 rows per page
// ***** Here we check whether $page is the last page or whether we are trying to retrieve a page number greater than
// the last page number.
$pagecounter = $page + 1;
$pagecounteroffset = ($pagecounter * $nrows) - $nrows;
if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr);
else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache);
if ($rstest) {
while ($rstest && $rstest->EOF && $pagecounter>0) {
$atlastpage = true;
$pagecounter--;
$pagecounteroffset = $nrows * ($pagecounter - 1);
$rstest->Close();
if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr);
else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache);
}
if ($rstest) $rstest->Close();
}
if ($atlastpage) { // If we are at the last page or beyond it, we are going to retrieve it
$page = $pagecounter;
if ($page == 1) $atfirstpage = true; // We have to do this again in case the last page is the same as the first
//... page, that is, the recordset has only 1 page.
}
// We get the data we want
$offset = $nrows * ($page-1);
if ($secs2cache > 0) $rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr);
else $rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache);
// Before returning the RecordSet, we set the pagination properties we need
if ($rsreturn) {
$rsreturn->rowsPerPage = $nrows;
$rsreturn->AbsolutePage($page);
$rsreturn->AtFirstPage($atfirstpage);
$rsreturn->AtLastPage($atlastpage);
}
return $rsreturn;
}
 
function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=2)
{
if (!$rs) {
printf(ADODB_BAD_RS,'GetUpdateSQL');
return false;
}
$fieldUpdatedCount = 0;
$arrFields = _array_change_key_case($arrFields);
 
$hasnumeric = isset($rs->fields[0]);
$setFields = '';
// Loop through all of the fields in the recordset
for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
// Get the field from the recordset
$field = $rs->FetchField($i);
 
// If the recordset field is one
// of the fields passed in then process.
$upperfname = strtoupper($field->name);
if (adodb_key_exists($upperfname,$arrFields,$force)) {
// If the existing field value in the recordset
// is different from the value passed in then
// go ahead and append the field name and new value to
// the update query.
if ($hasnumeric) $val = $rs->fields[$i];
else if (isset($rs->fields[$upperfname])) $val = $rs->fields[$upperfname];
else if (isset($rs->fields[$field->name])) $val = $rs->fields[$field->name];
else if (isset($rs->fields[strtolower($upperfname)])) $val = $rs->fields[strtolower($upperfname)];
else $val = '';
if ($forceUpdate || strcmp($val, $arrFields[$upperfname])) {
// Set the counter for the number of fields that will be updated.
$fieldUpdatedCount++;
 
// Based on the datatype of the field
// Format the value properly for the database
$type = $rs->MetaType($field->type);
 
if ($type == 'null') {
$type = 'C';
}
if (strpos($upperfname,' ') !== false)
$fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;
else
$fnameq = $upperfname;
// is_null requires php 4.0.4
//********************************************************//
if (is_null($arrFields[$upperfname])
|| (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)
|| $arrFields[$upperfname] === 'null'
)
{
switch ($force) {
 
//case 0:
// //Ignore empty values. This is allready handled in "adodb_key_exists" function.
//break;
 
case 1:
//Set null
$setFields .= $field->name . " = null, ";
break;
case 2:
//Set empty
$arrFields[$upperfname] = "";
$setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq);
break;
default:
case 3:
//Set the value that was given in array, so you can give both null and empty values
if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === 'null') {
$setFields .= $field->name . " = null, ";
} else {
$setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq);
}
break;
}
//********************************************************//
} else {
//we do this so each driver can customize the sql for
//DB specific column types.
//Oracle needs BLOB types to be handled with a returning clause
//postgres has special needs as well
$setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,
$arrFields, $magicq);
}
}
}
}
 
// If there were any modified fields then build the rest of the update query.
if ($fieldUpdatedCount > 0 || $forceUpdate) {
// Get the table name from the existing query.
if (!empty($rs->tableName)) $tableName = $rs->tableName;
else {
preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName);
$tableName = $tableName[1];
}
// Get the full where clause excluding the word "WHERE" from
// the existing query.
preg_match('/\sWHERE\s(.*)/is', $rs->sql, $whereClause);
$discard = false;
// not a good hack, improvements?
if ($whereClause) {
#var_dump($whereClause);
if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard));
else if (preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard));
else if (preg_match('/\s(FOR UPDATE.*)/is', $whereClause[1], $discard));
else preg_match('/\s.*(\) WHERE .*)/is', $whereClause[1], $discard); # see http://sourceforge.net/tracker/index.php?func=detail&aid=1379638&group_id=42718&atid=433976
} else
$whereClause = array(false,false);
if ($discard)
$whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1]));
$sql = 'UPDATE '.$tableName.' SET '.substr($setFields, 0, -2);
if (strlen($whereClause[1]) > 0)
$sql .= ' WHERE '.$whereClause[1];
 
return $sql;
 
} else {
return false;
}
}
 
function adodb_key_exists($key, &$arr,$force=2)
{
if ($force<=0) {
// the following is the old behaviour where null or empty fields are ignored
return (!empty($arr[$key])) || (isset($arr[$key]) && strlen($arr[$key])>0);
}
 
if (isset($arr[$key])) return true;
## null check below
if (ADODB_PHPVER >= 0x4010) return array_key_exists($key,$arr);
return false;
}
 
/**
* There is a special case of this function for the oci8 driver.
* The proper way to handle an insert w/ a blob in oracle requires
* a returning clause with bind variables and a descriptor blob.
*
*
*/
function _adodb_getinsertsql(&$zthis,&$rs,$arrFields,$magicq=false,$force=2)
{
static $cacheRS = false;
static $cacheSig = 0;
static $cacheCols;
 
$tableName = '';
$values = '';
$fields = '';
$recordSet = null;
$arrFields = _array_change_key_case($arrFields);
$fieldInsertedCount = 0;
if (is_string($rs)) {
//ok we have a table name
//try and get the column info ourself.
$tableName = $rs;
//we need an object for the recordSet
//because we have to call MetaType.
//php can't do a $rsclass::MetaType()
$rsclass = $zthis->rsPrefix.$zthis->databaseType;
$recordSet = new $rsclass(-1,$zthis->fetchMode);
$recordSet->connection = &$zthis;
if (is_string($cacheRS) && $cacheRS == $rs) {
$columns =& $cacheCols;
} else {
$columns = $zthis->MetaColumns( $tableName );
$cacheRS = $tableName;
$cacheCols = $columns;
}
} else if (is_subclass_of($rs, 'adorecordset')) {
if (isset($rs->insertSig) && is_integer($cacheRS) && $cacheRS == $rs->insertSig) {
$columns =& $cacheCols;
} else {
for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++)
$columns[] = $rs->FetchField($i);
$cacheRS = $cacheSig;
$cacheCols = $columns;
$rs->insertSig = $cacheSig++;
}
$recordSet =& $rs;
} else {
printf(ADODB_BAD_RS,'GetInsertSQL');
return false;
}
 
// Loop through all of the fields in the recordset
foreach( $columns as $field ) {
$upperfname = strtoupper($field->name);
if (adodb_key_exists($upperfname,$arrFields,$force)) {
$bad = false;
if (strpos($upperfname,' ') !== false)
$fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;
else
$fnameq = $upperfname;
$type = $recordSet->MetaType($field->type);
/********************************************************/
if (is_null($arrFields[$upperfname])
|| (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)
|| $arrFields[$upperfname] === 'null'
)
{
switch ($force) {
 
case 0: // we must always set null if missing
$bad = true;
break;
case 1:
$values .= "null, ";
break;
case 2:
//Set empty
$arrFields[$upperfname] = "";
$values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq,$arrFields, $magicq);
break;
 
default:
case 3:
//Set the value that was given in array, so you can give both null and empty values
if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === 'null') {
$values .= "null, ";
} else {
$values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, $arrFields, $magicq);
}
break;
} // switch
 
/*********************************************************/
} else {
//we do this so each driver can customize the sql for
//DB specific column types.
//Oracle needs BLOB types to be handled with a returning clause
//postgres has special needs as well
$values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq,
$arrFields, $magicq);
}
if ($bad) continue;
// Set the counter for the number of fields that will be inserted.
$fieldInsertedCount++;
// Get the name of the fields to insert
$fields .= $fnameq . ", ";
}
}
 
 
// If there were any inserted fields then build the rest of the insert query.
if ($fieldInsertedCount <= 0) return false;
// Get the table name from the existing query.
if (!$tableName) {
if (!empty($rs->tableName)) $tableName = $rs->tableName;
else if (preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName))
$tableName = $tableName[1];
else
return false;
}
 
// Strip off the comma and space on the end of both the fields
// and their values.
$fields = substr($fields, 0, -2);
$values = substr($values, 0, -2);
 
// Append the fields and their values to the insert query.
return 'INSERT INTO '.$tableName.' ( '.$fields.' ) VALUES ( '.$values.' )';
}
 
 
/**
* This private method is used to help construct
* the update/sql which is generated by GetInsertSQL and GetUpdateSQL.
* It handles the string construction of 1 column -> sql string based on
* the column type. We want to do 'safe' handling of BLOBs
*
* @param string the type of sql we are trying to create
* 'I' or 'U'.
* @param string column data type from the db::MetaType() method
* @param string the column name
* @param array the column value
*
* @return string
*
*/
function _adodb_column_sql_oci8(&$zthis,$action, $type, $fname, $fnameq, $arrFields, $magicq)
{
$sql = '';
// Based on the datatype of the field
// Format the value properly for the database
switch($type) {
case 'B':
//in order to handle Blobs correctly, we need
//to do some magic for Oracle
 
//we need to create a new descriptor to handle
//this properly
if (!empty($zthis->hasReturningInto)) {
if ($action == 'I') {
$sql = 'empty_blob(), ';
} else {
$sql = $fnameq. '=empty_blob(), ';
}
//add the variable to the returning clause array
//so the user can build this later in
//case they want to add more to it
$zthis->_returningArray[$fname] = ':xx'.$fname.'xx';
} else if (empty($arrFields[$fname])){
if ($action == 'I') {
$sql = 'empty_blob(), ';
} else {
$sql = $fnameq. '=empty_blob(), ';
}
} else {
//this is to maintain compatibility
//with older adodb versions.
$sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false);
}
break;
 
case "X":
//we need to do some more magic here for long variables
//to handle these correctly in oracle.
 
//create a safe bind var name
//to avoid conflicts w/ dupes.
if (!empty($zthis->hasReturningInto)) {
if ($action == 'I') {
$sql = ':xx'.$fname.'xx, ';
} else {
$sql = $fnameq.'=:xx'.$fname.'xx, ';
}
//add the variable to the returning clause array
//so the user can build this later in
//case they want to add more to it
$zthis->_returningArray[$fname] = ':xx'.$fname.'xx';
} else {
//this is to maintain compatibility
//with older adodb versions.
$sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false);
}
break;
default:
$sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false);
break;
}
return $sql;
}
function _adodb_column_sql(&$zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq, $recurse=true)
{
 
if ($recurse) {
switch($zthis->dataProvider) {
case 'postgres':
if ($type == 'L') $type = 'C';
break;
case 'oci8':
return _adodb_column_sql_oci8($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq);
}
}
switch($type) {
case "C":
case "X":
case 'B':
$val = $zthis->qstr($arrFields[$fname],$magicq);
break;
 
case "D":
$val = $zthis->DBDate($arrFields[$fname]);
break;
 
case "T":
$val = $zthis->DBTimeStamp($arrFields[$fname]);
break;
 
default:
$val = $arrFields[$fname];
if (empty($val)) $val = '0';
break;
}
 
if ($action == 'I') return $val . ", ";
return $fnameq . "=" . $val . ", ";
}
 
 
 
function _adodb_debug_execute(&$zthis, $sql, $inputarr)
{
$ss = '';
if ($inputarr) {
foreach($inputarr as $kk=>$vv) {
if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...';
$ss .= "($kk=>'$vv') ";
}
$ss = "[ $ss ]";
}
$sqlTxt = is_array($sql) ? $sql[0] : $sql;
/*str_replace(', ','##1#__^LF',is_array($sql) ? $sql[0] : $sql);
$sqlTxt = str_replace(',',', ',$sqlTxt);
$sqlTxt = str_replace('##1#__^LF', ', ' ,$sqlTxt);
*/
// check if running from browser or command-line
$inBrowser = isset($_SERVER['HTTP_USER_AGENT']);
$dbt = $zthis->databaseType;
if (isset($zthis->dsnType)) $dbt .= '-'.$zthis->dsnType;
if ($inBrowser) {
if ($ss) {
$ss = '<code>'.htmlspecialchars($ss).'</code>';
}
if ($zthis->debug === -1)
ADOConnection::outp( "<br />\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<br />\n",false);
else
ADOConnection::outp( "<hr />\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr />\n",false);
} else {
ADOConnection::outp("-----\n($dbt): ".$sqlTxt."\n-----\n",false);
}
 
$qID = $zthis->_query($sql,$inputarr);
/*
Alexios Fakios notes that ErrorMsg() must be called before ErrorNo() for mssql
because ErrorNo() calls Execute('SELECT @ERROR'), causing recursion
*/
if ($zthis->databaseType == 'mssql') {
// ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6
if($emsg = $zthis->ErrorMsg()) {
if ($err = $zthis->ErrorNo()) ADOConnection::outp($err.': '.$emsg);
}
} else if (!$qID) {
ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg());
}
if ($zthis->debug === 99) _adodb_backtrace(true,9999,2);
return $qID;
}
 
# pretty print the debug_backtrace function
function _adodb_backtrace($printOrArr=true,$levels=9999,$skippy=0)
{
if (!function_exists('debug_backtrace')) return '';
$html = (isset($_SERVER['HTTP_USER_AGENT']));
$fmt = ($html) ? "</font><font color=#808080 size=-1> %% line %4d, file: <a href=\"file:/%s\">%s</a></font>" : "%% line %4d, file: %s";
 
$MAXSTRLEN = 128;
 
$s = ($html) ? '<pre align=left>' : '';
if (is_array($printOrArr)) $traceArr = $printOrArr;
else $traceArr = debug_backtrace();
array_shift($traceArr);
array_shift($traceArr);
$tabs = sizeof($traceArr)-2;
foreach ($traceArr as $arr) {
if ($skippy) {$skippy -= 1; continue;}
$levels -= 1;
if ($levels < 0) break;
$args = array();
for ($i=0; $i < $tabs; $i++) $s .= ($html) ? ' &nbsp; ' : "\t";
$tabs -= 1;
if ($html) $s .= '<font face="Courier New,Courier">';
if (isset($arr['class'])) $s .= $arr['class'].'.';
if (isset($arr['args']))
foreach($arr['args'] as $v) {
if (is_null($v)) $args[] = 'null';
else if (is_array($v)) $args[] = 'Array['.sizeof($v).']';
else if (is_object($v)) $args[] = 'Object:'.get_class($v);
else if (is_bool($v)) $args[] = $v ? 'true' : 'false';
else {
$v = (string) @$v;
$str = htmlspecialchars(substr($v,0,$MAXSTRLEN));
if (strlen($v) > $MAXSTRLEN) $str .= '...';
$args[] = $str;
}
}
$s .= $arr['function'].'('.implode(', ',$args).')';
$s .= @sprintf($fmt, $arr['line'],$arr['file'],basename($arr['file']));
$s .= "\n";
}
if ($html) $s .= '</pre>';
if ($printOrArr) print $s;
return $s;
}
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-pager.inc.php
0,0 → 1,290
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
 
This class provides recordset pagination with
First/Prev/Next/Last links.
Feel free to modify this class for your own use as
it is very basic. To learn how to use it, see the
example in adodb/tests/testpaging.php.
"Pablo Costa" <pablo@cbsp.com.br> implemented Render_PageLinks().
Please note, this class is entirely unsupported,
and no free support requests except for bug reports
will be entertained by the author.
 
*/
class ADODB_Pager {
var $id; // unique id for pager (defaults to 'adodb')
var $db; // ADODB connection object
var $sql; // sql used
var $rs; // recordset generated
var $curr_page; // current page number before Render() called, calculated in constructor
var $rows; // number of rows per page
var $linksPerPage=10; // number of links per page in navigation bar
var $showPageLinks;
 
var $gridAttributes = 'width=100% border=1 bgcolor=white';
// Localize text strings here
var $first = '<code>|&lt;</code>';
var $prev = '<code>&lt;&lt;</code>';
var $next = '<code>>></code>';
var $last = '<code>>|</code>';
var $moreLinks = '...';
var $startLinks = '...';
var $gridHeader = false;
var $htmlSpecialChars = true;
var $page = 'Page';
var $linkSelectedColor = 'red';
var $cache = 0; #secs to cache with CachePageExecute()
//----------------------------------------------
// constructor
//
// $db adodb connection object
// $sql sql statement
// $id optional id to identify which pager,
// if you have multiple on 1 page.
// $id should be only be [a-z0-9]*
//
function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false)
{
global $PHP_SELF;
$curr_page = $id.'_curr_page';
if (empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks
$this->sql = $sql;
$this->id = $id;
$this->db = $db;
$this->showPageLinks = $showPageLinks;
$next_page = $id.'_next_page';
if (isset($_GET[$next_page])) {
$_SESSION[$curr_page] = (integer) $_GET[$next_page];
}
if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page
$this->curr_page = $_SESSION[$curr_page];
}
//---------------------------
// Display link to first page
function Render_First($anchor=true)
{
global $PHP_SELF;
if ($anchor) {
?>
<a href="<?php echo $PHP_SELF,'?',$this->id;?>_next_page=1"><?php echo $this->first;?></a> &nbsp;
<?php
} else {
print "$this->first &nbsp; ";
}
}
//--------------------------
// Display link to next page
function render_next($anchor=true)
{
global $PHP_SELF;
if ($anchor) {
?>
<a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() + 1 ?>"><?php echo $this->next;?></a> &nbsp;
<?php
} else {
print "$this->next &nbsp; ";
}
}
//------------------
// Link to last page
//
// for better performance with large recordsets, you can set
// $this->db->pageExecuteCountRows = false, which disables
// last page counting.
function render_last($anchor=true)
{
global $PHP_SELF;
if (!$this->db->pageExecuteCountRows) return;
if ($anchor) {
?>
<a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->LastPageNo() ?>"><?php echo $this->last;?></a> &nbsp;
<?php
} else {
print "$this->last &nbsp; ";
}
}
//---------------------------------------------------
// original code by "Pablo Costa" <pablo@cbsp.com.br>
function render_pagelinks()
{
global $PHP_SELF;
$pages = $this->rs->LastPageNo();
$linksperpage = $this->linksPerPage ? $this->linksPerPage : $pages;
for($i=1; $i <= $pages; $i+=$linksperpage)
{
if($this->rs->AbsolutePage() >= $i)
{
$start = $i;
}
}
$numbers = '';
$end = $start+$linksperpage-1;
$link = $this->id . "_next_page";
if($end > $pages) $end = $pages;
if ($this->startLinks && $start > 1) {
$pos = $start - 1;
$numbers .= "<a href=$PHP_SELF?$link=$pos>$this->startLinks</a> ";
}
for($i=$start; $i <= $end; $i++) {
if ($this->rs->AbsolutePage() == $i)
$numbers .= "<font color=$this->linkSelectedColor><b>$i</b></font> ";
else
$numbers .= "<a href=$PHP_SELF?$link=$i>$i</a> ";
}
if ($this->moreLinks && $end < $pages)
$numbers .= "<a href=$PHP_SELF?$link=$i>$this->moreLinks</a> ";
print $numbers . ' &nbsp; ';
}
// Link to previous page
function render_prev($anchor=true)
{
global $PHP_SELF;
if ($anchor) {
?>
<a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() - 1 ?>"><?php echo $this->prev;?></a> &nbsp;
<?php
} else {
print "$this->prev &nbsp; ";
}
}
//--------------------------------------------------------
// Simply rendering of grid. You should override this for
// better control over the format of the grid
//
// We use output buffering to keep code clean and readable.
function RenderGrid()
{
global $gSQLBlockRows; // used by rs2html to indicate how many rows to display
include_once(ADODB_DIR.'/tohtml.inc.php');
ob_start();
$gSQLBlockRows = $this->rows;
rs2html($this->rs,$this->gridAttributes,$this->gridHeader,$this->htmlSpecialChars);
$s = ob_get_contents();
ob_end_clean();
return $s;
}
//-------------------------------------------------------
// Navigation bar
//
// we use output buffering to keep the code easy to read.
function RenderNav()
{
ob_start();
if (!$this->rs->AtFirstPage()) {
$this->Render_First();
$this->Render_Prev();
} else {
$this->Render_First(false);
$this->Render_Prev(false);
}
if ($this->showPageLinks){
$this->Render_PageLinks();
}
if (!$this->rs->AtLastPage()) {
$this->Render_Next();
$this->Render_Last();
} else {
$this->Render_Next(false);
$this->Render_Last(false);
}
$s = ob_get_contents();
ob_end_clean();
return $s;
}
//-------------------
// This is the footer
function RenderPageCount()
{
if (!$this->db->pageExecuteCountRows) return '';
$lastPage = $this->rs->LastPageNo();
if ($lastPage == -1) $lastPage = 1; // check for empty rs.
if ($this->curr_page > $lastPage) $this->curr_page = 1;
return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>";
}
//-----------------------------------
// Call this class to draw everything.
function Render($rows=10)
{
global $ADODB_COUNTRECS;
$this->rows = $rows;
if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL;
$savec = $ADODB_COUNTRECS;
if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true;
if ($this->cache)
$rs = &$this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page);
else
$rs = &$this->db->PageExecute($this->sql,$rows,$this->curr_page);
$ADODB_COUNTRECS = $savec;
$this->rs = &$rs;
if (!$rs) {
print "<h3>Query failed: $this->sql</h3>";
return;
}
if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage()))
$header = $this->RenderNav();
else
$header = "&nbsp;";
$grid = $this->RenderGrid();
$footer = $this->RenderPageCount();
$this->RenderLayout($header,$grid,$footer);
$rs->Close();
$this->rs = false;
}
//------------------------------------------------------
// override this to control overall layout and formating
function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige')
{
echo "<table ".$attributes."><tr><td>",
$header,
"</td></tr><tr><td>",
$grid,
"</td></tr><tr><td>",
$footer,
"</td></tr></table>";
}
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-pear.inc.php
0,0 → 1,374
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* PEAR DB Emulation Layer for ADODB.
*
* The following code is modelled on PEAR DB code by Stig Bakken <ssb@fast.no> |
* and Tomas V.V.Cox <cox@idecnet.com>. Portions (c)1997-2002 The PHP Group.
*/
 
/*
We support:
DB_Common
---------
query - returns PEAR_Error on error
limitQuery - return PEAR_Error on error
prepare - does not return PEAR_Error on error
execute - does not return PEAR_Error on error
setFetchMode - supports ASSOC and ORDERED
errorNative
quote
nextID
disconnect
getOne
getAssoc
getRow
getCol
getAll
DB_Result
---------
numRows - returns -1 if not supported
numCols
fetchInto - does not support passing of fetchmode
fetchRows - does not support passing of fetchmode
free
*/
define('ADODB_PEAR',dirname(__FILE__));
include_once "PEAR.php";
include_once ADODB_PEAR."/adodb-errorpear.inc.php";
include_once ADODB_PEAR."/adodb.inc.php";
 
if (!defined('DB_OK')) {
define("DB_OK", 1);
define("DB_ERROR",-1);
 
// autoExecute constants
define('DB_AUTOQUERY_INSERT', 1);
define('DB_AUTOQUERY_UPDATE', 2);
 
/**
* This is a special constant that tells DB the user hasn't specified
* any particular get mode, so the default should be used.
*/
 
define('DB_FETCHMODE_DEFAULT', 0);
 
/**
* Column data indexed by numbers, ordered from 0 and up
*/
 
define('DB_FETCHMODE_ORDERED', 1);
 
/**
* Column data indexed by column names
*/
 
define('DB_FETCHMODE_ASSOC', 2);
 
/* for compatibility */
 
define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED);
define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC);
 
/**
* these are constants for the tableInfo-function
* they are bitwised or'ed. so if there are more constants to be defined
* in the future, adjust DB_TABLEINFO_FULL accordingly
*/
 
define('DB_TABLEINFO_ORDER', 1);
define('DB_TABLEINFO_ORDERTABLE', 2);
define('DB_TABLEINFO_FULL', 3);
}
 
/**
* The main "DB" class is simply a container class with some static
* methods for creating DB objects as well as some utility functions
* common to all parts of DB.
*
*/
 
class DB
{
/**
* Create a new DB object for the specified database type
*
* @param $type string database type, for example "mysql"
*
* @return object a newly created DB object, or a DB error code on
* error
*/
 
function &factory($type)
{
include_once(ADODB_DIR."/drivers/adodb-$type.inc.php");
$obj = &NewADOConnection($type);
if (!is_object($obj)) $obj =& new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1);
return $obj;
}
 
/**
* Create a new DB object and connect to the specified database
*
* @param $dsn mixed "data source name", see the DB::parseDSN
* method for a description of the dsn format. Can also be
* specified as an array of the format returned by DB::parseDSN.
*
* @param $options mixed if boolean (or scalar), tells whether
* this connection should be persistent (for backends that support
* this). This parameter can also be an array of options, see
* DB_common::setOption for more information on connection
* options.
*
* @return object a newly created DB connection object, or a DB
* error object on error
*
* @see DB::parseDSN
* @see DB::isError
*/
function &connect($dsn, $options = false)
{
if (is_array($dsn)) {
$dsninfo = $dsn;
} else {
$dsninfo = DB::parseDSN($dsn);
}
switch ($dsninfo["phptype"]) {
case 'pgsql': $type = 'postgres7'; break;
case 'ifx': $type = 'informix9'; break;
default: $type = $dsninfo["phptype"]; break;
}
 
if (is_array($options) && isset($options["debug"]) &&
$options["debug"] >= 2) {
// expose php errors with sufficient debug level
@include_once("adodb-$type.inc.php");
} else {
@include_once("adodb-$type.inc.php");
}
 
@$obj =& NewADOConnection($type);
if (!is_object($obj)) {
$obj =& new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1);
return $obj;
}
if (is_array($options)) {
foreach($options as $k => $v) {
switch(strtolower($k)) {
case 'persist':
case 'persistent': $persist = $v; break;
#ibase
case 'dialect': $obj->dialect = $v; break;
case 'charset': $obj->charset = $v; break;
case 'buffers': $obj->buffers = $v; break;
#ado
case 'charpage': $obj->charPage = $v; break;
#mysql
case 'clientflags': $obj->clientFlags = $v; break;
}
}
} else {
$persist = false;
}
 
if (isset($dsninfo['socket'])) $dsninfo['hostspec'] .= ':'.$dsninfo['socket'];
else if (isset($dsninfo['port'])) $dsninfo['hostspec'] .= ':'.$dsninfo['port'];
if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']);
else $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']);
if (!$ok) $obj = ADODB_PEAR_Error();
return $obj;
}
 
/**
* Return the DB API version
*
* @return int the DB API version number
*/
function apiVersion()
{
return 2;
}
 
/**
* Tell whether a result code from a DB method is an error
*
* @param $value int result code
*
* @return bool whether $value is an error
*/
function isError($value)
{
if (!is_object($value)) return false;
$class = get_class($value);
return $class == 'pear_error' || is_subclass_of($value, 'pear_error') ||
$class == 'db_error' || is_subclass_of($value, 'db_error');
}
 
 
/**
* Tell whether a result code from a DB method is a warning.
* Warnings differ from errors in that they are generated by DB,
* and are not fatal.
*
* @param $value mixed result value
*
* @return bool whether $value is a warning
*/
function isWarning($value)
{
return false;
/*
return is_object($value) &&
(get_class( $value ) == "db_warning" ||
is_subclass_of($value, "db_warning"));*/
}
 
/**
* Parse a data source name
*
* @param $dsn string Data Source Name to be parsed
*
* @return array an associative array with the following keys:
*
* phptype: Database backend used in PHP (mysql, odbc etc.)
* dbsyntax: Database used with regards to SQL syntax etc.
* protocol: Communication protocol to use (tcp, unix etc.)
* hostspec: Host specification (hostname[:port])
* database: Database to use on the DBMS server
* username: User name for login
* password: Password for login
*
* The format of the supplied DSN is in its fullest form:
*
* phptype(dbsyntax)://username:password@protocol+hostspec/database
*
* Most variations are allowed:
*
* phptype://username:password@protocol+hostspec:110//usr/db_file.db
* phptype://username:password@hostspec/database_name
* phptype://username:password@hostspec
* phptype://username@hostspec
* phptype://hostspec/database
* phptype://hostspec
* phptype(dbsyntax)
* phptype
*
* @author Tomas V.V.Cox <cox@idecnet.com>
*/
function parseDSN($dsn)
{
if (is_array($dsn)) {
return $dsn;
}
 
$parsed = array(
'phptype' => false,
'dbsyntax' => false,
'protocol' => false,
'hostspec' => false,
'database' => false,
'username' => false,
'password' => false
);
 
// Find phptype and dbsyntax
if (($pos = strpos($dsn, '://')) !== false) {
$str = substr($dsn, 0, $pos);
$dsn = substr($dsn, $pos + 3);
} else {
$str = $dsn;
$dsn = NULL;
}
 
// Get phptype and dbsyntax
// $str => phptype(dbsyntax)
if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
$parsed['phptype'] = $arr[1];
$parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2];
} else {
$parsed['phptype'] = $str;
$parsed['dbsyntax'] = $str;
}
 
if (empty($dsn)) {
return $parsed;
}
 
// Get (if found): username and password
// $dsn => username:password@protocol+hostspec/database
if (($at = strpos($dsn,'@')) !== false) {
$str = substr($dsn, 0, $at);
$dsn = substr($dsn, $at + 1);
if (($pos = strpos($str, ':')) !== false) {
$parsed['username'] = urldecode(substr($str, 0, $pos));
$parsed['password'] = urldecode(substr($str, $pos + 1));
} else {
$parsed['username'] = urldecode($str);
}
}
 
// Find protocol and hostspec
// $dsn => protocol+hostspec/database
if (($pos=strpos($dsn, '/')) !== false) {
$str = substr($dsn, 0, $pos);
$dsn = substr($dsn, $pos + 1);
} else {
$str = $dsn;
$dsn = NULL;
}
 
// Get protocol + hostspec
// $str => protocol+hostspec
if (($pos=strpos($str, '+')) !== false) {
$parsed['protocol'] = substr($str, 0, $pos);
$parsed['hostspec'] = urldecode(substr($str, $pos + 1));
} else {
$parsed['hostspec'] = urldecode($str);
}
 
// Get dabase if any
// $dsn => database
if (!empty($dsn)) {
$parsed['database'] = $dsn;
}
 
return $parsed;
}
 
/**
* Load a PHP database extension if it is not loaded already.
*
* @access public
*
* @param $name the base name of the extension (without the .so or
* .dll suffix)
*
* @return bool true if the extension was already or successfully
* loaded, false if it could not be loaded
*/
function assertExtension($name)
{
if (!extension_loaded($name)) {
$dlext = (strncmp(PHP_OS,'WIN',3) === 0) ? '.dll' : '.so';
@dl($name . $dlext);
}
if (!extension_loaded($name)) {
return false;
}
return true;
}
}
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-perf.inc.php
0,0 → 1,1053
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Library for basic performance monitoring and tuning.
My apologies if you see code mixed with presentation. The presentation suits
my needs. If you want to separate code from presentation, be my guest. Patches
are welcome.
*/
 
if (!defined('ADODB_DIR')) include_once(dirname(__FILE__).'/adodb.inc.php');
include_once(ADODB_DIR.'/tohtml.inc.php');
 
define( 'ADODB_OPT_HIGH', 2);
define( 'ADODB_OPT_LOW', 1);
 
// returns in K the memory of current process, or 0 if not known
function adodb_getmem()
{
if (function_exists('memory_get_usage'))
return (integer) ((memory_get_usage()+512)/1024);
$pid = getmypid();
if ( strncmp(strtoupper(PHP_OS),'WIN',3)==0) {
$output = array();
exec('tasklist /FI "PID eq ' . $pid. '" /FO LIST', $output);
return substr($output[5], strpos($output[5], ':') + 1);
}
/* Hopefully UNIX */
exec("ps --pid $pid --no-headers -o%mem,size", $output);
if (sizeof($output) == 0) return 0;
$memarr = explode(' ',$output[0]);
if (sizeof($memarr)>=2) return (integer) $memarr[1];
return 0;
}
 
// avoids localization problems where , is used instead of .
function adodb_round($n,$prec)
{
return number_format($n, $prec, '.', '');
}
 
/* return microtime value as a float */
function adodb_microtime()
{
$t = microtime();
$t = explode(' ',$t);
return (float)$t[1]+ (float)$t[0];
}
 
/* sql code timing */
function& adodb_log_sql(&$conn,$sql,$inputarr)
{
$perf_table = adodb_perf::table();
$conn->fnExecute = false;
$t0 = microtime();
$rs =& $conn->Execute($sql,$inputarr);
$t1 = microtime();
 
if (!empty($conn->_logsql)) {
$conn->_logsql = false; // disable logsql error simulation
$dbT = $conn->databaseType;
$a0 = split(' ',$t0);
$a0 = (float)$a0[1]+(float)$a0[0];
$a1 = split(' ',$t1);
$a1 = (float)$a1[1]+(float)$a1[0];
$time = $a1 - $a0;
if (!$rs) {
$errM = $conn->ErrorMsg();
$errN = $conn->ErrorNo();
$conn->lastInsID = 0;
$tracer = substr('ERROR: '.htmlspecialchars($errM),0,250);
} else {
$tracer = '';
$errM = '';
$errN = 0;
$dbg = $conn->debug;
$conn->debug = false;
if (!is_object($rs) || $rs->dataProvider == 'empty')
$conn->_affected = $conn->affected_rows(true);
$conn->lastInsID = @$conn->Insert_ID();
$conn->debug = $dbg;
}
if (isset($_SERVER['HTTP_HOST'])) {
$tracer .= '<br>'.$_SERVER['HTTP_HOST'];
if (isset($_SERVER['PHP_SELF'])) $tracer .= $_SERVER['PHP_SELF'];
} else
if (isset($_SERVER['PHP_SELF'])) $tracer .= '<br>'.$_SERVER['PHP_SELF'];
//$tracer .= (string) adodb_backtrace(false);
$tracer = (string) substr($tracer,0,500);
if (is_array($inputarr)) {
if (is_array(reset($inputarr))) $params = 'Array sizeof='.sizeof($inputarr);
else {
// Quote string parameters so we can see them in the
// performance stats. This helps spot disabled indexes.
$xar_params = $inputarr;
foreach ($xar_params as $xar_param_key => $xar_param) {
if (gettype($xar_param) == 'string')
$xar_params[$xar_param_key] = '"' . $xar_param . '"';
}
$params = implode(', ', $xar_params);
if (strlen($params) >= 3000) $params = substr($params, 0, 3000);
}
} else {
$params = '';
}
if (is_array($sql)) $sql = $sql[0];
$arr = array('b'=>strlen($sql).'.'.crc32($sql),
'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>adodb_round($time,6));
//var_dump($arr);
$saved = $conn->debug;
$conn->debug = 0;
$d = $conn->sysTimeStamp;
if (empty($d)) $d = date("'Y-m-d H:i:s'");
if ($conn->dataProvider == 'oci8' && $dbT != 'oci8po') {
$isql = "insert into $perf_table values($d,:b,:c,:d,:e,:f)";
} else if ($dbT == 'odbc_mssql' || $dbT == 'informix' || $dbT == 'odbtp') {
$timer = $arr['f'];
if ($dbT == 'informix') $sql2 = substr($sql2,0,230);
 
$sql1 = $conn->qstr($arr['b']);
$sql2 = $conn->qstr($arr['c']);
$params = $conn->qstr($arr['d']);
$tracer = $conn->qstr($arr['e']);
$isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values($d,$sql1,$sql2,$params,$tracer,$timer)";
if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql);
$arr = false;
} else {
$isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $d,?,?,?,?,?)";
}
 
$ok = $conn->Execute($isql,$arr);
$conn->debug = $saved;
if ($ok) {
$conn->_logsql = true;
} else {
$err2 = $conn->ErrorMsg();
$conn->_logsql = true; // enable logsql error simulation
$perf =& NewPerfMonitor($conn);
if ($perf) {
if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr);
} else {
$ok = $conn->Execute("create table $perf_table (
created varchar(50),
sql0 varchar(250),
sql1 varchar(4000),
params varchar(3000),
tracer varchar(500),
timer decimal(16,6))");
}
if (!$ok) {
ADOConnection::outp( "<p><b>LOGSQL Insert Failed</b>: $isql<br>$err2</p>");
$conn->_logsql = false;
}
}
$conn->_errorMsg = $errM;
$conn->_errorCode = $errN;
}
$conn->fnExecute = 'adodb_log_sql';
return $rs;
}
 
/*
The settings data structure is an associative array that database parameter per element.
 
Each database parameter element in the array is itself an array consisting of:
 
0: category code, used to group related db parameters
1: either
a. sql string to retrieve value, eg. "select value from v\$parameter where name='db_block_size'",
b. array holding sql string and field to look for, e.g. array('show variables','table_cache'),
c. a string prefixed by =, then a PHP method of the class is invoked,
e.g. to invoke $this->GetIndexValue(), set this array element to '=GetIndexValue',
2: description of the database parameter
*/
 
class adodb_perf {
var $conn;
var $color = '#F0F0F0';
var $table = '<table border=1 bgcolor=white>';
var $titles = '<tr><td><b>Parameter</b></td><td><b>Value</b></td><td><b>Description</b></td></tr>';
var $warnRatio = 90;
var $tablesSQL = false;
var $cliFormat = "%32s => %s \r\n";
var $sql1 = 'sql1'; // used for casting sql1 to text for mssql
var $explain = true;
var $helpurl = "<a href=http://phplens.com/adodb/reference.functions.fnexecute.and.fncacheexecute.properties.html#logsql>LogSQL help</a>";
var $createTableSQL = false;
var $maxLength = 2000;
// Sets the tablename to be used
function table($newtable = false)
{
static $_table;
 
if (!empty($newtable)) $_table = $newtable;
if (empty($_table)) $_table = 'adodb_logsql';
return $_table;
}
 
// returns array with info to calculate CPU Load
function _CPULoad()
{
/*
 
cpu 524152 2662 2515228 336057010
cpu0 264339 1408 1257951 168025827
cpu1 259813 1254 1257277 168031181
page 622307 25475680
swap 24 1891
intr 890153570 868093576 6 0 4 4 0 6 1 2 0 0 0 124 0 8098760 2 13961053 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
disk_io: (3,0):(3144904,54369,610378,3090535,50936192) (3,1):(3630212,54097,633016,3576115,50951320)
ctxt 66155838
btime 1062315585
processes 69293
 
*/
// Algorithm is taken from
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__obtaining_raw_performance_data.asp
if (strncmp(PHP_OS,'WIN',3)==0) {
if (PHP_VERSION == '5.0.0') return false;
if (PHP_VERSION == '5.0.1') return false;
if (PHP_VERSION == '5.0.2') return false;
if (PHP_VERSION == '5.0.3') return false;
if (PHP_VERSION == '4.3.10') return false; # see http://bugs.php.net/bug.php?id=31737
@$c = new COM("WinMgmts:{impersonationLevel=impersonate}!Win32_PerfRawData_PerfOS_Processor.Name='_Total'");
if (!$c) return false;
$info[0] = $c->PercentProcessorTime;
$info[1] = 0;
$info[2] = 0;
$info[3] = $c->TimeStamp_Sys100NS;
//print_r($info);
return $info;
}
// Algorithm - Steve Blinch (BlitzAffe Online, http://www.blitzaffe.com)
$statfile = '/proc/stat';
if (!file_exists($statfile)) return false;
$fd = fopen($statfile,"r");
if (!$fd) return false;
$statinfo = explode("\n",fgets($fd, 1024));
fclose($fd);
foreach($statinfo as $line) {
$info = explode(" ",$line);
if($info[0]=="cpu") {
array_shift($info); // pop off "cpu"
if(!$info[0]) array_shift($info); // pop off blank space (if any)
return $info;
}
}
return false;
}
/* NOT IMPLEMENTED */
function MemInfo()
{
/*
 
total: used: free: shared: buffers: cached:
Mem: 1055289344 917299200 137990144 0 165437440 599773184
Swap: 2146775040 11055104 2135719936
MemTotal: 1030556 kB
MemFree: 134756 kB
MemShared: 0 kB
Buffers: 161560 kB
Cached: 581384 kB
SwapCached: 4332 kB
Active: 494468 kB
Inact_dirty: 322856 kB
Inact_clean: 24256 kB
Inact_target: 168316 kB
HighTotal: 131064 kB
HighFree: 1024 kB
LowTotal: 899492 kB
LowFree: 133732 kB
SwapTotal: 2096460 kB
SwapFree: 2085664 kB
Committed_AS: 348732 kB
*/
}
/*
Remember that this is client load, not db server load!
*/
var $_lastLoad;
function CPULoad()
{
$info = $this->_CPULoad();
if (!$info) return false;
if (empty($this->_lastLoad)) {
sleep(1);
$this->_lastLoad = $info;
$info = $this->_CPULoad();
}
$last = $this->_lastLoad;
$this->_lastLoad = $info;
$d_user = $info[0] - $last[0];
$d_nice = $info[1] - $last[1];
$d_system = $info[2] - $last[2];
$d_idle = $info[3] - $last[3];
//printf("Delta - User: %f Nice: %f System: %f Idle: %f<br>",$d_user,$d_nice,$d_system,$d_idle);
 
if (strncmp(PHP_OS,'WIN',3)==0) {
if ($d_idle < 1) $d_idle = 1;
return 100*(1-$d_user/$d_idle);
}else {
$total=$d_user+$d_nice+$d_system+$d_idle;
if ($total<1) $total=1;
return 100*($d_user+$d_nice+$d_system)/$total;
}
}
function Tracer($sql)
{
$perf_table = adodb_perf::table();
$saveE = $this->conn->fnExecute;
$this->conn->fnExecute = false;
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$sqlq = $this->conn->qstr($sql);
$arr = $this->conn->GetArray(
"select count(*),tracer
from $perf_table where sql1=$sqlq
group by tracer
order by 1 desc");
$s = '';
if ($arr) {
$s .= '<h3>Scripts Affected</h3>';
foreach($arr as $k) {
$s .= sprintf("%4d",$k[0]).' &nbsp; '.strip_tags($k[1]).'<br>';
}
}
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_CACHE_MODE = $save;
$this->conn->fnExecute = $saveE;
return $s;
}
 
/*
Explain Plan for $sql.
If only a snippet of the $sql is passed in, then $partial will hold the crc32 of the
actual sql.
*/
function Explain($sql,$partial=false)
{
return false;
}
function InvalidSQL($numsql = 10)
{
if (isset($_GET['sql'])) return;
$s = '<h3>Invalid SQL</h3>';
$saveE = $this->conn->fnExecute;
$this->conn->fnExecute = false;
$perf_table = adodb_perf::table();
$rs =& $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql);
$this->conn->fnExecute = $saveE;
if ($rs) {
$s .= rs2html($rs,false,false,false,false);
} else
return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>";
return $s;
}
 
/*
This script identifies the longest running SQL
*/
function _SuspiciousSQL($numsql = 10)
{
global $ADODB_FETCH_MODE;
$perf_table = adodb_perf::table();
$saveE = $this->conn->fnExecute;
$this->conn->fnExecute = false;
if (isset($_GET['exps']) && isset($_GET['sql'])) {
$partial = !empty($_GET['part']);
echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
}
if (isset($_GET['sql'])) return;
$sql1 = $this->sql1;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
//$this->conn->debug=1;
$rs =& $this->conn->SelectLimit(
"select avg(timer) as avg_timer,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer
from $perf_table
where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT')
and (tracer is null or tracer not like 'ERROR:%')
group by sql1
order by 1 desc",$numsql);
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
$this->conn->fnExecute = $saveE;
if (!$rs) return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>";
$s = "<h3>Suspicious SQL</h3>
<font size=1>The following SQL have high average execution times</font><br>
<table border=1 bgcolor=white><tr><td><b>Avg Time</b><td><b>Count</b><td><b>SQL</b><td><b>Max</b><td><b>Min</b></tr>\n";
$max = $this->maxLength;
while (!$rs->EOF) {
$sql = $rs->fields[1];
$raw = urlencode($sql);
if (strlen($raw)>$max-100) {
$sql2 = substr($sql,0,$max-500);
$raw = urlencode($sql2).'&part='.crc32($sql);
}
$prefix = "<a target=sql".rand()." href=\"?hidem=1&exps=1&sql=".$raw."&x#explain\">";
$suffix = "</a>";
if ($this->explain == false || strlen($prefix)>$max) {
$suffix = ' ... <i>String too long for GET parameter: '.strlen($prefix).'</i>';
$prefix = '';
}
$s .= "<tr><td>".adodb_round($rs->fields[0],6)."<td align=right>".$rs->fields[2]."<td><font size=-1>".$prefix.htmlspecialchars($sql).$suffix."</font>".
"<td>".$rs->fields[3]."<td>".$rs->fields[4]."</tr>";
$rs->MoveNext();
}
return $s."</table>";
}
function CheckMemory()
{
return '';
}
function SuspiciousSQL($numsql=10)
{
return adodb_perf::_SuspiciousSQL($numsql);
}
 
function ExpensiveSQL($numsql=10)
{
return adodb_perf::_ExpensiveSQL($numsql);
}
 
/*
This reports the percentage of load on the instance due to the most
expensive few SQL statements. Tuning these statements can often
make huge improvements in overall system performance.
*/
function _ExpensiveSQL($numsql = 10)
{
global $ADODB_FETCH_MODE;
$perf_table = adodb_perf::table();
$saveE = $this->conn->fnExecute;
$this->conn->fnExecute = false;
if (isset($_GET['expe']) && isset($_GET['sql'])) {
$partial = !empty($_GET['part']);
echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
}
if (isset($_GET['sql'])) return;
$sql1 = $this->sql1;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$rs =& $this->conn->SelectLimit(
"select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer
from $perf_table
where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT')
and (tracer is null or tracer not like 'ERROR:%')
group by sql1
having count(*)>1
order by 1 desc",$numsql);
if (isset($savem)) $this->conn->SetFetchMode($savem);
$this->conn->fnExecute = $saveE;
$ADODB_FETCH_MODE = $save;
if (!$rs) return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>";
$s = "<h3>Expensive SQL</h3>
<font size=1>Tuning the following SQL could reduce the server load substantially</font><br>
<table border=1 bgcolor=white><tr><td><b>Load</b><td><b>Count</b><td><b>SQL</b><td><b>Max</b><td><b>Min</b></tr>\n";
$max = $this->maxLength;
while (!$rs->EOF) {
$sql = $rs->fields[1];
$raw = urlencode($sql);
if (strlen($raw)>$max-100) {
$sql2 = substr($sql,0,$max-500);
$raw = urlencode($sql2).'&part='.crc32($sql);
}
$prefix = "<a target=sqle".rand()." href=\"?hidem=1&expe=1&sql=".$raw."&x#explain\">";
$suffix = "</a>";
if($this->explain == false || strlen($prefix>$max)) {
$prefix = '';
$suffix = '';
}
$s .= "<tr><td>".adodb_round($rs->fields[0],6)."<td align=right>".$rs->fields[2]."<td><font size=-1>".$prefix.htmlspecialchars($sql).$suffix."</font>".
"<td>".$rs->fields[3]."<td>".$rs->fields[4]."</tr>";
$rs->MoveNext();
}
return $s."</table>";
}
/*
Raw function to return parameter value from $settings.
*/
function DBParameter($param)
{
if (empty($this->settings[$param])) return false;
$sql = $this->settings[$param][1];
return $this->_DBParameter($sql);
}
/*
Raw function returning array of poll paramters
*/
function &PollParameters()
{
$arr[0] = (float)$this->DBParameter('data cache hit ratio');
$arr[1] = (float)$this->DBParameter('data reads');
$arr[2] = (float)$this->DBParameter('data writes');
$arr[3] = (integer) $this->DBParameter('current connections');
return $arr;
}
/*
Low-level Get Database Parameter
*/
function _DBParameter($sql)
{
$savelog = $this->conn->LogSQL(false);
if (is_array($sql)) {
global $ADODB_FETCH_MODE;
$sql1 = $sql[0];
$key = $sql[1];
if (sizeof($sql)>2) $pos = $sql[2];
else $pos = 1;
if (sizeof($sql)>3) $coef = $sql[3];
else $coef = false;
$ret = false;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$rs = $this->conn->Execute($sql1);
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rs) {
while (!$rs->EOF) {
$keyf = reset($rs->fields);
if (trim($keyf) == $key) {
$ret = $rs->fields[$pos];
if ($coef) $ret *= $coef;
break;
}
$rs->MoveNext();
}
$rs->Close();
}
$this->conn->LogSQL($savelog);
return $ret;
} else {
if (strncmp($sql,'=',1) == 0) {
$fn = substr($sql,1);
return $this->$fn();
}
$sql = str_replace('$DATABASE',$this->conn->database,$sql);
$ret = $this->conn->GetOne($sql);
$this->conn->LogSQL($savelog);
return $ret;
}
}
/*
Warn if cache ratio falls below threshold. Displayed in "Description" column.
*/
function WarnCacheRatio($val)
{
if ($val < $this->warnRatio)
return '<font color=red><b>Cache ratio should be at least '.$this->warnRatio.'%</b></font>';
else return '';
}
/***********************************************************************************************/
// HIGH LEVEL UI FUNCTIONS
/***********************************************************************************************/
 
function UI($pollsecs=5)
{
$perf_table = adodb_perf::table();
$conn = $this->conn;
$app = $conn->host;
if ($conn->host && $conn->database) $app .= ', db=';
$app .= $conn->database;
if ($app) $app .= ', ';
$savelog = $this->conn->LogSQL(false);
$info = $conn->ServerInfo();
if (isset($_GET['clearsql'])) {
$this->conn->Execute("delete from $perf_table");
}
$this->conn->LogSQL($savelog);
// magic quotes
if (isset($_GET['sql']) && get_magic_quotes_gpc()) {
$_GET['sql'] = $_GET['sql'] = str_replace(array("\\'",'\"'),array("'",'"'),$_GET['sql']);
}
if (!isset($_SESSION['ADODB_PERF_SQL'])) $nsql = $_SESSION['ADODB_PERF_SQL'] = 10;
else $nsql = $_SESSION['ADODB_PERF_SQL'];
$app .= $info['description'];
if (isset($_GET['do'])) $do = $_GET['do'];
else if (isset($_POST['do'])) $do = $_POST['do'];
else if (isset($_GET['sql'])) $do = 'viewsql';
else $do = 'stats';
if (isset($_GET['nsql'])) {
if ($_GET['nsql'] > 0) $nsql = $_SESSION['ADODB_PERF_SQL'] = (integer) $_GET['nsql'];
}
echo "<title>ADOdb Performance Monitor on $app</title><body bgcolor=white>";
if ($do == 'viewsql') $form = "<td><form># SQL:<input type=hidden value=viewsql name=do> <input type=text size=4 name=nsql value=$nsql><input type=submit value=Go></td></form>";
else $form = "<td>&nbsp;</td>";
$allowsql = !defined('ADODB_PERF_NO_RUN_SQL');
if (empty($_GET['hidem']))
echo "<table border=1 width=100% bgcolor=lightyellow><tr><td colspan=2>
<b><a href=http://adodb.sourceforge.net/?perf=1>ADOdb</a> Performance Monitor</b> <font size=1>for $app</font></tr><tr><td>
<a href=?do=stats><b>Performance Stats</b></a> &nbsp; <a href=?do=viewsql><b>View SQL</b></a>
&nbsp; <a href=?do=tables><b>View Tables</b></a> &nbsp; <a href=?do=poll><b>Poll Stats</b></a>",
$allowsql ? ' &nbsp; <a href=?do=dosql><b>Run SQL</b></a>' : '',
"$form",
"</tr></table>";
 
switch ($do) {
default:
case 'stats':
echo $this->HealthCheck();
//$this->conn->debug=1;
echo $this->CheckMemory();
break;
case 'poll':
echo "<iframe width=720 height=80%
src=\"{$_SERVER['PHP_SELF']}?do=poll2&hidem=1\"></iframe>";
break;
case 'poll2':
echo "<pre>";
$this->Poll($pollsecs);
break;
case 'dosql':
if (!$allowsql) break;
$this->DoSQLForm();
break;
case 'viewsql':
if (empty($_GET['hidem']))
echo "&nbsp; <a href=\"?do=viewsql&clearsql=1\">Clear SQL Log</a><br>";
echo($this->SuspiciousSQL($nsql));
echo($this->ExpensiveSQL($nsql));
echo($this->InvalidSQL($nsql));
break;
case 'tables':
echo $this->Tables(); break;
}
global $ADODB_vers;
echo "<p><div align=center><font size=1>$ADODB_vers Sponsored by <a href=http://phplens.com/>phpLens</a></font></div>";
}
/*
Runs in infinite loop, returning real-time statistics
*/
function Poll($secs=5)
{
$this->conn->fnExecute = false;
//$this->conn->debug=1;
if ($secs <= 1) $secs = 1;
echo "Accumulating statistics, every $secs seconds...\n";flush();
$arro =& $this->PollParameters();
$cnt = 0;
set_time_limit(0);
sleep($secs);
while (1) {
 
$arr =& $this->PollParameters();
$hits = sprintf('%2.2f',$arr[0]);
$reads = sprintf('%12.4f',($arr[1]-$arro[1])/$secs);
$writes = sprintf('%12.4f',($arr[2]-$arro[2])/$secs);
$sess = sprintf('%5d',$arr[3]);
$load = $this->CPULoad();
if ($load !== false) {
$oslabel = 'WS-CPU%';
$osval = sprintf(" %2.1f ",(float) $load);
}else {
$oslabel = '';
$osval = '';
}
if ($cnt % 10 == 0) echo " Time ".$oslabel." Hit% Sess Reads/s Writes/s\n";
$cnt += 1;
echo date('H:i:s').' '.$osval."$hits $sess $reads $writes\n";
flush();
if (connection_aborted()) return;
sleep($secs);
$arro = $arr;
}
}
/*
Returns basic health check in a command line interface
*/
function HealthCheckCLI()
{
return $this->HealthCheck(true);
}
/*
Returns basic health check as HTML
*/
function HealthCheck($cli=false)
{
$saveE = $this->conn->fnExecute;
$this->conn->fnExecute = false;
if ($cli) $html = '';
else $html = $this->table.'<tr><td colspan=3><h3>'.$this->conn->databaseType.'</h3></td></tr>'.$this->titles;
$oldc = false;
$bgc = '';
foreach($this->settings as $name => $arr) {
if ($arr === false) break;
if (!is_string($name)) {
if ($cli) $html .= " -- $arr -- \n";
else $html .= "<tr bgcolor=$this->color><td colspan=3><i>$arr</i> &nbsp;</td></tr>";
continue;
}
if (!is_array($arr)) break;
$category = $arr[0];
$how = $arr[1];
if (sizeof($arr)>2) $desc = $arr[2];
else $desc = ' &nbsp; ';
if ($category == 'HIDE') continue;
$val = $this->_DBParameter($how);
if ($desc && strncmp($desc,"=",1) === 0) {
$fn = substr($desc,1);
$desc = $this->$fn($val);
}
if ($val === false) {
$m = $this->conn->ErrorMsg();
$val = "Error: $m";
} else {
if (is_numeric($val) && $val >= 256*1024) {
if ($val % (1024*1024) == 0) {
$val /= (1024*1024);
$val .= 'M';
} else if ($val % 1024 == 0) {
$val /= 1024;
$val .= 'K';
}
//$val = htmlspecialchars($val);
}
}
if ($category != $oldc) {
$oldc = $category;
//$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color;
}
if (strlen($desc)==0) $desc = '&nbsp;';
if (strlen($val)==0) $val = '&nbsp;';
if ($cli) {
$html .= str_replace('&nbsp;','',sprintf($this->cliFormat,strip_tags($name),strip_tags($val),strip_tags($desc)));
}else {
$html .= "<tr$bgc><td>".$name.'</td><td>'.$val.'</td><td>'.$desc."</td></tr>\n";
}
}
if (!$cli) $html .= "</table>\n";
$this->conn->fnExecute = $saveE;
return $html;
}
function Tables($orderby='1')
{
if (!$this->tablesSQL) return false;
$savelog = $this->conn->LogSQL(false);
$rs = $this->conn->Execute($this->tablesSQL.' order by '.$orderby);
$this->conn->LogSQL($savelog);
$html = rs2html($rs,false,false,false,false);
return $html;
}
 
function CreateLogTable()
{
if (!$this->createTableSQL) return false;
$savelog = $this->conn->LogSQL(false);
$ok = $this->conn->Execute($this->createTableSQL);
$this->conn->LogSQL($savelog);
return ($ok) ? true : false;
}
function DoSQLForm()
{
$PHP_SELF = $_SERVER['PHP_SELF'];
$sql = isset($_REQUEST['sql']) ? $_REQUEST['sql'] : '';
 
if (isset($_SESSION['phplens_sqlrows'])) $rows = $_SESSION['phplens_sqlrows'];
else $rows = 3;
if (isset($_REQUEST['SMALLER'])) {
$rows /= 2;
if ($rows < 3) $rows = 3;
$_SESSION['phplens_sqlrows'] = $rows;
}
if (isset($_REQUEST['BIGGER'])) {
$rows *= 2;
$_SESSION['phplens_sqlrows'] = $rows;
}
?>
 
<form method="POST" action="<?php echo $PHP_SELF ?>">
<table><tr>
<td> Form size: <input type="submit" value=" &lt; " name="SMALLER"><input type="submit" value=" &gt; &gt; " name="BIGGER">
</td>
<td align=right>
<input type="submit" value=" Run SQL Below " name="RUN"><input type=hidden name=do value=dosql>
</td></tr>
<tr>
<td colspan=2><textarea rows=<?php print $rows; ?> name="sql" cols="80"><?php print htmlspecialchars($sql) ?></textarea>
</td>
</tr>
</table>
</form>
 
<?php
if (!isset($_REQUEST['sql'])) return;
$sql = $this->undomq(trim($sql));
if (substr($sql,strlen($sql)-1) === ';') {
$print = true;
$sqla = $this->SplitSQL($sql);
} else {
$print = false;
$sqla = array($sql);
}
foreach($sqla as $sqls) {
 
if (!$sqls) continue;
if ($print) {
print "<p>".htmlspecialchars($sqls)."</p>";
flush();
}
$savelog = $this->conn->LogSQL(false);
$rs = $this->conn->Execute($sqls);
$this->conn->LogSQL($savelog);
if ($rs && is_object($rs) && !$rs->EOF) {
rs2html($rs);
while ($rs->NextRecordSet()) {
print "<table width=98% bgcolor=#C0C0FF><tr><td>&nbsp;</td></tr></table>";
rs2html($rs);
}
} else {
$e1 = (integer) $this->conn->ErrorNo();
$e2 = $this->conn->ErrorMsg();
if (($e1) || ($e2)) {
if (empty($e1)) $e1 = '-1'; // postgresql fix
print ' &nbsp; '.$e1.': '.$e2;
} else {
print "<p>No Recordset returned<br></p>";
}
}
} // foreach
}
function SplitSQL($sql)
{
$arr = explode(';',$sql);
return $arr;
}
function undomq($m)
{
if (get_magic_quotes_gpc()) {
// undo the damage
$m = str_replace('\\\\','\\',$m);
$m = str_replace('\"','"',$m);
$m = str_replace('\\\'','\'',$m);
}
return $m;
}
 
/************************************************************************/
/**
* Reorganise multiple table-indices/statistics/..
* OptimizeMode could be given by last Parameter
*
* @example
* <pre>
* optimizeTables( 'tableA');
* </pre>
* <pre>
* optimizeTables( 'tableA', 'tableB', 'tableC');
* </pre>
* <pre>
* optimizeTables( 'tableA', 'tableB', ADODB_OPT_LOW);
* </pre>
*
* @param string table name of the table to optimize
* @param int mode optimization-mode
* <code>ADODB_OPT_HIGH</code> for full optimization
* <code>ADODB_OPT_LOW</code> for CPU-less optimization
* Default is LOW <code>ADODB_OPT_LOW</code>
* @author Markus Staab
* @return Returns <code>true</code> on success and <code>false</code> on error
*/
function OptimizeTables()
{
$args = func_get_args();
$numArgs = func_num_args();
if ( $numArgs == 0) return false;
$mode = ADODB_OPT_LOW;
$lastArg = $args[ $numArgs - 1];
if ( !is_string($lastArg)) {
$mode = $lastArg;
unset( $args[ $numArgs - 1]);
}
foreach( $args as $table) {
$this->optimizeTable( $table, $mode);
}
}
 
/**
* Reorganise the table-indices/statistics/.. depending on the given mode.
* Default Implementation throws an error.
*
* @param string table name of the table to optimize
* @param int mode optimization-mode
* <code>ADODB_OPT_HIGH</code> for full optimization
* <code>ADODB_OPT_LOW</code> for CPU-less optimization
* Default is LOW <code>ADODB_OPT_LOW</code>
* @author Markus Staab
* @return Returns <code>true</code> on success and <code>false</code> on error
*/
function OptimizeTable( $table, $mode = ADODB_OPT_LOW)
{
ADOConnection::outp( sprintf( "<p>%s: '%s' not implemented for driver '%s'</p>", __CLASS__, __FUNCTION__, $this->conn->databaseType));
return false;
}
/**
* Reorganise current database.
* Default implementation loops over all <code>MetaTables()</code> and
* optimize each using <code>optmizeTable()</code>
*
* @author Markus Staab
* @return Returns <code>true</code> on success and <code>false</code> on error
*/
function optimizeDatabase()
{
$conn = $this->conn;
if ( !$conn) return false;
$tables = $conn->MetaTables( 'TABLES');
if ( !$tables ) return false;
 
foreach( $tables as $table) {
if ( !$this->optimizeTable( $table)) {
return false;
}
}
return true;
}
// end hack
}
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-php4.inc.php
0,0 → 1,16
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4.
*/
 
 
class ADODB_BASE_RS {
}
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-time.inc.php
0,0 → 1,1327
<?php
/**
ADOdb Date Library, part of the ADOdb abstraction library
Download: http://phplens.com/phpeverywhere/
 
PHP native date functions use integer timestamps for computations.
Because of this, dates are restricted to the years 1901-2038 on Unix
and 1970-2038 on Windows due to integer overflow for dates beyond
those years. This library overcomes these limitations by replacing the
native function's signed integers (normally 32-bits) with PHP floating
point numbers (normally 64-bits).
 
Dates from 100 A.D. to 3000 A.D. and later
have been tested. The minimum is 100 A.D. as <100 will invoke the
2 => 4 digit year conversion. The maximum is billions of years in the
future, but this is a theoretical limit as the computation of that year
would take too long with the current implementation of adodb_mktime().
 
This library replaces native functions as follows:
 
<pre>
getdate() with adodb_getdate()
date() with adodb_date()
gmdate() with adodb_gmdate()
mktime() with adodb_mktime()
gmmktime() with adodb_gmmktime()
strftime() with adodb_strftime()
strftime() with adodb_gmstrftime()
</pre>
The parameters are identical, except that adodb_date() accepts a subset
of date()'s field formats. Mktime() will convert from local time to GMT,
and date() will convert from GMT to local time, but daylight savings is
not handled currently.
 
This library is independant of the rest of ADOdb, and can be used
as standalone code.
 
PERFORMANCE
 
For high speed, this library uses the native date functions where
possible, and only switches to PHP code when the dates fall outside
the 32-bit signed integer range.
 
GREGORIAN CORRECTION
 
Pope Gregory shortened October of A.D. 1582 by ten days. Thursday,
October 4, 1582 (Julian) was followed immediately by Friday, October 15,
1582 (Gregorian).
 
Since 0.06, we handle this correctly, so:
 
adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582)
== 24 * 3600 (1 day)
 
=============================================================================
 
COPYRIGHT
 
(c) 2003-2005 John Lim and released under BSD-style license except for code by
jackbbs, which includes adodb_mktime, adodb_get_gmt_diff, adodb_is_leap_year
and originally found at http://www.php.net/manual/en/function.mktime.php
 
=============================================================================
 
BUG REPORTS
 
These should be posted to the ADOdb forums at
 
http://phplens.com/lens/lensforum/topics.php?id=4
 
=============================================================================
 
FUNCTION DESCRIPTIONS
 
 
** FUNCTION adodb_getdate($date=false)
 
Returns an array containing date information, as getdate(), but supports
dates greater than 1901 to 2038. The local date/time format is derived from a
heuristic the first time adodb_getdate is called.
** FUNCTION adodb_date($fmt, $timestamp = false)
 
Convert a timestamp to a formatted local date. If $timestamp is not defined, the
current timestamp is used. Unlike the function date(), it supports dates
outside the 1901 to 2038 range.
 
The format fields that adodb_date supports:
 
<pre>
a - "am" or "pm"
A - "AM" or "PM"
d - day of the month, 2 digits with leading zeros; i.e. "01" to "31"
D - day of the week, textual, 3 letters; e.g. "Fri"
F - month, textual, long; e.g. "January"
g - hour, 12-hour format without leading zeros; i.e. "1" to "12"
G - hour, 24-hour format without leading zeros; i.e. "0" to "23"
h - hour, 12-hour format; i.e. "01" to "12"
H - hour, 24-hour format; i.e. "00" to "23"
i - minutes; i.e. "00" to "59"
j - day of the month without leading zeros; i.e. "1" to "31"
l (lowercase 'L') - day of the week, textual, long; e.g. "Friday"
L - boolean for whether it is a leap year; i.e. "0" or "1"
m - month; i.e. "01" to "12"
M - month, textual, 3 letters; e.g. "Jan"
n - month without leading zeros; i.e. "1" to "12"
O - Difference to Greenwich time in hours; e.g. "+0200"
Q - Quarter, as in 1, 2, 3, 4
r - RFC 2822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200"
s - seconds; i.e. "00" to "59"
S - English ordinal suffix for the day of the month, 2 characters;
i.e. "st", "nd", "rd" or "th"
t - number of days in the given month; i.e. "28" to "31"
T - Timezone setting of this machine; e.g. "EST" or "MDT"
U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday)
Y - year, 4 digits; e.g. "1999"
y - year, 2 digits; e.g. "99"
z - day of the year; i.e. "0" to "365"
Z - timezone offset in seconds (i.e. "-43200" to "43200").
The offset for timezones west of UTC is always negative,
and for those east of UTC is always positive.
</pre>
 
Unsupported:
<pre>
B - Swatch Internet time
I (capital i) - "1" if Daylight Savings Time, "0" otherwise.
W - ISO-8601 week number of year, weeks starting on Monday
 
</pre>
 
 
** FUNCTION adodb_date2($fmt, $isoDateString = false)
Same as adodb_date, but 2nd parameter accepts iso date, eg.
 
adodb_date2('d-M-Y H:i','2003-12-25 13:01:34');
 
** FUNCTION adodb_gmdate($fmt, $timestamp = false)
 
Convert a timestamp to a formatted GMT date. If $timestamp is not defined, the
current timestamp is used. Unlike the function date(), it supports dates
outside the 1901 to 2038 range.
 
 
** FUNCTION adodb_mktime($hr, $min, $sec[, $month, $day, $year])
 
Converts a local date to a unix timestamp. Unlike the function mktime(), it supports
dates outside the 1901 to 2038 range. All parameters are optional.
 
 
** FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year])
 
Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports
dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters
are currently compulsory.
 
** FUNCTION adodb_gmstrftime($fmt, $timestamp = false)
Convert a timestamp to a formatted GMT date.
 
** FUNCTION adodb_strftime($fmt, $timestamp = false)
 
Convert a timestamp to a formatted local date. Internally converts $fmt into
adodb_date format, then echo result.
 
For best results, you can define the local date format yourself. Define a global
variable $ADODB_DATE_LOCALE which is an array, 1st element is date format using
adodb_date syntax, and 2nd element is the time format, also in adodb_date syntax.
 
eg. $ADODB_DATE_LOCALE = array('d/m/Y','H:i:s');
Supported format codes:
 
<pre>
%a - abbreviated weekday name according to the current locale
%A - full weekday name according to the current locale
%b - abbreviated month name according to the current locale
%B - full month name according to the current locale
%c - preferred date and time representation for the current locale
%d - day of the month as a decimal number (range 01 to 31)
%D - same as %m/%d/%y
%e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31')
%h - same as %b
%H - hour as a decimal number using a 24-hour clock (range 00 to 23)
%I - hour as a decimal number using a 12-hour clock (range 01 to 12)
%m - month as a decimal number (range 01 to 12)
%M - minute as a decimal number
%n - newline character
%p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale
%r - time in a.m. and p.m. notation
%R - time in 24 hour notation
%S - second as a decimal number
%t - tab character
%T - current time, equal to %H:%M:%S
%x - preferred date representation for the current locale without the time
%X - preferred time representation for the current locale without the date
%y - year as a decimal number without a century (range 00 to 99)
%Y - year as a decimal number including the century
%Z - time zone or name or abbreviation
%% - a literal `%' character
</pre>
 
Unsupported codes:
<pre>
%C - century number (the year divided by 100 and truncated to an integer, range 00 to 99)
%g - like %G, but without the century.
%G - The 4-digit year corresponding to the ISO week number (see %V).
This has the same format and value as %Y, except that if the ISO week number belongs
to the previous or next year, that year is used instead.
%j - day of the year as a decimal number (range 001 to 366)
%u - weekday as a decimal number [1,7], with 1 representing Monday
%U - week number of the current year as a decimal number, starting
with the first Sunday as the first day of the first week
%V - The ISO 8601:1988 week number of the current year as a decimal number,
range 01 to 53, where week 1 is the first week that has at least 4 days in the
current year, and with Monday as the first day of the week. (Use %G or %g for
the year component that corresponds to the week number for the specified timestamp.)
%w - day of the week as a decimal, Sunday being 0
%W - week number of the current year as a decimal number, starting with the
first Monday as the first day of the first week
</pre>
 
=============================================================================
 
NOTES
 
Useful url for generating test timestamps:
http://www.4webhelp.net/us/timestamp.php
 
Possible future optimizations include
 
a. Using an algorithm similar to Plauger's in "The Standard C Library"
(page 428, xttotm.c _Ttotm() function). Plauger's algorithm will not
work outside 32-bit signed range, so i decided not to implement it.
 
b. Implement daylight savings, which looks awfully complicated, see
http://webexhibits.org/daylightsaving/
 
 
CHANGELOG
- 10 Feb 2006 0.23
PHP5 compat: when we detect PHP5, the RFC2822 format for gmt 0000hrs is changed from -0000 to +0000.
In PHP4, we will still use -0000 for 100% compat with PHP4.
 
- 08 Sept 2005 0.22
In adodb_date2(), $is_gmt not supported properly. Fixed.
 
- 18 July 2005 0.21
In PHP 4.3.11, the 'r' format has changed. Leading 0 in day is added. Changed for compat.
Added support for negative months in adodb_mktime().
 
- 24 Feb 2005 0.20
Added limited strftime/gmstrftime support. x10 improvement in performance of adodb_date().
 
- 21 Dec 2004 0.17
In adodb_getdate(), the timestamp was accidentally converted to gmt when $is_gmt is false.
Also adodb_mktime(0,0,0) did not work properly. Both fixed thx Mauro.
 
- 17 Nov 2004 0.16
Removed intval typecast in adodb_mktime() for secs, allowing:
adodb_mktime(0,0,0 + 2236672153,1,1,1934);
Suggested by Ryan.
 
- 18 July 2004 0.15
All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory.
This brings it more in line with mktime (still not identical).
 
- 23 June 2004 0.14
 
Allow you to define your own daylights savings function, adodb_daylight_sv.
If the function is defined (somewhere in an include), then you can correct for daylights savings.
 
In this example, we apply daylights savings in June or July, adding one hour. This is extremely
unrealistic as it does not take into account time-zone, geographic location, current year.
 
function adodb_daylight_sv(&$arr, $is_gmt)
{
if ($is_gmt) return;
$m = $arr['mon'];
if ($m == 6 || $m == 7) $arr['hours'] += 1;
}
 
This is only called by adodb_date() and not by adodb_mktime().
 
The format of $arr is
Array (
[seconds] => 0
[minutes] => 0
[hours] => 0
[mday] => 1 # day of month, eg 1st day of the month
[mon] => 2 # month (eg. Feb)
[year] => 2102
[yday] => 31 # days in current year
[leap] => # true if leap year
[ndays] => 28 # no of days in current month
)
 
- 28 Apr 2004 0.13
Fixed adodb_date to properly support $is_gmt. Thx to Dimitar Angelov.
 
- 20 Mar 2004 0.12
Fixed month calculation error in adodb_date. 2102-June-01 appeared as 2102-May-32.
 
- 26 Oct 2003 0.11
Because of daylight savings problems (some systems apply daylight savings to
January!!!), changed adodb_get_gmt_diff() to ignore daylight savings.
 
- 9 Aug 2003 0.10
Fixed bug with dates after 2038.
See http://phplens.com/lens/lensforum/msgs.php?id=6980
 
- 1 July 2003 0.09
Added support for Q (Quarter).
Added adodb_date2(), which accepts ISO date in 2nd param
 
- 3 March 2003 0.08
Added support for 'S' adodb_date() format char. Added constant ADODB_ALLOW_NEGATIVE_TS
if you want PHP to handle negative timestamps between 1901 to 1969.
 
- 27 Feb 2003 0.07
All negative numbers handled by adodb now because of RH 7.3+ problems.
See http://bugs.php.net/bug.php?id=20048&edit=2
 
- 4 Feb 2003 0.06
Fixed a typo, 1852 changed to 1582! This means that pre-1852 dates
are now correctly handled.
 
- 29 Jan 2003 0.05
 
Leap year checking differs under Julian calendar (pre 1582). Also
leap year code optimized by checking for most common case first.
 
We also handle month overflow correctly in mktime (eg month set to 13).
 
Day overflow for less than one month's days is supported.
 
- 28 Jan 2003 0.04
 
Gregorian correction handled. In PHP5, we might throw an error if
mktime uses invalid dates around 5-14 Oct 1582. Released with ADOdb 3.10.
Added limbo 5-14 Oct 1582 check, when we set to 15 Oct 1582.
 
- 27 Jan 2003 0.03
 
Fixed some more month problems due to gmt issues. Added constant ADODB_DATE_VERSION.
Fixed calculation of days since start of year for <1970.
 
- 27 Jan 2003 0.02
 
Changed _adodb_getdate() to inline leap year checking for better performance.
Fixed problem with time-zones west of GMT +0000.
 
- 24 Jan 2003 0.01
 
First implementation.
*/
 
 
/* Initialization */
 
/*
Version Number
*/
define('ADODB_DATE_VERSION',0.23);
 
/*
This code was originally for windows. But apparently this problem happens
also with Linux, RH 7.3 and later!
glibc-2.2.5-34 and greater has been changed to return -1 for dates <
1970. This used to work. The problem exists with RedHat 7.3 and 8.0
echo (mktime(0, 0, 0, 1, 1, 1960)); // prints -1
References:
http://bugs.php.net/bug.php?id=20048&edit=2
http://lists.debian.org/debian-glibc/2002/debian-glibc-200205/msg00010.html
*/
 
if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1);
 
function adodb_date_test_date($y1,$m,$d=13)
{
$t = adodb_mktime(0,0,0,$m,$d,$y1);
$rez = adodb_date('Y-n-j H:i:s',$t);
if ("$y1-$m-$d 00:00:00" != $rez) {
print "<b>$y1 error, expected=$y1-$m-$d 00:00:00, adodb=$rez</b><br>";
return false;
}
return true;
}
 
function adodb_date_test_strftime($fmt)
{
$s1 = strftime($fmt);
$s2 = adodb_strftime($fmt);
if ($s1 == $s2) return true;
echo "error for $fmt, strftime=$s1, $adodb=$s2<br>";
return false;
}
 
/**
Test Suite
*/
function adodb_date_test()
{
error_reporting(E_ALL);
print "<h4>Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.' PHP='.PHP_VERSION."</h4>";
@set_time_limit(0);
$fail = false;
// This flag disables calling of PHP native functions, so we can properly test the code
if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1);
adodb_date_test_strftime('%Y %m %x %X');
adodb_date_test_strftime("%A %d %B %Y");
adodb_date_test_strftime("%H %M S");
$t = adodb_mktime(0,0,0);
if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).'<br>';
$t = adodb_mktime(0,0,0,6,1,2102);
if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>';
$t = adodb_mktime(0,0,0,2,1,2102);
if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>';
print "<p>Testing gregorian <=> julian conversion<p>";
$t = adodb_mktime(0,0,0,10,11,1492);
//http://www.holidayorigins.com/html/columbus_day.html - Friday check
if (!(adodb_date('D Y-m-d',$t) == 'Fri 1492-10-11')) print 'Error in Columbus landing<br>';
$t = adodb_mktime(0,0,0,2,29,1500);
if (!(adodb_date('Y-m-d',$t) == '1500-02-29')) print 'Error in julian leap years<br>';
$t = adodb_mktime(0,0,0,2,29,1700);
if (!(adodb_date('Y-m-d',$t) == '1700-03-01')) print 'Error in gregorian leap years<br>';
print adodb_mktime(0,0,0,10,4,1582).' ';
print adodb_mktime(0,0,0,10,15,1582);
$diff = (adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582));
if ($diff != 3600*24) print " <b>Error in gregorian correction = ".($diff/3600/24)." days </b><br>";
print " 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ? 'Fri' : '<b>Error</b>')."<br>";
print " 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ? 'Thu' : '<b>Error</b>')."<br>";
print "<p>Testing overflow<p>";
$t = adodb_mktime(0,0,0,3,33,1965);
if (!(adodb_date('Y-m-d',$t) == '1965-04-02')) print 'Error in day overflow 1 <br>';
$t = adodb_mktime(0,0,0,4,33,1971);
if (!(adodb_date('Y-m-d',$t) == '1971-05-03')) print 'Error in day overflow 2 <br>';
$t = adodb_mktime(0,0,0,1,60,1965);
if (!(adodb_date('Y-m-d',$t) == '1965-03-01')) print 'Error in day overflow 3 '.adodb_date('Y-m-d',$t).' <br>';
$t = adodb_mktime(0,0,0,12,32,1965);
if (!(adodb_date('Y-m-d',$t) == '1966-01-01')) print 'Error in day overflow 4 '.adodb_date('Y-m-d',$t).' <br>';
$t = adodb_mktime(0,0,0,12,63,1965);
if (!(adodb_date('Y-m-d',$t) == '1966-02-01')) print 'Error in day overflow 5 '.adodb_date('Y-m-d',$t).' <br>';
$t = adodb_mktime(0,0,0,13,3,1965);
if (!(adodb_date('Y-m-d',$t) == '1966-01-03')) print 'Error in mth overflow 1 <br>';
print "Testing 2-digit => 4-digit year conversion<p>";
if (adodb_year_digit_check(00) != 2000) print "Err 2-digit 2000<br>";
if (adodb_year_digit_check(10) != 2010) print "Err 2-digit 2010<br>";
if (adodb_year_digit_check(20) != 2020) print "Err 2-digit 2020<br>";
if (adodb_year_digit_check(30) != 2030) print "Err 2-digit 2030<br>";
if (adodb_year_digit_check(40) != 1940) print "Err 2-digit 1940<br>";
if (adodb_year_digit_check(50) != 1950) print "Err 2-digit 1950<br>";
if (adodb_year_digit_check(90) != 1990) print "Err 2-digit 1990<br>";
// Test string formating
print "<p>Testing date formating</p>";
$fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003';
$s1 = date($fmt,0);
$s2 = adodb_date($fmt,0);
if ($s1 != $s2) {
print " date() 0 failed<br>$s1<br>$s2<br>";
}
flush();
for ($i=100; --$i > 0; ) {
 
$ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000);
$s1 = date($fmt,$ts);
$s2 = adodb_date($fmt,$ts);
//print "$s1 <br>$s2 <p>";
$pos = strcmp($s1,$s2);
 
if (($s1) != ($s2)) {
for ($j=0,$k=strlen($s1); $j < $k; $j++) {
if ($s1[$j] != $s2[$j]) {
print substr($s1,$j).' ';
break;
}
}
print "<b>Error date(): $ts<br><pre>
&nbsp; \"$s1\" (date len=".strlen($s1).")
&nbsp; \"$s2\" (adodb_date len=".strlen($s2).")</b></pre><br>";
$fail = true;
}
$a1 = getdate($ts);
$a2 = adodb_getdate($ts);
$rez = array_diff($a1,$a2);
if (sizeof($rez)>0) {
print "<b>Error getdate() $ts</b><br>";
print_r($a1);
print "<br>";
print_r($a2);
print "<p>";
$fail = true;
}
}
// Test generation of dates outside 1901-2038
print "<p>Testing random dates between 100 and 4000</p>";
adodb_date_test_date(100,1);
for ($i=100; --$i >= 0;) {
$y1 = 100+rand(0,1970-100);
$m = rand(1,12);
adodb_date_test_date($y1,$m);
$y1 = 3000-rand(0,3000-1970);
adodb_date_test_date($y1,$m);
}
print '<p>';
$start = 1960+rand(0,10);
$yrs = 12;
$i = 365.25*86400*($start-1970);
$offset = 36000+rand(10000,60000);
$max = 365*$yrs*86400;
$lastyear = 0;
// we generate a timestamp, convert it to a date, and convert it back to a timestamp
// and check if the roundtrip broke the original timestamp value.
print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: ";
$cnt = 0;
for ($max += $i; $i < $max; $i += $offset) {
$ret = adodb_date('m,d,Y,H,i,s',$i);
$arr = explode(',',$ret);
if ($lastyear != $arr[2]) {
$lastyear = $arr[2];
print " $lastyear ";
flush();
}
$newi = adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]);
if ($i != $newi) {
print "Error at $i, adodb_mktime returned $newi ($ret)";
$fail = true;
break;
}
$cnt += 1;
}
echo "Tested $cnt dates<br>";
if (!$fail) print "<p>Passed !</p>";
else print "<p><b>Failed</b> :-(</p>";
}
 
/**
Returns day of week, 0 = Sunday,... 6=Saturday.
Algorithm from PEAR::Date_Calc
*/
function adodb_dow($year, $month, $day)
{
/*
Pope Gregory removed 10 days - October 5 to October 14 - from the year 1582 and
proclaimed that from that time onwards 3 days would be dropped from the calendar
every 400 years.
 
Thursday, October 4, 1582 (Julian) was followed immediately by Friday, October 15, 1582 (Gregorian).
*/
if ($year <= 1582) {
if ($year < 1582 ||
($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3;
else
$greg_correction = 0;
} else
$greg_correction = 0;
if($month > 2)
$month -= 2;
else {
$month += 10;
$year--;
}
$day = floor((13 * $month - 1) / 5) +
$day + ($year % 100) +
floor(($year % 100) / 4) +
floor(($year / 100) / 4) - 2 *
floor($year / 100) + 77 + $greg_correction;
return $day - 7 * floor($day / 7);
}
 
 
/**
Checks for leap year, returns true if it is. No 2-digit year check. Also
handles julian calendar correctly.
*/
function _adodb_is_leap_year($year)
{
if ($year % 4 != 0) return false;
if ($year % 400 == 0) {
return true;
// if gregorian calendar (>1582), century not-divisible by 400 is not leap
} else if ($year > 1582 && $year % 100 == 0 ) {
return false;
}
return true;
}
 
 
/**
checks for leap year, returns true if it is. Has 2-digit year check
*/
function adodb_is_leap_year($year)
{
return _adodb_is_leap_year(adodb_year_digit_check($year));
}
 
/**
Fix 2-digit years. Works for any century.
Assumes that if 2-digit is more than 30 years in future, then previous century.
*/
function adodb_year_digit_check($y)
{
if ($y < 100) {
$yr = (integer) date("Y");
$century = (integer) ($yr /100);
if ($yr%100 > 50) {
$c1 = $century + 1;
$c0 = $century;
} else {
$c1 = $century;
$c0 = $century - 1;
}
$c1 *= 100;
// if 2-digit year is less than 30 years in future, set it to this century
// otherwise if more than 30 years in future, then we set 2-digit year to the prev century.
if (($y + $c1) < $yr+30) $y = $y + $c1;
else $y = $y + $c0*100;
}
return $y;
}
 
/**
get local time zone offset from GMT
*/
function adodb_get_gmt_diff()
{
static $TZ;
if (isset($TZ)) return $TZ;
$TZ = mktime(0,0,0,1,2,1970,0) - gmmktime(0,0,0,1,2,1970,0);
return $TZ;
}
 
/**
Returns an array with date info.
*/
function adodb_getdate($d=false,$fast=false)
{
if ($d === false) return getdate();
if (!defined('ADODB_TEST_DATES')) {
if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer
return @getdate($d);
}
}
return _adodb_getdate($d);
}
 
/*
// generate $YRS table for _adodb_getdate()
function adodb_date_gentable($out=true)
{
 
for ($i=1970; $i >= 1600; $i-=10) {
$s = adodb_gmmktime(0,0,0,1,1,$i);
echo "$i => $s,<br>";
}
}
adodb_date_gentable();
 
for ($i=1970; $i > 1500; $i--) {
 
echo "<hr />$i ";
adodb_date_test_date($i,1,1);
}
 
*/
 
 
$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
function adodb_validdate($y,$m,$d)
{
global $_month_table_normal,$_month_table_leaf;
 
if (_adodb_is_leap_year($y)) $marr =& $_month_table_leaf;
else $marr =& $_month_table_normal;
if ($m > 12 || $m < 1) return false;
if ($d > 31 || $d < 1) return false;
if ($marr[$m] < $d) return false;
if ($y < 1000 && $y > 3000) return false;
return true;
}
 
/**
Low-level function that returns the getdate() array. We have a special
$fast flag, which if set to true, will return fewer array values,
and is much faster as it does not calculate dow, etc.
*/
function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)
{
static $YRS;
global $_month_table_normal,$_month_table_leaf;
 
$d = $origd - ($is_gmt ? 0 : adodb_get_gmt_diff());
$_day_power = 86400;
$_hour_power = 3600;
$_min_power = 60;
if ($d < -12219321600) $d -= 86400*10; // if 15 Oct 1582 or earlier, gregorian correction
$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
$d366 = $_day_power * 366;
$d365 = $_day_power * 365;
if ($d < 0) {
if (empty($YRS)) $YRS = array(
1970 => 0,
1960 => -315619200,
1950 => -631152000,
1940 => -946771200,
1930 => -1262304000,
1920 => -1577923200,
1910 => -1893456000,
1900 => -2208988800,
1890 => -2524521600,
1880 => -2840140800,
1870 => -3155673600,
1860 => -3471292800,
1850 => -3786825600,
1840 => -4102444800,
1830 => -4417977600,
1820 => -4733596800,
1810 => -5049129600,
1800 => -5364662400,
1790 => -5680195200,
1780 => -5995814400,
1770 => -6311347200,
1760 => -6626966400,
1750 => -6942499200,
1740 => -7258118400,
1730 => -7573651200,
1720 => -7889270400,
1710 => -8204803200,
1700 => -8520336000,
1690 => -8835868800,
1680 => -9151488000,
1670 => -9467020800,
1660 => -9782640000,
1650 => -10098172800,
1640 => -10413792000,
1630 => -10729324800,
1620 => -11044944000,
1610 => -11360476800,
1600 => -11676096000);
 
if ($is_gmt) $origd = $d;
// The valid range of a 32bit signed timestamp is typically from
// Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT
//
# old algorithm iterates through all years. new algorithm does it in
# 10 year blocks
/*
# old algo
for ($a = 1970 ; --$a >= 0;) {
$lastd = $d;
if ($leaf = _adodb_is_leap_year($a)) $d += $d366;
else $d += $d365;
if ($d >= 0) {
$year = $a;
break;
}
}
*/
$lastsecs = 0;
$lastyear = 1970;
foreach($YRS as $year => $secs) {
if ($d >= $secs) {
$a = $lastyear;
break;
}
$lastsecs = $secs;
$lastyear = $year;
}
$d -= $lastsecs;
if (!isset($a)) $a = $lastyear;
//echo ' yr=',$a,' ', $d,'.';
for (; --$a >= 0;) {
$lastd = $d;
if ($leaf = _adodb_is_leap_year($a)) $d += $d366;
else $d += $d365;
if ($d >= 0) {
$year = $a;
break;
}
}
/**/
$secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd;
$d = $lastd;
$mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
for ($a = 13 ; --$a > 0;) {
$lastd = $d;
$d += $mtab[$a] * $_day_power;
if ($d >= 0) {
$month = $a;
$ndays = $mtab[$a];
break;
}
}
$d = $lastd;
$day = $ndays + ceil(($d+1) / ($_day_power));
 
$d += ($ndays - $day+1)* $_day_power;
$hour = floor($d/$_hour_power);
} else {
for ($a = 1970 ;; $a++) {
$lastd = $d;
if ($leaf = _adodb_is_leap_year($a)) $d -= $d366;
else $d -= $d365;
if ($d < 0) {
$year = $a;
break;
}
}
$secsInYear = $lastd;
$d = $lastd;
$mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
for ($a = 1 ; $a <= 12; $a++) {
$lastd = $d;
$d -= $mtab[$a] * $_day_power;
if ($d < 0) {
$month = $a;
$ndays = $mtab[$a];
break;
}
}
$d = $lastd;
$day = ceil(($d+1) / $_day_power);
$d = $d - ($day-1) * $_day_power;
$hour = floor($d /$_hour_power);
}
$d -= $hour * $_hour_power;
$min = floor($d/$_min_power);
$secs = $d - $min * $_min_power;
if ($fast) {
return array(
'seconds' => $secs,
'minutes' => $min,
'hours' => $hour,
'mday' => $day,
'mon' => $month,
'year' => $year,
'yday' => floor($secsInYear/$_day_power),
'leap' => $leaf,
'ndays' => $ndays
);
}
$dow = adodb_dow($year,$month,$day);
 
return array(
'seconds' => $secs,
'minutes' => $min,
'hours' => $hour,
'mday' => $day,
'wday' => $dow,
'mon' => $month,
'year' => $year,
'yday' => floor($secsInYear/$_day_power),
'weekday' => gmdate('l',$_day_power*(3+$dow)),
'month' => gmdate('F',mktime(0,0,0,$month,2,1971)),
0 => $origd
);
}
 
function adodb_gmdate($fmt,$d=false)
{
return adodb_date($fmt,$d,true);
}
 
// accepts unix timestamp and iso date format in $d
function adodb_date2($fmt, $d=false, $is_gmt=false)
{
if ($d !== false) {
if (!preg_match(
"|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
($d), $rr)) return adodb_date($fmt,false,$is_gmt);
 
if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt);
// h-m-s-MM-DD-YY
if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],false,$is_gmt);
else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],false,$is_gmt);
}
return adodb_date($fmt,$d,$is_gmt);
}
 
 
/**
Return formatted date based on timestamp $d
*/
function adodb_date($fmt,$d=false,$is_gmt=false)
{
static $daylight;
 
if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt);
if (!defined('ADODB_TEST_DATES')) {
if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer
return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d);
 
}
}
$_day_power = 86400;
$arr = _adodb_getdate($d,true,$is_gmt);
if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv');
if ($daylight) adodb_daylight_sv($arr, $is_gmt);
$year = $arr['year'];
$month = $arr['mon'];
$day = $arr['mday'];
$hour = $arr['hours'];
$min = $arr['minutes'];
$secs = $arr['seconds'];
$max = strlen($fmt);
$dates = '';
$isphp5 = PHP_VERSION >= 5;
/*
at this point, we have the following integer vars to manipulate:
$year, $month, $day, $hour, $min, $secs
*/
for ($i=0; $i < $max; $i++) {
switch($fmt[$i]) {
case 'T': $dates .= date('T');break;
// YEAR
case 'L': $dates .= $arr['leap'] ? '1' : '0'; break;
case 'r': // Thu, 21 Dec 2000 16:01:07 +0200
// 4.3.11 uses '04 Jun 2004'
// 4.3.8 uses ' 4 Jun 2004'
$dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', '
. ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' ';
if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour;
if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min;
if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs;
$gmt = adodb_get_gmt_diff();
if ($isphp5)
$dates .= sprintf(' %s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
else
$dates .= sprintf(' %s%04d',($gmt<0)?'+':'-',abs($gmt)/36);
break;
case 'Y': $dates .= $year; break;
case 'y': $dates .= substr($year,strlen($year)-2,2); break;
// MONTH
case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break;
case 'Q': $dates .= ($month+3)>>2; break;
case 'n': $dates .= $month; break;
case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break;
case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break;
// DAY
case 't': $dates .= $arr['ndays']; break;
case 'z': $dates .= $arr['yday']; break;
case 'w': $dates .= adodb_dow($year,$month,$day); break;
case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break;
case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break;
case 'j': $dates .= $day; break;
case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break;
case 'S':
$d10 = $day % 10;
if ($d10 == 1) $dates .= 'st';
else if ($d10 == 2 && $day != 12) $dates .= 'nd';
else if ($d10 == 3) $dates .= 'rd';
else $dates .= 'th';
break;
// HOUR
case 'Z':
$dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff(); break;
case 'O':
$gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff();
if ($isphp5)
$dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
else
$dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36);
break;
case 'H':
if ($hour < 10) $dates .= '0'.$hour;
else $dates .= $hour;
break;
case 'h':
if ($hour > 12) $hh = $hour - 12;
else {
if ($hour == 0) $hh = '12';
else $hh = $hour;
}
if ($hh < 10) $dates .= '0'.$hh;
else $dates .= $hh;
break;
case 'G':
$dates .= $hour;
break;
case 'g':
if ($hour > 12) $hh = $hour - 12;
else {
if ($hour == 0) $hh = '12';
else $hh = $hour;
}
$dates .= $hh;
break;
// MINUTES
case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break;
// SECONDS
case 'U': $dates .= $d; break;
case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break;
// AM/PM
// Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM
case 'a':
if ($hour>=12) $dates .= 'pm';
else $dates .= 'am';
break;
case 'A':
if ($hour>=12) $dates .= 'PM';
else $dates .= 'AM';
break;
default:
$dates .= $fmt[$i]; break;
// ESCAPE
case "\\":
$i++;
if ($i < $max) $dates .= $fmt[$i];
break;
}
}
return $dates;
}
 
/**
Returns a timestamp given a GMT/UTC time.
Note that $is_dst is not implemented and is ignored.
*/
function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false)
{
return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true);
}
 
/**
Return a timestamp given a local time. Originally by jackbbs.
Note that $is_dst is not implemented and is ignored.
Not a very fast algorithm - O(n) operation. Could be optimized to O(1).
*/
function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false)
{
if (!defined('ADODB_TEST_DATES')) {
 
if ($mon === false) {
return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec);
}
// for windows, we don't check 1970 because with timezone differences,
// 1 Jan 1970 could generate negative timestamp, which is illegal
if (1971 < $year && $year < 2038
|| !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038)
) {
return $is_gmt ?
@gmmktime($hr,$min,$sec,$mon,$day,$year):
@mktime($hr,$min,$sec,$mon,$day,$year);
}
}
$gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff();
 
/*
# disabled because some people place large values in $sec.
# however we need it for $mon because we use an array...
$hr = intval($hr);
$min = intval($min);
$sec = intval($sec);
*/
$mon = intval($mon);
$day = intval($day);
$year = intval($year);
$year = adodb_year_digit_check($year);
 
if ($mon > 12) {
$y = floor($mon / 12);
$year += $y;
$mon -= $y*12;
} else if ($mon < 1) {
$y = ceil((1-$mon) / 12);
$year -= $y;
$mon += $y*12;
}
$_day_power = 86400;
$_hour_power = 3600;
$_min_power = 60;
$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
$_total_date = 0;
if ($year >= 1970) {
for ($a = 1970 ; $a <= $year; $a++) {
$leaf = _adodb_is_leap_year($a);
if ($leaf == true) {
$loop_table = $_month_table_leaf;
$_add_date = 366;
} else {
$loop_table = $_month_table_normal;
$_add_date = 365;
}
if ($a < $year) {
$_total_date += $_add_date;
} else {
for($b=1;$b<$mon;$b++) {
$_total_date += $loop_table[$b];
}
}
}
$_total_date +=$day-1;
$ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different;
} else {
for ($a = 1969 ; $a >= $year; $a--) {
$leaf = _adodb_is_leap_year($a);
if ($leaf == true) {
$loop_table = $_month_table_leaf;
$_add_date = 366;
} else {
$loop_table = $_month_table_normal;
$_add_date = 365;
}
if ($a > $year) { $_total_date += $_add_date;
} else {
for($b=12;$b>$mon;$b--) {
$_total_date += $loop_table[$b];
}
}
}
$_total_date += $loop_table[$mon] - $day;
$_day_time = $hr * $_hour_power + $min * $_min_power + $sec;
$_day_time = $_day_power - $_day_time;
$ret = -( $_total_date * $_day_power + $_day_time - $gmt_different);
if ($ret < -12220185600) $ret += 10*86400; // if earlier than 5 Oct 1582 - gregorian correction
else if ($ret < -12219321600) $ret = -12219321600; // if in limbo, reset to 15 Oct 1582.
}
//print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret;
return $ret;
}
 
function adodb_gmstrftime($fmt, $ts=false)
{
return adodb_strftime($fmt,$ts,true);
}
 
// hack - convert to adodb_date
function adodb_strftime($fmt, $ts=false,$is_gmt=false)
{
global $ADODB_DATE_LOCALE;
 
if (!defined('ADODB_TEST_DATES')) {
if ((abs($ts) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
if (!defined('ADODB_NO_NEGATIVE_TS') || $ts >= 0) // if windows, must be +ve integer
return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts);
 
}
}
if (empty($ADODB_DATE_LOCALE)) {
$tstr = strtoupper(gmstrftime('%c',31366800)); // 30 Dec 1970, 1 am
$sep = substr($tstr,2,1);
$hasAM = strrpos($tstr,'M') !== false;
$ADODB_DATE_LOCALE = array();
$ADODB_DATE_LOCALE[] = strncmp($tstr,'30',2) == 0 ? 'd'.$sep.'m'.$sep.'y' : 'm'.$sep.'d'.$sep.'y';
$ADODB_DATE_LOCALE[] = ($hasAM) ? 'h:i:s a' : 'H:i:s';
}
$inpct = false;
$fmtdate = '';
for ($i=0,$max = strlen($fmt); $i < $max; $i++) {
$ch = $fmt[$i];
if ($ch == '%') {
if ($inpct) {
$fmtdate .= '%';
$inpct = false;
} else
$inpct = true;
} else if ($inpct) {
$inpct = false;
switch($ch) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'E':
case 'O':
/* ignore format modifiers */
$inpct = true;
break;
case 'a': $fmtdate .= 'D'; break;
case 'A': $fmtdate .= 'l'; break;
case 'h':
case 'b': $fmtdate .= 'M'; break;
case 'B': $fmtdate .= 'F'; break;
case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1]; break;
case 'C': $fmtdate .= '\C?'; break; // century
case 'd': $fmtdate .= 'd'; break;
case 'D': $fmtdate .= 'm/d/y'; break;
case 'e': $fmtdate .= 'j'; break;
case 'g': $fmtdate .= '\g?'; break; //?
case 'G': $fmtdate .= '\G?'; break; //?
case 'H': $fmtdate .= 'H'; break;
case 'I': $fmtdate .= 'h'; break;
case 'j': $fmtdate .= '?z'; $parsej = true; break; // wrong as j=1-based, z=0-basd
case 'm': $fmtdate .= 'm'; break;
case 'M': $fmtdate .= 'i'; break;
case 'n': $fmtdate .= "\n"; break;
case 'p': $fmtdate .= 'a'; break;
case 'r': $fmtdate .= 'h:i:s a'; break;
case 'R': $fmtdate .= 'H:i:s'; break;
case 'S': $fmtdate .= 's'; break;
case 't': $fmtdate .= "\t"; break;
case 'T': $fmtdate .= 'H:i:s'; break;
case 'u': $fmtdate .= '?u'; $parseu = true; break; // wrong strftime=1-based, date=0-based
case 'U': $fmtdate .= '?U'; $parseU = true; break;// wrong strftime=1-based, date=0-based
case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0]; break;
case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1]; break;
case 'w': $fmtdate .= '?w'; $parseu = true; break; // wrong strftime=1-based, date=0-based
case 'W': $fmtdate .= '?W'; $parseU = true; break;// wrong strftime=1-based, date=0-based
case 'y': $fmtdate .= 'y'; break;
case 'Y': $fmtdate .= 'Y'; break;
case 'Z': $fmtdate .= 'T'; break;
}
} else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' ))
$fmtdate .= "\\".$ch;
else
$fmtdate .= $ch;
}
//echo "fmt=",$fmtdate,"<br>";
if ($ts === false) $ts = time();
$ret = adodb_date($fmtdate, $ts, $is_gmt);
return $ret;
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/adodb-xmlschema.inc.php
0,0 → 1,2221
<?php
// Copyright (c) 2004 ars Cognita Inc., all rights reserved
/* ******************************************************************************
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
*******************************************************************************/
/**
* xmlschema is a class that allows the user to quickly and easily
* build a database on any ADOdb-supported platform using a simple
* XML schema.
*
* Last Editor: $Author: jlim $
* @author Richard Tango-Lowy & Dan Cech
* @version $Revision: 1.12 $
*
* @package axmls
* @tutorial getting_started.pkg
*/
function _file_get_contents($file)
{
if (function_exists('file_get_contents')) return file_get_contents($file);
$f = fopen($file,'r');
if (!$f) return '';
$t = '';
while ($s = fread($f,100000)) $t .= $s;
fclose($f);
return $t;
}
 
 
/**
* Debug on or off
*/
if( !defined( 'XMLS_DEBUG' ) ) {
define( 'XMLS_DEBUG', FALSE );
}
 
/**
* Default prefix key
*/
if( !defined( 'XMLS_PREFIX' ) ) {
define( 'XMLS_PREFIX', '%%P' );
}
 
/**
* Maximum length allowed for object prefix
*/
if( !defined( 'XMLS_PREFIX_MAXLEN' ) ) {
define( 'XMLS_PREFIX_MAXLEN', 10 );
}
 
/**
* Execute SQL inline as it is generated
*/
if( !defined( 'XMLS_EXECUTE_INLINE' ) ) {
define( 'XMLS_EXECUTE_INLINE', FALSE );
}
 
/**
* Continue SQL Execution if an error occurs?
*/
if( !defined( 'XMLS_CONTINUE_ON_ERROR' ) ) {
define( 'XMLS_CONTINUE_ON_ERROR', FALSE );
}
 
/**
* Current Schema Version
*/
if( !defined( 'XMLS_SCHEMA_VERSION' ) ) {
define( 'XMLS_SCHEMA_VERSION', '0.2' );
}
 
/**
* Default Schema Version. Used for Schemas without an explicit version set.
*/
if( !defined( 'XMLS_DEFAULT_SCHEMA_VERSION' ) ) {
define( 'XMLS_DEFAULT_SCHEMA_VERSION', '0.1' );
}
 
/**
* Default Schema Version. Used for Schemas without an explicit version set.
*/
if( !defined( 'XMLS_DEFAULT_UPGRADE_METHOD' ) ) {
define( 'XMLS_DEFAULT_UPGRADE_METHOD', 'ALTER' );
}
 
/**
* Include the main ADODB library
*/
if( !defined( '_ADODB_LAYER' ) ) {
require( 'adodb.inc.php' );
require( 'adodb-datadict.inc.php' );
}
 
/**
* Abstract DB Object. This class provides basic methods for database objects, such
* as tables and indexes.
*
* @package axmls
* @access private
*/
class dbObject {
/**
* var object Parent
*/
var $parent;
/**
* var string current element
*/
var $currentElement;
/**
* NOP
*/
function dbObject( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
}
/**
* XML Callback to process start elements
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
}
/**
* XML Callback to process CDATA elements
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
}
function create() {
return array();
}
/**
* Destroys the object
*/
function destroy() {
unset( $this );
}
/**
* Checks whether the specified RDBMS is supported by the current
* database object or its ranking ancestor.
*
* @param string $platform RDBMS platform name (from ADODB platform list).
* @return boolean TRUE if RDBMS is supported; otherwise returns FALSE.
*/
function supportedPlatform( $platform = NULL ) {
return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE;
}
/**
* Returns the prefix set by the ranking ancestor of the database object.
*
* @param string $name Prefix string.
* @return string Prefix.
*/
function prefix( $name = '' ) {
return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name;
}
/**
* Extracts a field ID from the specified field.
*
* @param string $field Field.
* @return string Field ID.
*/
function FieldID( $field ) {
return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) );
}
}
 
/**
* Creates a table object in ADOdb's datadict format
*
* This class stores information about a database table. As charactaristics
* of the table are loaded from the external source, methods and properties
* of this class are used to build up the table description in ADOdb's
* datadict format.
*
* @package axmls
* @access private
*/
class dbTable extends dbObject {
/**
* @var string Table name
*/
var $name;
/**
* @var array Field specifier: Meta-information about each field
*/
var $fields = array();
/**
* @var array List of table indexes.
*/
var $indexes = array();
/**
* @var array Table options: Table-level options
*/
var $opts = array();
/**
* @var string Field index: Keeps track of which field is currently being processed
*/
var $current_field;
/**
* @var boolean Mark table for destruction
* @access private
*/
var $drop_table;
/**
* @var boolean Mark field for destruction (not yet implemented)
* @access private
*/
var $drop_field = array();
/**
* Iniitializes a new table object.
*
* @param string $prefix DB Object prefix
* @param array $attributes Array of table attributes.
*/
function dbTable( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
$this->name = $this->prefix($attributes['NAME']);
}
/**
* XML Callback to process start elements. Elements currently
* processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT.
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'INDEX':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
xml_set_object( $parser, $this->addIndex( $attributes ) );
}
break;
case 'DATA':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
xml_set_object( $parser, $this->addData( $attributes ) );
}
break;
case 'DROP':
$this->drop();
break;
case 'FIELD':
// Add a field
$fieldName = $attributes['NAME'];
$fieldType = $attributes['TYPE'];
$fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL;
$fieldOpts = isset( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL;
$this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts );
break;
case 'KEY':
case 'NOTNULL':
case 'AUTOINCREMENT':
// Add a field option
$this->addFieldOpt( $this->current_field, $this->currentElement );
break;
case 'DEFAULT':
// Add a field option to the table object
// Work around ADOdb datadict issue that misinterprets empty strings.
if( $attributes['VALUE'] == '' ) {
$attributes['VALUE'] = " '' ";
}
$this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] );
break;
case 'DEFDATE':
case 'DEFTIMESTAMP':
// Add a field option to the table object
$this->addFieldOpt( $this->current_field, $this->currentElement );
break;
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Table constraint
case 'CONSTRAINT':
if( isset( $this->current_field ) ) {
$this->addFieldOpt( $this->current_field, $this->currentElement, $cdata );
} else {
$this->addTableOpt( $cdata );
}
break;
// Table option
case 'OPT':
$this->addTableOpt( $cdata );
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'TABLE':
$this->parent->addSQL( $this->create( $this->parent ) );
xml_set_object( $parser, $this->parent );
$this->destroy();
break;
case 'FIELD':
unset($this->current_field);
break;
 
}
}
/**
* Adds an index to a table object
*
* @param array $attributes Index attributes
* @return object dbIndex object
*/
function &addIndex( $attributes ) {
$name = strtoupper( $attributes['NAME'] );
$this->indexes[$name] =& new dbIndex( $this, $attributes );
return $this->indexes[$name];
}
/**
* Adds data to a table object
*
* @param array $attributes Data attributes
* @return object dbData object
*/
function &addData( $attributes ) {
if( !isset( $this->data ) ) {
$this->data =& new dbData( $this, $attributes );
}
return $this->data;
}
/**
* Adds a field to a table object
*
* $name is the name of the table to which the field should be added.
* $type is an ADODB datadict field type. The following field types
* are supported as of ADODB 3.40:
* - C: varchar
* - X: CLOB (character large object) or largest varchar size
* if CLOB is not supported
* - C2: Multibyte varchar
* - X2: Multibyte CLOB
* - B: BLOB (binary large object)
* - D: Date (some databases do not support this, and we return a datetime type)
* - T: Datetime or Timestamp
* - L: Integer field suitable for storing booleans (0 or 1)
* - I: Integer (mapped to I4)
* - I1: 1-byte integer
* - I2: 2-byte integer
* - I4: 4-byte integer
* - I8: 8-byte integer
* - F: Floating point number
* - N: Numeric or decimal number
*
* @param string $name Name of the table to which the field will be added.
* @param string $type ADODB datadict field type.
* @param string $size Field size
* @param array $opts Field options array
* @return array Field specifier array
*/
function addField( $name, $type, $size = NULL, $opts = NULL ) {
$field_id = $this->FieldID( $name );
// Set the field index so we know where we are
$this->current_field = $field_id;
// Set the field name (required)
$this->fields[$field_id]['NAME'] = $name;
// Set the field type (required)
$this->fields[$field_id]['TYPE'] = $type;
// Set the field size (optional)
if( isset( $size ) ) {
$this->fields[$field_id]['SIZE'] = $size;
}
// Set the field options
if( isset( $opts ) ) {
$this->fields[$field_id]['OPTS'][] = $opts;
}
}
/**
* Adds a field option to the current field specifier
*
* This method adds a field option allowed by the ADOdb datadict
* and appends it to the given field.
*
* @param string $field Field name
* @param string $opt ADOdb field option
* @param mixed $value Field option value
* @return array Field specifier array
*/
function addFieldOpt( $field, $opt, $value = NULL ) {
if( !isset( $value ) ) {
$this->fields[$this->FieldID( $field )]['OPTS'][] = $opt;
// Add the option and value
} else {
$this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value );
}
}
/**
* Adds an option to the table
*
* This method takes a comma-separated list of table-level options
* and appends them to the table object.
*
* @param string $opt Table option
* @return array Options
*/
function addTableOpt( $opt ) {
$this->opts[] = $opt;
return $this->opts;
}
/**
* Generates the SQL that will create the table in the database
*
* @param object $xmls adoSchema object
* @return array Array containing table creation SQL
*/
function create( &$xmls ) {
$sql = array();
// drop any existing indexes
if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) {
foreach( $legacy_indexes as $index => $index_details ) {
$sql[] = $xmls->dict->DropIndexSQL( $index, $this->name );
}
}
// remove fields to be dropped from table object
foreach( $this->drop_field as $field ) {
unset( $this->fields[$field] );
}
// if table exists
if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) {
// drop table
if( $this->drop_table ) {
$sql[] = $xmls->dict->DropTableSQL( $this->name );
return $sql;
}
// drop any existing fields not in schema
foreach( $legacy_fields as $field_id => $field ) {
if( !isset( $this->fields[$field_id] ) ) {
$sql[] = $xmls->dict->DropColumnSQL( $this->name, '`'.$field->name.'`' );
}
}
// if table doesn't exist
} else {
if( $this->drop_table ) {
return $sql;
}
$legacy_fields = array();
}
// Loop through the field specifier array, building the associative array for the field options
$fldarray = array();
foreach( $this->fields as $field_id => $finfo ) {
// Set an empty size if it isn't supplied
if( !isset( $finfo['SIZE'] ) ) {
$finfo['SIZE'] = '';
}
// Initialize the field array with the type and size
$fldarray[$field_id] = array(
'NAME' => $finfo['NAME'],
'TYPE' => $finfo['TYPE'],
'SIZE' => $finfo['SIZE']
);
// Loop through the options array and add the field options.
if( isset( $finfo['OPTS'] ) ) {
foreach( $finfo['OPTS'] as $opt ) {
// Option has an argument.
if( is_array( $opt ) ) {
$key = key( $opt );
$value = $opt[key( $opt )];
@$fldarray[$field_id][$key] .= $value;
// Option doesn't have arguments
} else {
$fldarray[$field_id][$opt] = $opt;
}
}
}
}
if( empty( $legacy_fields ) ) {
// Create the new table
$sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts );
logMsg( end( $sql ), 'Generated CreateTableSQL' );
} else {
// Upgrade an existing table
logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" );
switch( $xmls->upgrade ) {
// Use ChangeTableSQL
case 'ALTER':
logMsg( 'Generated ChangeTableSQL (ALTERing table)' );
$sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts );
break;
case 'REPLACE':
logMsg( 'Doing upgrade REPLACE (testing)' );
$sql[] = $xmls->dict->DropTableSQL( $this->name );
$sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts );
break;
// ignore table
default:
return array();
}
}
foreach( $this->indexes as $index ) {
$sql[] = $index->create( $xmls );
}
if( isset( $this->data ) ) {
$sql[] = $this->data->create( $xmls );
}
return $sql;
}
/**
* Marks a field or table for destruction
*/
function drop() {
if( isset( $this->current_field ) ) {
// Drop the current field
logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" );
// $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field );
$this->drop_field[$this->current_field] = $this->current_field;
} else {
// Drop the current table
logMsg( "Dropping table '{$this->name}'" );
// $this->drop_table = $xmls->dict->DropTableSQL( $this->name );
$this->drop_table = TRUE;
}
}
}
 
/**
* Creates an index object in ADOdb's datadict format
*
* This class stores information about a database index. As charactaristics
* of the index are loaded from the external source, methods and properties
* of this class are used to build up the index description in ADOdb's
* datadict format.
*
* @package axmls
* @access private
*/
class dbIndex extends dbObject {
/**
* @var string Index name
*/
var $name;
/**
* @var array Index options: Index-level options
*/
var $opts = array();
/**
* @var array Indexed fields: Table columns included in this index
*/
var $columns = array();
/**
* @var boolean Mark index for destruction
* @access private
*/
var $drop = FALSE;
/**
* Initializes the new dbIndex object.
*
* @param object $parent Parent object
* @param array $attributes Attributes
*
* @internal
*/
function dbIndex( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
$this->name = $this->prefix ($attributes['NAME']);
}
/**
* XML Callback to process start elements
*
* Processes XML opening tags.
* Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH.
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'DROP':
$this->drop();
break;
case 'CLUSTERED':
case 'BITMAP':
case 'UNIQUE':
case 'FULLTEXT':
case 'HASH':
// Add index Option
$this->addIndexOpt( $this->currentElement );
break;
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* Processes XML cdata.
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Index field name
case 'COL':
$this->addField( $cdata );
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'INDEX':
xml_set_object( $parser, $this->parent );
break;
}
}
/**
* Adds a field to the index
*
* @param string $name Field name
* @return string Field list
*/
function addField( $name ) {
$this->columns[$this->FieldID( $name )] = $name;
// Return the field list
return $this->columns;
}
/**
* Adds options to the index
*
* @param string $opt Comma-separated list of index options.
* @return string Option list
*/
function addIndexOpt( $opt ) {
$this->opts[] = $opt;
// Return the options list
return $this->opts;
}
/**
* Generates the SQL that will create the index in the database
*
* @param object $xmls adoSchema object
* @return array Array containing index creation SQL
*/
function create( &$xmls ) {
if( $this->drop ) {
return NULL;
}
// eliminate any columns that aren't in the table
foreach( $this->columns as $id => $col ) {
if( !isset( $this->parent->fields[$id] ) ) {
unset( $this->columns[$id] );
}
}
return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts );
}
/**
* Marks an index for destruction
*/
function drop() {
$this->drop = TRUE;
}
}
 
/**
* Creates a data object in ADOdb's datadict format
*
* This class stores information about table data.
*
* @package axmls
* @access private
*/
class dbData extends dbObject {
var $data = array();
var $row;
/**
* Initializes the new dbIndex object.
*
* @param object $parent Parent object
* @param array $attributes Attributes
*
* @internal
*/
function dbData( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
}
/**
* XML Callback to process start elements
*
* Processes XML opening tags.
* Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH.
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'ROW':
$this->row = count( $this->data );
$this->data[$this->row] = array();
break;
case 'F':
$this->addField($attributes);
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* Processes XML cdata.
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Index field name
case 'F':
$this->addData( $cdata );
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'DATA':
xml_set_object( $parser, $this->parent );
break;
}
}
/**
* Adds a field to the index
*
* @param string $name Field name
* @return string Field list
*/
function addField( $attributes ) {
if( isset( $attributes['NAME'] ) ) {
$name = $attributes['NAME'];
} else {
$name = count($this->data[$this->row]);
}
// Set the field index so we know where we are
$this->current_field = $this->FieldID( $name );
}
/**
* Adds options to the index
*
* @param string $opt Comma-separated list of index options.
* @return string Option list
*/
function addData( $cdata ) {
if( !isset( $this->data[$this->row] ) ) {
$this->data[$this->row] = array();
}
if( !isset( $this->data[$this->row][$this->current_field] ) ) {
$this->data[$this->row][$this->current_field] = '';
}
$this->data[$this->row][$this->current_field] .= $cdata;
}
/**
* Generates the SQL that will create the index in the database
*
* @param object $xmls adoSchema object
* @return array Array containing index creation SQL
*/
function create( &$xmls ) {
$table = $xmls->dict->TableName($this->parent->name);
$table_field_count = count($this->parent->fields);
$sql = array();
// eliminate any columns that aren't in the table
foreach( $this->data as $row ) {
$table_fields = $this->parent->fields;
$fields = array();
foreach( $row as $field_id => $field_data ) {
if( !array_key_exists( $field_id, $table_fields ) ) {
if( is_numeric( $field_id ) ) {
$field_id = reset( array_keys( $table_fields ) );
} else {
continue;
}
}
$name = $table_fields[$field_id]['NAME'];
switch( $table_fields[$field_id]['TYPE'] ) {
case 'C':
case 'C2':
case 'X':
case 'X2':
$fields[$name] = $xmls->db->qstr( $field_data );
break;
case 'I':
case 'I1':
case 'I2':
case 'I4':
case 'I8':
$fields[$name] = intval($field_data);
break;
default:
$fields[$name] = $field_data;
}
unset($table_fields[$field_id]);
}
// check that at least 1 column is specified
if( empty( $fields ) ) {
continue;
}
// check that no required columns are missing
if( count( $fields ) < $table_field_count ) {
foreach( $table_fields as $field ) {
if (isset( $field['OPTS'] ))
if( ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) {
continue(2);
}
}
}
$sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')';
}
return $sql;
}
}
 
/**
* Creates the SQL to execute a list of provided SQL queries
*
* @package axmls
* @access private
*/
class dbQuerySet extends dbObject {
/**
* @var array List of SQL queries
*/
var $queries = array();
/**
* @var string String used to build of a query line by line
*/
var $query;
/**
* @var string Query prefix key
*/
var $prefixKey = '';
/**
* @var boolean Auto prefix enable (TRUE)
*/
var $prefixMethod = 'AUTO';
/**
* Initializes the query set.
*
* @param object $parent Parent object
* @param array $attributes Attributes
*/
function dbQuerySet( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
// Overrides the manual prefix key
if( isset( $attributes['KEY'] ) ) {
$this->prefixKey = $attributes['KEY'];
}
$prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : '';
// Enables or disables automatic prefix prepending
switch( $prefixMethod ) {
case 'AUTO':
$this->prefixMethod = 'AUTO';
break;
case 'MANUAL':
$this->prefixMethod = 'MANUAL';
break;
case 'NONE':
$this->prefixMethod = 'NONE';
break;
}
}
/**
* XML Callback to process start elements. Elements currently
* processed are: QUERY.
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'QUERY':
// Create a new query in a SQL queryset.
// Ignore this query set if a platform is specified and it's different than the
// current connection platform.
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
$this->newQuery();
} else {
$this->discardQuery();
}
break;
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Line of queryset SQL data
case 'QUERY':
$this->buildQuery( $cdata );
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'QUERY':
// Add the finished query to the open query set.
$this->addQuery();
break;
case 'SQL':
$this->parent->addSQL( $this->create( $this->parent ) );
xml_set_object( $parser, $this->parent );
$this->destroy();
break;
default:
}
}
/**
* Re-initializes the query.
*
* @return boolean TRUE
*/
function newQuery() {
$this->query = '';
return TRUE;
}
/**
* Discards the existing query.
*
* @return boolean TRUE
*/
function discardQuery() {
unset( $this->query );
return TRUE;
}
/**
* Appends a line to a query that is being built line by line
*
* @param string $data Line of SQL data or NULL to initialize a new query
* @return string SQL query string.
*/
function buildQuery( $sql = NULL ) {
if( !isset( $this->query ) OR empty( $sql ) ) {
return FALSE;
}
$this->query .= $sql;
return $this->query;
}
/**
* Adds a completed query to the query list
*
* @return string SQL of added query
*/
function addQuery() {
if( !isset( $this->query ) ) {
return FALSE;
}
$this->queries[] = $return = trim($this->query);
unset( $this->query );
return $return;
}
/**
* Creates and returns the current query set
*
* @param object $xmls adoSchema object
* @return array Query set
*/
function create( &$xmls ) {
foreach( $this->queries as $id => $query ) {
switch( $this->prefixMethod ) {
case 'AUTO':
// Enable auto prefix replacement
// Process object prefix.
// Evaluate SQL statements to prepend prefix to objects
$query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
$query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
$query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
// SELECT statements aren't working yet
#$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data );
case 'MANUAL':
// If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX.
// If prefixKey is not set, we use the default constant XMLS_PREFIX
if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) {
// Enable prefix override
$query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query );
} else {
// Use default replacement
$query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query );
}
}
$this->queries[$id] = trim( $query );
}
// Return the query set array
return $this->queries;
}
/**
* Rebuilds the query with the prefix attached to any objects
*
* @param string $regex Regex used to add prefix
* @param string $query SQL query string
* @param string $prefix Prefix to be appended to tables, indices, etc.
* @return string Prefixed SQL query string.
*/
function prefixQuery( $regex, $query, $prefix = NULL ) {
if( !isset( $prefix ) ) {
return $query;
}
if( preg_match( $regex, $query, $match ) ) {
$preamble = $match[1];
$postamble = $match[5];
$objectList = explode( ',', $match[3] );
// $prefix = $prefix . '_';
$prefixedList = '';
foreach( $objectList as $object ) {
if( $prefixedList !== '' ) {
$prefixedList .= ', ';
}
$prefixedList .= $prefix . trim( $object );
}
$query = $preamble . ' ' . $prefixedList . ' ' . $postamble;
}
return $query;
}
}
 
/**
* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements
*
* This class is used to load and parse the XML file, to create an array of SQL statements
* that can be used to build a database, and to build the database using the SQL array.
*
* @tutorial getting_started.pkg
*
* @author Richard Tango-Lowy & Dan Cech
* @version $Revision: 1.12 $
*
* @package axmls
*/
class adoSchema {
/**
* @var array Array containing SQL queries to generate all objects
* @access private
*/
var $sqlArray;
/**
* @var object ADOdb connection object
* @access private
*/
var $db;
/**
* @var object ADOdb Data Dictionary
* @access private
*/
var $dict;
/**
* @var string Current XML element
* @access private
*/
var $currentElement = '';
/**
* @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database
* @access private
*/
var $upgrade = '';
/**
* @var string Optional object prefix
* @access private
*/
var $objectPrefix = '';
/**
* @var long Original Magic Quotes Runtime value
* @access private
*/
var $mgq;
/**
* @var long System debug
* @access private
*/
var $debug;
/**
* @var string Regular expression to find schema version
* @access private
*/
var $versionRegex = '/<schema.*?( version="([^"]*)")?.*?>/';
/**
* @var string Current schema version
* @access private
*/
var $schemaVersion;
/**
* @var int Success of last Schema execution
*/
var $success;
/**
* @var bool Execute SQL inline as it is generated
*/
var $executeInline;
/**
* @var bool Continue SQL execution if errors occur
*/
var $continueOnError;
/**
* Creates an adoSchema object
*
* Creating an adoSchema object is the first step in processing an XML schema.
* The only parameter is an ADOdb database connection object, which must already
* have been created.
*
* @param object $db ADOdb database connection object.
*/
function adoSchema( &$db ) {
// Initialize the environment
$this->mgq = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
$this->db =& $db;
$this->debug = $this->db->debug;
$this->dict = NewDataDictionary( $this->db );
$this->sqlArray = array();
$this->schemaVersion = XMLS_SCHEMA_VERSION;
$this->executeInline( XMLS_EXECUTE_INLINE );
$this->continueOnError( XMLS_CONTINUE_ON_ERROR );
$this->setUpgradeMethod();
}
/**
* Sets the method to be used for upgrading an existing database
*
* Use this method to specify how existing database objects should be upgraded.
* The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to
* alter each database object directly, REPLACE attempts to rebuild each object
* from scratch, BEST attempts to determine the best upgrade method for each
* object, and NONE disables upgrading.
*
* This method is not yet used by AXMLS, but exists for backward compatibility.
* The ALTER method is automatically assumed when the adoSchema object is
* instantiated; other upgrade methods are not currently supported.
*
* @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE)
* @returns string Upgrade method used
*/
function SetUpgradeMethod( $method = '' ) {
if( !is_string( $method ) ) {
return FALSE;
}
$method = strtoupper( $method );
// Handle the upgrade methods
switch( $method ) {
case 'ALTER':
$this->upgrade = $method;
break;
case 'REPLACE':
$this->upgrade = $method;
break;
case 'BEST':
$this->upgrade = 'ALTER';
break;
case 'NONE':
$this->upgrade = 'NONE';
break;
default:
// Use default if no legitimate method is passed.
$this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD;
}
return $this->upgrade;
}
/**
* Enables/disables inline SQL execution.
*
* Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution),
* AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode
* is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema()
* to apply the schema to the database.
*
* @param bool $mode execute
* @return bool current execution mode
*
* @see ParseSchema(), ExecuteSchema()
*/
function ExecuteInline( $mode = NULL ) {
if( is_bool( $mode ) ) {
$this->executeInline = $mode;
}
return $this->executeInline;
}
/**
* Enables/disables SQL continue on error.
*
* Call this method to enable or disable continuation of SQL execution if an error occurs.
* If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs.
* If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing
* of the schema will continue.
*
* @param bool $mode execute
* @return bool current continueOnError mode
*
* @see addSQL(), ExecuteSchema()
*/
function ContinueOnError( $mode = NULL ) {
if( is_bool( $mode ) ) {
$this->continueOnError = $mode;
}
return $this->continueOnError;
}
/**
* Loads an XML schema from a file and converts it to SQL.
*
* Call this method to load the specified schema (see the DTD for the proper format) from
* the filesystem and generate the SQL necessary to create the database described.
* @see ParseSchemaString()
*
* @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute
*/
function ParseSchema( $filename, $returnSchema = FALSE ) {
return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
}
/**
* Loads an XML schema from a file and converts it to SQL.
*
* Call this method to load the specified schema from a file (see the DTD for the proper format)
* and generate the SQL necessary to create the database described by the schema.
*
* @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute.
*
* @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString()
* @see ParseSchema(), ParseSchemaString()
*/
function ParseSchemaFile( $filename, $returnSchema = FALSE ) {
// Open the file
if( !($fp = fopen( $filename, 'r' )) ) {
// die( 'Unable to open file' );
return FALSE;
}
// do version detection here
if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) {
return FALSE;
}
if ( $returnSchema )
{
$xmlstring = '';
while( $data = fread( $fp, 100000 ) ) {
$xmlstring .= $data;
}
return $xmlstring;
}
$this->success = 2;
$xmlParser = $this->create_parser();
// Process the file
while( $data = fread( $fp, 4096 ) ) {
if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) {
die( sprintf(
"XML error: %s at line %d",
xml_error_string( xml_get_error_code( $xmlParser) ),
xml_get_current_line_number( $xmlParser)
) );
}
}
xml_parser_free( $xmlParser );
return $this->sqlArray;
}
/**
* Converts an XML schema string to SQL.
*
* Call this method to parse a string containing an XML schema (see the DTD for the proper format)
* and generate the SQL necessary to create the database described by the schema.
* @see ParseSchema()
*
* @param string $xmlstring XML schema string.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute.
*/
function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) {
if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
return FALSE;
}
// do version detection here
if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) {
return FALSE;
}
if ( $returnSchema )
{
return $xmlstring;
}
$this->success = 2;
$xmlParser = $this->create_parser();
if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) {
die( sprintf(
"XML error: %s at line %d",
xml_error_string( xml_get_error_code( $xmlParser) ),
xml_get_current_line_number( $xmlParser)
) );
}
xml_parser_free( $xmlParser );
return $this->sqlArray;
}
/**
* Loads an XML schema from a file and converts it to uninstallation SQL.
*
* Call this method to load the specified schema (see the DTD for the proper format) from
* the filesystem and generate the SQL necessary to remove the database described.
* @see RemoveSchemaString()
*
* @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute
*/
function RemoveSchema( $filename, $returnSchema = FALSE ) {
return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
}
/**
* Converts an XML schema string to uninstallation SQL.
*
* Call this method to parse a string containing an XML schema (see the DTD for the proper format)
* and generate the SQL necessary to uninstall the database described by the schema.
* @see RemoveSchema()
*
* @param string $schema XML schema string.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute.
*/
function RemoveSchemaString( $schema, $returnSchema = FALSE ) {
// grab current version
if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
return FALSE;
}
return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema );
}
/**
* Applies the current XML schema to the database (post execution).
*
* Call this method to apply the current schema (generally created by calling
* ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes,
* and executing other SQL specified in the schema) after parsing.
* @see ParseSchema(), ParseSchemaString(), ExecuteInline()
*
* @param array $sqlArray Array of SQL statements that will be applied rather than
* the current schema.
* @param boolean $continueOnErr Continue to apply the schema even if an error occurs.
* @returns integer 0 if failure, 1 if errors, 2 if successful.
*/
function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) {
if( !is_bool( $continueOnErr ) ) {
$continueOnErr = $this->ContinueOnError();
}
if( !isset( $sqlArray ) ) {
$sqlArray = $this->sqlArray;
}
if( !is_array( $sqlArray ) ) {
$this->success = 0;
} else {
$this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr );
}
return $this->success;
}
/**
* Returns the current SQL array.
*
* Call this method to fetch the array of SQL queries resulting from
* ParseSchema() or ParseSchemaString().
*
* @param string $format Format: HTML, TEXT, or NONE (PHP array)
* @return array Array of SQL statements or FALSE if an error occurs
*/
function PrintSQL( $format = 'NONE' ) {
$sqlArray = null;
return $this->getSQL( $format, $sqlArray );
}
/**
* Saves the current SQL array to the local filesystem as a list of SQL queries.
*
* Call this method to save the array of SQL queries (generally resulting from a
* parsed XML schema) to the filesystem.
*
* @param string $filename Path and name where the file should be saved.
* @return boolean TRUE if save is successful, else FALSE.
*/
function SaveSQL( $filename = './schema.sql' ) {
if( !isset( $sqlArray ) ) {
$sqlArray = $this->sqlArray;
}
if( !isset( $sqlArray ) ) {
return FALSE;
}
$fp = fopen( $filename, "w" );
foreach( $sqlArray as $key => $query ) {
fwrite( $fp, $query . ";\n" );
}
fclose( $fp );
}
/**
* Create an xml parser
*
* @return object PHP XML parser object
*
* @access private
*/
function &create_parser() {
// Create the parser
$xmlParser = xml_parser_create();
xml_set_object( $xmlParser, $this );
// Initialize the XML callback functions
xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' );
xml_set_character_data_handler( $xmlParser, '_tag_cdata' );
return $xmlParser;
}
/**
* XML Callback to process start elements
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
switch( strtoupper( $tag ) ) {
case 'TABLE':
$this->obj = new dbTable( $this, $attributes );
xml_set_object( $parser, $this->obj );
break;
case 'SQL':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
$this->obj = new dbQuerySet( $this, $attributes );
xml_set_object( $parser, $this->obj );
}
break;
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
}
/**
* XML Callback to process end elements
*
* @access private
* @internal
*/
function _tag_close( &$parser, $tag ) {
}
/**
* Converts an XML schema string to the specified DTD version.
*
* Call this method to convert a string containing an XML schema to a different AXMLS
* DTD version. For instance, to convert a schema created for an pre-1.0 version for
* AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version
* parameter is specified, the schema will be converted to the current DTD version.
* If the newFile parameter is provided, the converted schema will be written to the specified
* file.
* @see ConvertSchemaFile()
*
* @param string $schema String containing XML schema that will be converted.
* @param string $newVersion DTD version to convert to.
* @param string $newFile File name of (converted) output file.
* @return string Converted XML schema or FALSE if an error occurs.
*/
function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) {
// grab current version
if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
return FALSE;
}
if( !isset ($newVersion) ) {
$newVersion = $this->schemaVersion;
}
if( $version == $newVersion ) {
$result = $schema;
} else {
$result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion);
}
if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
fwrite( $fp, $result );
fclose( $fp );
}
return $result;
}
// compat for pre-4.3 - jlim
function _file_get_contents($path)
{
if (function_exists('file_get_contents')) return file_get_contents($path);
return join('',file($path));
}
/**
* Converts an XML schema file to the specified DTD version.
*
* Call this method to convert the specified XML schema file to a different AXMLS
* DTD version. For instance, to convert a schema created for an pre-1.0 version for
* AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version
* parameter is specified, the schema will be converted to the current DTD version.
* If the newFile parameter is provided, the converted schema will be written to the specified
* file.
* @see ConvertSchemaString()
*
* @param string $filename Name of XML schema file that will be converted.
* @param string $newVersion DTD version to convert to.
* @param string $newFile File name of (converted) output file.
* @return string Converted XML schema or FALSE if an error occurs.
*/
function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) {
// grab current version
if( !( $version = $this->SchemaFileVersion( $filename ) ) ) {
return FALSE;
}
if( !isset ($newVersion) ) {
$newVersion = $this->schemaVersion;
}
if( $version == $newVersion ) {
$result = _file_get_contents( $filename );
// remove unicode BOM if present
if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) {
$result = substr( $result, 3 );
}
} else {
$result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' );
}
if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
fwrite( $fp, $result );
fclose( $fp );
}
return $result;
}
function TransformSchema( $schema, $xsl, $schematype='string' )
{
// Fail if XSLT extension is not available
if( ! function_exists( 'xslt_create' ) ) {
return FALSE;
}
$xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl';
// look for xsl
if( !is_readable( $xsl_file ) ) {
return FALSE;
}
switch( $schematype )
{
case 'file':
if( !is_readable( $schema ) ) {
return FALSE;
}
$schema = _file_get_contents( $schema );
break;
case 'string':
default:
if( !is_string( $schema ) ) {
return FALSE;
}
}
$arguments = array (
'/_xml' => $schema,
'/_xsl' => _file_get_contents( $xsl_file )
);
// create an XSLT processor
$xh = xslt_create ();
// set error handler
xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler'));
// process the schema
$result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
xslt_free ($xh);
return $result;
}
/**
* Processes XSLT transformation errors
*
* @param object $parser XML parser object
* @param integer $errno Error number
* @param integer $level Error level
* @param array $fields Error information fields
*
* @access private
*/
function xslt_error_handler( $parser, $errno, $level, $fields ) {
if( is_array( $fields ) ) {
$msg = array(
'Message Type' => ucfirst( $fields['msgtype'] ),
'Message Code' => $fields['code'],
'Message' => $fields['msg'],
'Error Number' => $errno,
'Level' => $level
);
switch( $fields['URI'] ) {
case 'arg:/_xml':
$msg['Input'] = 'XML';
break;
case 'arg:/_xsl':
$msg['Input'] = 'XSL';
break;
default:
$msg['Input'] = $fields['URI'];
}
$msg['Line'] = $fields['line'];
} else {
$msg = array(
'Message Type' => 'Error',
'Error Number' => $errno,
'Level' => $level,
'Fields' => var_export( $fields, TRUE )
);
}
$error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n"
. '<table>' . "\n";
foreach( $msg as $label => $details ) {
$error_details .= '<tr><td><b>' . $label . ': </b></td><td>' . htmlentities( $details ) . '</td></tr>' . "\n";
}
$error_details .= '</table>';
trigger_error( $error_details, E_USER_ERROR );
}
/**
* Returns the AXMLS Schema Version of the requested XML schema file.
*
* Call this method to obtain the AXMLS DTD version of the requested XML schema file.
* @see SchemaStringVersion()
*
* @param string $filename AXMLS schema file
* @return string Schema version number or FALSE on error
*/
function SchemaFileVersion( $filename ) {
// Open the file
if( !($fp = fopen( $filename, 'r' )) ) {
// die( 'Unable to open file' );
return FALSE;
}
// Process the file
while( $data = fread( $fp, 4096 ) ) {
if( preg_match( $this->versionRegex, $data, $matches ) ) {
return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION;
}
}
return FALSE;
}
/**
* Returns the AXMLS Schema Version of the provided XML schema string.
*
* Call this method to obtain the AXMLS DTD version of the provided XML schema string.
* @see SchemaFileVersion()
*
* @param string $xmlstring XML schema string
* @return string Schema version number or FALSE on error
*/
function SchemaStringVersion( $xmlstring ) {
if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
return FALSE;
}
if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) {
return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION;
}
return FALSE;
}
/**
* Extracts an XML schema from an existing database.
*
* Call this method to create an XML schema string from an existing database.
* If the data parameter is set to TRUE, AXMLS will include the data from the database
* in the schema.
*
* @param boolean $data Include data in schema dump
* @return string Generated XML schema
*/
function ExtractSchema( $data = FALSE ) {
$old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM );
$schema = '<?xml version="1.0"?>' . "\n"
. '<schema version="' . $this->schemaVersion . '">' . "\n";
if( is_array( $tables = $this->db->MetaTables( 'TABLES' ) ) ) {
foreach( $tables as $table ) {
$schema .= ' <table name="' . $table . '">' . "\n";
// grab details from database
$rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE 1=1' );
$fields = $this->db->MetaColumns( $table );
$indexes = $this->db->MetaIndexes( $table );
if( is_array( $fields ) ) {
foreach( $fields as $details ) {
$extra = '';
$content = array();
if( $details->max_length > 0 ) {
$extra .= ' size="' . $details->max_length . '"';
}
if( $details->primary_key ) {
$content[] = '<KEY/>';
} elseif( $details->not_null ) {
$content[] = '<NOTNULL/>';
}
if( $details->has_default ) {
$content[] = '<DEFAULT value="' . $details->default_value . '"/>';
}
if( $details->auto_increment ) {
$content[] = '<AUTOINCREMENT/>';
}
// this stops the creation of 'R' columns,
// AUTOINCREMENT is used to create auto columns
$details->primary_key = 0;
$type = $rs->MetaType( $details );
$schema .= ' <field name="' . $details->name . '" type="' . $type . '"' . $extra . '>';
if( !empty( $content ) ) {
$schema .= "\n " . implode( "\n ", $content ) . "\n ";
}
$schema .= '</field>' . "\n";
}
}
if( is_array( $indexes ) ) {
foreach( $indexes as $index => $details ) {
$schema .= ' <index name="' . $index . '">' . "\n";
if( $details['unique'] ) {
$schema .= ' <UNIQUE/>' . "\n";
}
foreach( $details['columns'] as $column ) {
$schema .= ' <col>' . $column . '</col>' . "\n";
}
$schema .= ' </index>' . "\n";
}
}
if( $data ) {
$rs = $this->db->Execute( 'SELECT * FROM ' . $table );
if( is_object( $rs ) ) {
$schema .= ' <data>' . "\n";
while( $row = $rs->FetchRow() ) {
foreach( $row as $key => $val ) {
$row[$key] = htmlentities($val);
}
$schema .= ' <row><f>' . implode( '</f><f>', $row ) . '</f></row>' . "\n";
}
$schema .= ' </data>' . "\n";
}
}
$schema .= ' </table>' . "\n";
}
}
$this->db->SetFetchMode( $old_mode );
$schema .= '</schema>';
return $schema;
}
/**
* Sets a prefix for database objects
*
* Call this method to set a standard prefix that will be prepended to all database tables
* and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix.
*
* @param string $prefix Prefix that will be prepended.
* @param boolean $underscore If TRUE, automatically append an underscore character to the prefix.
* @return boolean TRUE if successful, else FALSE
*/
function SetPrefix( $prefix = '', $underscore = TRUE ) {
switch( TRUE ) {
// clear prefix
case empty( $prefix ):
logMsg( 'Cleared prefix' );
$this->objectPrefix = '';
return TRUE;
// prefix too long
case strlen( $prefix ) > XMLS_PREFIX_MAXLEN:
// prefix contains invalid characters
case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ):
logMsg( 'Invalid prefix: ' . $prefix );
return FALSE;
}
if( $underscore AND substr( $prefix, -1 ) != '_' ) {
$prefix .= '_';
}
// prefix valid
logMsg( 'Set prefix: ' . $prefix );
$this->objectPrefix = $prefix;
return TRUE;
}
/**
* Returns an object name with the current prefix prepended.
*
* @param string $name Name
* @return string Prefixed name
*
* @access private
*/
function prefix( $name = '' ) {
// if prefix is set
if( !empty( $this->objectPrefix ) ) {
// Prepend the object prefix to the table name
// prepend after quote if used
return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name );
}
// No prefix set. Use name provided.
return $name;
}
/**
* Checks if element references a specific platform
*
* @param string $platform Requested platform
* @returns boolean TRUE if platform check succeeds
*
* @access private
*/
function supportedPlatform( $platform = NULL ) {
$regex = '/^(\w*\|)*' . $this->db->databaseType . '(\|\w*)*$/';
if( !isset( $platform ) OR preg_match( $regex, $platform ) ) {
logMsg( "Platform $platform is supported" );
return TRUE;
} else {
logMsg( "Platform $platform is NOT supported" );
return FALSE;
}
}
/**
* Clears the array of generated SQL.
*
* @access private
*/
function clearSQL() {
$this->sqlArray = array();
}
/**
* Adds SQL into the SQL array.
*
* @param mixed $sql SQL to Add
* @return boolean TRUE if successful, else FALSE.
*
* @access private
*/
function addSQL( $sql = NULL ) {
if( is_array( $sql ) ) {
foreach( $sql as $line ) {
$this->addSQL( $line );
}
return TRUE;
}
if( is_string( $sql ) ) {
$this->sqlArray[] = $sql;
// if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL.
if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) {
$saved = $this->db->debug;
$this->db->debug = $this->debug;
$ok = $this->db->Execute( $sql );
$this->db->debug = $saved;
if( !$ok ) {
if( $this->debug ) {
ADOConnection::outp( $this->db->ErrorMsg() );
}
$this->success = 1;
}
}
return TRUE;
}
return FALSE;
}
/**
* Gets the SQL array in the specified format.
*
* @param string $format Format
* @return mixed SQL
*
* @access private
*/
function getSQL( $format = NULL, $sqlArray = NULL ) {
if( !is_array( $sqlArray ) ) {
$sqlArray = $this->sqlArray;
}
if( !is_array( $sqlArray ) ) {
return FALSE;
}
switch( strtolower( $format ) ) {
case 'string':
case 'text':
return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : '';
case'html':
return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : '';
}
return $this->sqlArray;
}
/**
* Destroys an adoSchema object.
*
* Call this method to clean up after an adoSchema object that is no longer in use.
* @deprecated adoSchema now cleans up automatically.
*/
function Destroy() {
set_magic_quotes_runtime( $this->mgq );
unset( $this );
}
}
 
/**
* Message logging function
*
* @access private
*/
function logMsg( $msg, $title = NULL, $force = FALSE ) {
if( XMLS_DEBUG or $force ) {
echo '<pre>';
if( isset( $title ) ) {
echo '<h3>' . htmlentities( $title ) . '</h3>';
}
if( is_object( $this ) ) {
echo '[' . get_class( $this ) . '] ';
}
print_r( $msg );
echo '</pre>';
}
}
?>
/web/kaklik's_web/torrentflux/adodb/adodb-xmlschema03.inc.php
0,0 → 1,2399
<?php
// Copyright (c) 2004-2005 ars Cognita Inc., all rights reserved
/* ******************************************************************************
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
*******************************************************************************/
/**
* xmlschema is a class that allows the user to quickly and easily
* build a database on any ADOdb-supported platform using a simple
* XML schema.
*
* Last Editor: $Author: jlim $
* @author Richard Tango-Lowy & Dan Cech
* @version $Revision: 1.62 $
*
* @package axmls
* @tutorial getting_started.pkg
*/
function _file_get_contents($file)
{
if (function_exists('file_get_contents')) return file_get_contents($file);
$f = fopen($file,'r');
if (!$f) return '';
$t = '';
while ($s = fread($f,100000)) $t .= $s;
fclose($f);
return $t;
}
 
 
/**
* Debug on or off
*/
if( !defined( 'XMLS_DEBUG' ) ) {
define( 'XMLS_DEBUG', FALSE );
}
 
/**
* Default prefix key
*/
if( !defined( 'XMLS_PREFIX' ) ) {
define( 'XMLS_PREFIX', '%%P' );
}
 
/**
* Maximum length allowed for object prefix
*/
if( !defined( 'XMLS_PREFIX_MAXLEN' ) ) {
define( 'XMLS_PREFIX_MAXLEN', 10 );
}
 
/**
* Execute SQL inline as it is generated
*/
if( !defined( 'XMLS_EXECUTE_INLINE' ) ) {
define( 'XMLS_EXECUTE_INLINE', FALSE );
}
 
/**
* Continue SQL Execution if an error occurs?
*/
if( !defined( 'XMLS_CONTINUE_ON_ERROR' ) ) {
define( 'XMLS_CONTINUE_ON_ERROR', FALSE );
}
 
/**
* Current Schema Version
*/
if( !defined( 'XMLS_SCHEMA_VERSION' ) ) {
define( 'XMLS_SCHEMA_VERSION', '0.3' );
}
 
/**
* Default Schema Version. Used for Schemas without an explicit version set.
*/
if( !defined( 'XMLS_DEFAULT_SCHEMA_VERSION' ) ) {
define( 'XMLS_DEFAULT_SCHEMA_VERSION', '0.1' );
}
 
/**
* How to handle data rows that already exist in a database during and upgrade.
* Options are INSERT (attempts to insert duplicate rows), UPDATE (updates existing
* rows) and IGNORE (ignores existing rows).
*/
if( !defined( 'XMLS_MODE_INSERT' ) ) {
define( 'XMLS_MODE_INSERT', 0 );
}
if( !defined( 'XMLS_MODE_UPDATE' ) ) {
define( 'XMLS_MODE_UPDATE', 1 );
}
if( !defined( 'XMLS_MODE_IGNORE' ) ) {
define( 'XMLS_MODE_IGNORE', 2 );
}
if( !defined( 'XMLS_EXISTING_DATA' ) ) {
define( 'XMLS_EXISTING_DATA', XMLS_MODE_INSERT );
}
 
/**
* Default Schema Version. Used for Schemas without an explicit version set.
*/
if( !defined( 'XMLS_DEFAULT_UPGRADE_METHOD' ) ) {
define( 'XMLS_DEFAULT_UPGRADE_METHOD', 'ALTER' );
}
 
/**
* Include the main ADODB library
*/
if( !defined( '_ADODB_LAYER' ) ) {
require( 'adodb.inc.php' );
require( 'adodb-datadict.inc.php' );
}
 
/**
* Abstract DB Object. This class provides basic methods for database objects, such
* as tables and indexes.
*
* @package axmls
* @access private
*/
class dbObject {
/**
* var object Parent
*/
var $parent;
/**
* var string current element
*/
var $currentElement;
/**
* NOP
*/
function dbObject( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
}
/**
* XML Callback to process start elements
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
}
/**
* XML Callback to process CDATA elements
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
}
function create() {
return array();
}
/**
* Destroys the object
*/
function destroy() {
unset( $this );
}
/**
* Checks whether the specified RDBMS is supported by the current
* database object or its ranking ancestor.
*
* @param string $platform RDBMS platform name (from ADODB platform list).
* @return boolean TRUE if RDBMS is supported; otherwise returns FALSE.
*/
function supportedPlatform( $platform = NULL ) {
return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE;
}
/**
* Returns the prefix set by the ranking ancestor of the database object.
*
* @param string $name Prefix string.
* @return string Prefix.
*/
function prefix( $name = '' ) {
return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name;
}
/**
* Extracts a field ID from the specified field.
*
* @param string $field Field.
* @return string Field ID.
*/
function FieldID( $field ) {
return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) );
}
}
 
/**
* Creates a table object in ADOdb's datadict format
*
* This class stores information about a database table. As charactaristics
* of the table are loaded from the external source, methods and properties
* of this class are used to build up the table description in ADOdb's
* datadict format.
*
* @package axmls
* @access private
*/
class dbTable extends dbObject {
/**
* @var string Table name
*/
var $name;
/**
* @var array Field specifier: Meta-information about each field
*/
var $fields = array();
/**
* @var array List of table indexes.
*/
var $indexes = array();
/**
* @var array Table options: Table-level options
*/
var $opts = array();
/**
* @var string Field index: Keeps track of which field is currently being processed
*/
var $current_field;
/**
* @var boolean Mark table for destruction
* @access private
*/
var $drop_table;
/**
* @var boolean Mark field for destruction (not yet implemented)
* @access private
*/
var $drop_field = array();
/**
* @var array Platform-specific options
* @access private
*/
var $currentPlatform = true;
/**
* Iniitializes a new table object.
*
* @param string $prefix DB Object prefix
* @param array $attributes Array of table attributes.
*/
function dbTable( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
$this->name = $this->prefix($attributes['NAME']);
}
/**
* XML Callback to process start elements. Elements currently
* processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT.
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'INDEX':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
xml_set_object( $parser, $this->addIndex( $attributes ) );
}
break;
case 'DATA':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
xml_set_object( $parser, $this->addData( $attributes ) );
}
break;
case 'DROP':
$this->drop();
break;
case 'FIELD':
// Add a field
$fieldName = $attributes['NAME'];
$fieldType = $attributes['TYPE'];
$fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL;
$fieldOpts = !empty( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL;
$this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts );
break;
case 'KEY':
case 'NOTNULL':
case 'AUTOINCREMENT':
case 'DEFDATE':
case 'DEFTIMESTAMP':
case 'UNSIGNED':
// Add a field option
$this->addFieldOpt( $this->current_field, $this->currentElement );
break;
case 'DEFAULT':
// Add a field option to the table object
// Work around ADOdb datadict issue that misinterprets empty strings.
if( $attributes['VALUE'] == '' ) {
$attributes['VALUE'] = " '' ";
}
$this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] );
break;
case 'OPT':
case 'CONSTRAINT':
// Accept platform-specific options
$this->currentPlatform = ( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) );
break;
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Table/field constraint
case 'CONSTRAINT':
if( isset( $this->current_field ) ) {
$this->addFieldOpt( $this->current_field, $this->currentElement, $cdata );
} else {
$this->addTableOpt( $cdata );
}
break;
// Table/field option
case 'OPT':
if( isset( $this->current_field ) ) {
$this->addFieldOpt( $this->current_field, $cdata );
} else {
$this->addTableOpt( $cdata );
}
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'TABLE':
$this->parent->addSQL( $this->create( $this->parent ) );
xml_set_object( $parser, $this->parent );
$this->destroy();
break;
case 'FIELD':
unset($this->current_field);
break;
case 'OPT':
case 'CONSTRAINT':
$this->currentPlatform = true;
break;
default:
 
}
}
/**
* Adds an index to a table object
*
* @param array $attributes Index attributes
* @return object dbIndex object
*/
function &addIndex( $attributes ) {
$name = strtoupper( $attributes['NAME'] );
$this->indexes[$name] =& new dbIndex( $this, $attributes );
return $this->indexes[$name];
}
/**
* Adds data to a table object
*
* @param array $attributes Data attributes
* @return object dbData object
*/
function &addData( $attributes ) {
if( !isset( $this->data ) ) {
$this->data =& new dbData( $this, $attributes );
}
return $this->data;
}
/**
* Adds a field to a table object
*
* $name is the name of the table to which the field should be added.
* $type is an ADODB datadict field type. The following field types
* are supported as of ADODB 3.40:
* - C: varchar
* - X: CLOB (character large object) or largest varchar size
* if CLOB is not supported
* - C2: Multibyte varchar
* - X2: Multibyte CLOB
* - B: BLOB (binary large object)
* - D: Date (some databases do not support this, and we return a datetime type)
* - T: Datetime or Timestamp
* - L: Integer field suitable for storing booleans (0 or 1)
* - I: Integer (mapped to I4)
* - I1: 1-byte integer
* - I2: 2-byte integer
* - I4: 4-byte integer
* - I8: 8-byte integer
* - F: Floating point number
* - N: Numeric or decimal number
*
* @param string $name Name of the table to which the field will be added.
* @param string $type ADODB datadict field type.
* @param string $size Field size
* @param array $opts Field options array
* @return array Field specifier array
*/
function addField( $name, $type, $size = NULL, $opts = NULL ) {
$field_id = $this->FieldID( $name );
// Set the field index so we know where we are
$this->current_field = $field_id;
// Set the field name (required)
$this->fields[$field_id]['NAME'] = $name;
// Set the field type (required)
$this->fields[$field_id]['TYPE'] = $type;
// Set the field size (optional)
if( isset( $size ) ) {
$this->fields[$field_id]['SIZE'] = $size;
}
// Set the field options
if( isset( $opts ) ) {
$this->fields[$field_id]['OPTS'] = array($opts);
} else {
$this->fields[$field_id]['OPTS'] = array();
}
}
/**
* Adds a field option to the current field specifier
*
* This method adds a field option allowed by the ADOdb datadict
* and appends it to the given field.
*
* @param string $field Field name
* @param string $opt ADOdb field option
* @param mixed $value Field option value
* @return array Field specifier array
*/
function addFieldOpt( $field, $opt, $value = NULL ) {
if( $this->currentPlatform ) {
if( !isset( $value ) ) {
$this->fields[$this->FieldID( $field )]['OPTS'][] = $opt;
// Add the option and value
} else {
$this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value );
}
}
}
/**
* Adds an option to the table
*
* This method takes a comma-separated list of table-level options
* and appends them to the table object.
*
* @param string $opt Table option
* @return array Options
*/
function addTableOpt( $opt ) {
if( $this->currentPlatform ) {
$this->opts[] = $opt;
}
return $this->opts;
}
/**
* Generates the SQL that will create the table in the database
*
* @param object $xmls adoSchema object
* @return array Array containing table creation SQL
*/
function create( &$xmls ) {
$sql = array();
// drop any existing indexes
if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) {
foreach( $legacy_indexes as $index => $index_details ) {
$sql[] = $xmls->dict->DropIndexSQL( $index, $this->name );
}
}
// remove fields to be dropped from table object
foreach( $this->drop_field as $field ) {
unset( $this->fields[$field] );
}
// if table exists
if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) {
// drop table
if( $this->drop_table ) {
$sql[] = $xmls->dict->DropTableSQL( $this->name );
return $sql;
}
// drop any existing fields not in schema
foreach( $legacy_fields as $field_id => $field ) {
if( !isset( $this->fields[$field_id] ) ) {
$sql[] = $xmls->dict->DropColumnSQL( $this->name, $field->name );
}
}
// if table doesn't exist
} else {
if( $this->drop_table ) {
return $sql;
}
$legacy_fields = array();
}
// Loop through the field specifier array, building the associative array for the field options
$fldarray = array();
foreach( $this->fields as $field_id => $finfo ) {
// Set an empty size if it isn't supplied
if( !isset( $finfo['SIZE'] ) ) {
$finfo['SIZE'] = '';
}
// Initialize the field array with the type and size
$fldarray[$field_id] = array(
'NAME' => $finfo['NAME'],
'TYPE' => $finfo['TYPE'],
'SIZE' => $finfo['SIZE']
);
// Loop through the options array and add the field options.
if( isset( $finfo['OPTS'] ) ) {
foreach( $finfo['OPTS'] as $opt ) {
// Option has an argument.
if( is_array( $opt ) ) {
$key = key( $opt );
$value = $opt[key( $opt )];
@$fldarray[$field_id][$key] .= $value;
// Option doesn't have arguments
} else {
$fldarray[$field_id][$opt] = $opt;
}
}
}
}
if( empty( $legacy_fields ) ) {
// Create the new table
$sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts );
logMsg( end( $sql ), 'Generated CreateTableSQL' );
} else {
// Upgrade an existing table
logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" );
switch( $xmls->upgrade ) {
// Use ChangeTableSQL
case 'ALTER':
logMsg( 'Generated ChangeTableSQL (ALTERing table)' );
$sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts );
break;
case 'REPLACE':
logMsg( 'Doing upgrade REPLACE (testing)' );
$sql[] = $xmls->dict->DropTableSQL( $this->name );
$sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts );
break;
// ignore table
default:
return array();
}
}
foreach( $this->indexes as $index ) {
$sql[] = $index->create( $xmls );
}
if( isset( $this->data ) ) {
$sql[] = $this->data->create( $xmls );
}
return $sql;
}
/**
* Marks a field or table for destruction
*/
function drop() {
if( isset( $this->current_field ) ) {
// Drop the current field
logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" );
// $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field );
$this->drop_field[$this->current_field] = $this->current_field;
} else {
// Drop the current table
logMsg( "Dropping table '{$this->name}'" );
// $this->drop_table = $xmls->dict->DropTableSQL( $this->name );
$this->drop_table = TRUE;
}
}
}
 
/**
* Creates an index object in ADOdb's datadict format
*
* This class stores information about a database index. As charactaristics
* of the index are loaded from the external source, methods and properties
* of this class are used to build up the index description in ADOdb's
* datadict format.
*
* @package axmls
* @access private
*/
class dbIndex extends dbObject {
/**
* @var string Index name
*/
var $name;
/**
* @var array Index options: Index-level options
*/
var $opts = array();
/**
* @var array Indexed fields: Table columns included in this index
*/
var $columns = array();
/**
* @var boolean Mark index for destruction
* @access private
*/
var $drop = FALSE;
/**
* Initializes the new dbIndex object.
*
* @param object $parent Parent object
* @param array $attributes Attributes
*
* @internal
*/
function dbIndex( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
$this->name = $this->prefix ($attributes['NAME']);
}
/**
* XML Callback to process start elements
*
* Processes XML opening tags.
* Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH.
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'DROP':
$this->drop();
break;
case 'CLUSTERED':
case 'BITMAP':
case 'UNIQUE':
case 'FULLTEXT':
case 'HASH':
// Add index Option
$this->addIndexOpt( $this->currentElement );
break;
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* Processes XML cdata.
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Index field name
case 'COL':
$this->addField( $cdata );
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'INDEX':
xml_set_object( $parser, $this->parent );
break;
}
}
/**
* Adds a field to the index
*
* @param string $name Field name
* @return string Field list
*/
function addField( $name ) {
$this->columns[$this->FieldID( $name )] = $name;
// Return the field list
return $this->columns;
}
/**
* Adds options to the index
*
* @param string $opt Comma-separated list of index options.
* @return string Option list
*/
function addIndexOpt( $opt ) {
$this->opts[] = $opt;
// Return the options list
return $this->opts;
}
/**
* Generates the SQL that will create the index in the database
*
* @param object $xmls adoSchema object
* @return array Array containing index creation SQL
*/
function create( &$xmls ) {
if( $this->drop ) {
return NULL;
}
// eliminate any columns that aren't in the table
foreach( $this->columns as $id => $col ) {
if( !isset( $this->parent->fields[$id] ) ) {
unset( $this->columns[$id] );
}
}
return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts );
}
/**
* Marks an index for destruction
*/
function drop() {
$this->drop = TRUE;
}
}
 
/**
* Creates a data object in ADOdb's datadict format
*
* This class stores information about table data, and is called
* when we need to load field data into a table.
*
* @package axmls
* @access private
*/
class dbData extends dbObject {
var $data = array();
var $row;
/**
* Initializes the new dbData object.
*
* @param object $parent Parent object
* @param array $attributes Attributes
*
* @internal
*/
function dbData( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
}
/**
* XML Callback to process start elements
*
* Processes XML opening tags.
* Elements currently processed are: ROW and F (field).
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'ROW':
$this->row = count( $this->data );
$this->data[$this->row] = array();
break;
case 'F':
$this->addField($attributes);
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* Processes XML cdata.
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Index field name
case 'F':
$this->addData( $cdata );
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'DATA':
xml_set_object( $parser, $this->parent );
break;
}
}
/**
* Adds a field to the insert
*
* @param string $name Field name
* @return string Field list
*/
function addField( $attributes ) {
// check we're in a valid row
if( !isset( $this->row ) || !isset( $this->data[$this->row] ) ) {
return;
}
// Set the field index so we know where we are
if( isset( $attributes['NAME'] ) ) {
$this->current_field = $this->FieldID( $attributes['NAME'] );
} else {
$this->current_field = count( $this->data[$this->row] );
}
// initialise data
if( !isset( $this->data[$this->row][$this->current_field] ) ) {
$this->data[$this->row][$this->current_field] = '';
}
}
/**
* Adds options to the index
*
* @param string $opt Comma-separated list of index options.
* @return string Option list
*/
function addData( $cdata ) {
// check we're in a valid field
if ( isset( $this->data[$this->row][$this->current_field] ) ) {
// add data to field
$this->data[$this->row][$this->current_field] .= $cdata;
}
}
/**
* Generates the SQL that will add/update the data in the database
*
* @param object $xmls adoSchema object
* @return array Array containing index creation SQL
*/
function create( &$xmls ) {
$table = $xmls->dict->TableName($this->parent->name);
$table_field_count = count($this->parent->fields);
$tables = $xmls->db->MetaTables();
$sql = array();
$ukeys = $xmls->db->MetaPrimaryKeys( $table );
if( !empty( $this->parent->indexes ) and !empty( $ukeys ) ) {
foreach( $this->parent->indexes as $indexObj ) {
if( !in_array( $indexObj->name, $ukeys ) ) $ukeys[] = $indexObj->name;
}
}
// eliminate any columns that aren't in the table
foreach( $this->data as $row ) {
$table_fields = $this->parent->fields;
$fields = array();
$rawfields = array(); // Need to keep some of the unprocessed data on hand.
foreach( $row as $field_id => $field_data ) {
if( !array_key_exists( $field_id, $table_fields ) ) {
if( is_numeric( $field_id ) ) {
$field_id = reset( array_keys( $table_fields ) );
} else {
continue;
}
}
$name = $table_fields[$field_id]['NAME'];
switch( $table_fields[$field_id]['TYPE'] ) {
case 'I':
case 'I1':
case 'I2':
case 'I4':
case 'I8':
$fields[$name] = intval($field_data);
break;
case 'C':
case 'C2':
case 'X':
case 'X2':
default:
$fields[$name] = $xmls->db->qstr( $field_data );
$rawfields[$name] = $field_data;
}
unset($table_fields[$field_id]);
}
// check that at least 1 column is specified
if( empty( $fields ) ) {
continue;
}
// check that no required columns are missing
if( count( $fields ) < $table_field_count ) {
foreach( $table_fields as $field ) {
if( isset( $field['OPTS'] ) and ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) {
continue(2);
}
}
}
// The rest of this method deals with updating existing data records.
if( !in_array( $table, $tables ) or ( $mode = $xmls->existingData() ) == XMLS_MODE_INSERT ) {
// Table doesn't yet exist, so it's safe to insert.
logMsg( "$table doesn't exist, inserting or mode is INSERT" );
$sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')';
continue;
}
// Prepare to test for potential violations. Get primary keys and unique indexes
$mfields = array_merge( $fields, $rawfields );
$keyFields = array_intersect( $ukeys, array_keys( $mfields ) );
if( empty( $ukeys ) or count( $keyFields ) == 0 ) {
// No unique keys in schema, so safe to insert
logMsg( "Either schema or data has no unique keys, so safe to insert" );
$sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')';
continue;
}
// Select record containing matching unique keys.
$where = '';
foreach( $ukeys as $key ) {
if( isset( $mfields[$key] ) and $mfields[$key] ) {
if( $where ) $where .= ' AND ';
$where .= $key . ' = ' . $xmls->db->qstr( $mfields[$key] );
}
}
$records = $xmls->db->Execute( 'SELECT * FROM ' . $table . ' WHERE ' . $where );
switch( $records->RecordCount() ) {
case 0:
// No matching record, so safe to insert.
logMsg( "No matching records. Inserting new row with unique data" );
$sql[] = $xmls->db->GetInsertSQL( $records, $mfields );
break;
case 1:
// Exactly one matching record, so we can update if the mode permits.
logMsg( "One matching record..." );
if( $mode == XMLS_MODE_UPDATE ) {
logMsg( "...Updating existing row from unique data" );
$sql[] = $xmls->db->GetUpdateSQL( $records, $mfields );
}
break;
default:
// More than one matching record; the result is ambiguous, so we must ignore the row.
logMsg( "More than one matching record. Ignoring row." );
}
}
return $sql;
}
}
 
/**
* Creates the SQL to execute a list of provided SQL queries
*
* @package axmls
* @access private
*/
class dbQuerySet extends dbObject {
/**
* @var array List of SQL queries
*/
var $queries = array();
/**
* @var string String used to build of a query line by line
*/
var $query;
/**
* @var string Query prefix key
*/
var $prefixKey = '';
/**
* @var boolean Auto prefix enable (TRUE)
*/
var $prefixMethod = 'AUTO';
/**
* Initializes the query set.
*
* @param object $parent Parent object
* @param array $attributes Attributes
*/
function dbQuerySet( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
// Overrides the manual prefix key
if( isset( $attributes['KEY'] ) ) {
$this->prefixKey = $attributes['KEY'];
}
$prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : '';
// Enables or disables automatic prefix prepending
switch( $prefixMethod ) {
case 'AUTO':
$this->prefixMethod = 'AUTO';
break;
case 'MANUAL':
$this->prefixMethod = 'MANUAL';
break;
case 'NONE':
$this->prefixMethod = 'NONE';
break;
}
}
/**
* XML Callback to process start elements. Elements currently
* processed are: QUERY.
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'QUERY':
// Create a new query in a SQL queryset.
// Ignore this query set if a platform is specified and it's different than the
// current connection platform.
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
$this->newQuery();
} else {
$this->discardQuery();
}
break;
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Line of queryset SQL data
case 'QUERY':
$this->buildQuery( $cdata );
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'QUERY':
// Add the finished query to the open query set.
$this->addQuery();
break;
case 'SQL':
$this->parent->addSQL( $this->create( $this->parent ) );
xml_set_object( $parser, $this->parent );
$this->destroy();
break;
default:
}
}
/**
* Re-initializes the query.
*
* @return boolean TRUE
*/
function newQuery() {
$this->query = '';
return TRUE;
}
/**
* Discards the existing query.
*
* @return boolean TRUE
*/
function discardQuery() {
unset( $this->query );
return TRUE;
}
/**
* Appends a line to a query that is being built line by line
*
* @param string $data Line of SQL data or NULL to initialize a new query
* @return string SQL query string.
*/
function buildQuery( $sql = NULL ) {
if( !isset( $this->query ) OR empty( $sql ) ) {
return FALSE;
}
$this->query .= $sql;
return $this->query;
}
/**
* Adds a completed query to the query list
*
* @return string SQL of added query
*/
function addQuery() {
if( !isset( $this->query ) ) {
return FALSE;
}
$this->queries[] = $return = trim($this->query);
unset( $this->query );
return $return;
}
/**
* Creates and returns the current query set
*
* @param object $xmls adoSchema object
* @return array Query set
*/
function create( &$xmls ) {
foreach( $this->queries as $id => $query ) {
switch( $this->prefixMethod ) {
case 'AUTO':
// Enable auto prefix replacement
// Process object prefix.
// Evaluate SQL statements to prepend prefix to objects
$query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
$query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
$query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
// SELECT statements aren't working yet
#$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data );
case 'MANUAL':
// If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX.
// If prefixKey is not set, we use the default constant XMLS_PREFIX
if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) {
// Enable prefix override
$query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query );
} else {
// Use default replacement
$query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query );
}
}
$this->queries[$id] = trim( $query );
}
// Return the query set array
return $this->queries;
}
/**
* Rebuilds the query with the prefix attached to any objects
*
* @param string $regex Regex used to add prefix
* @param string $query SQL query string
* @param string $prefix Prefix to be appended to tables, indices, etc.
* @return string Prefixed SQL query string.
*/
function prefixQuery( $regex, $query, $prefix = NULL ) {
if( !isset( $prefix ) ) {
return $query;
}
if( preg_match( $regex, $query, $match ) ) {
$preamble = $match[1];
$postamble = $match[5];
$objectList = explode( ',', $match[3] );
// $prefix = $prefix . '_';
$prefixedList = '';
foreach( $objectList as $object ) {
if( $prefixedList !== '' ) {
$prefixedList .= ', ';
}
$prefixedList .= $prefix . trim( $object );
}
$query = $preamble . ' ' . $prefixedList . ' ' . $postamble;
}
return $query;
}
}
 
/**
* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements
*
* This class is used to load and parse the XML file, to create an array of SQL statements
* that can be used to build a database, and to build the database using the SQL array.
*
* @tutorial getting_started.pkg
*
* @author Richard Tango-Lowy & Dan Cech
* @version $Revision: 1.62 $
*
* @package axmls
*/
class adoSchema {
/**
* @var array Array containing SQL queries to generate all objects
* @access private
*/
var $sqlArray;
/**
* @var object ADOdb connection object
* @access private
*/
var $db;
/**
* @var object ADOdb Data Dictionary
* @access private
*/
var $dict;
/**
* @var string Current XML element
* @access private
*/
var $currentElement = '';
/**
* @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database
* @access private
*/
var $upgrade = '';
/**
* @var string Optional object prefix
* @access private
*/
var $objectPrefix = '';
/**
* @var long Original Magic Quotes Runtime value
* @access private
*/
var $mgq;
/**
* @var long System debug
* @access private
*/
var $debug;
/**
* @var string Regular expression to find schema version
* @access private
*/
var $versionRegex = '/<schema.*?( version="([^"]*)")?.*?>/';
/**
* @var string Current schema version
* @access private
*/
var $schemaVersion;
/**
* @var int Success of last Schema execution
*/
var $success;
/**
* @var bool Execute SQL inline as it is generated
*/
var $executeInline;
/**
* @var bool Continue SQL execution if errors occur
*/
var $continueOnError;
/**
* @var int How to handle existing data rows (insert, update, or ignore)
*/
var $existingData;
/**
* Creates an adoSchema object
*
* Creating an adoSchema object is the first step in processing an XML schema.
* The only parameter is an ADOdb database connection object, which must already
* have been created.
*
* @param object $db ADOdb database connection object.
*/
function adoSchema( &$db ) {
// Initialize the environment
$this->mgq = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
$this->db =& $db;
$this->debug = $this->db->debug;
$this->dict = NewDataDictionary( $this->db );
$this->sqlArray = array();
$this->schemaVersion = XMLS_SCHEMA_VERSION;
$this->executeInline( XMLS_EXECUTE_INLINE );
$this->continueOnError( XMLS_CONTINUE_ON_ERROR );
$this->existingData( XMLS_EXISTING_DATA );
$this->setUpgradeMethod();
}
/**
* Sets the method to be used for upgrading an existing database
*
* Use this method to specify how existing database objects should be upgraded.
* The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to
* alter each database object directly, REPLACE attempts to rebuild each object
* from scratch, BEST attempts to determine the best upgrade method for each
* object, and NONE disables upgrading.
*
* This method is not yet used by AXMLS, but exists for backward compatibility.
* The ALTER method is automatically assumed when the adoSchema object is
* instantiated; other upgrade methods are not currently supported.
*
* @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE)
* @returns string Upgrade method used
*/
function SetUpgradeMethod( $method = '' ) {
if( !is_string( $method ) ) {
return FALSE;
}
$method = strtoupper( $method );
// Handle the upgrade methods
switch( $method ) {
case 'ALTER':
$this->upgrade = $method;
break;
case 'REPLACE':
$this->upgrade = $method;
break;
case 'BEST':
$this->upgrade = 'ALTER';
break;
case 'NONE':
$this->upgrade = 'NONE';
break;
default:
// Use default if no legitimate method is passed.
$this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD;
}
return $this->upgrade;
}
/**
* Specifies how to handle existing data row when there is a unique key conflict.
*
* The existingData setting specifies how the parser should handle existing rows
* when a unique key violation occurs during the insert. This can happen when inserting
* data into an existing table with one or more primary keys or unique indexes.
* The existingData method takes one of three options: XMLS_MODE_INSERT attempts
* to always insert the data as a new row. In the event of a unique key violation,
* the database will generate an error. XMLS_MODE_UPDATE attempts to update the
* any existing rows with the new data based upon primary or unique key fields in
* the schema. If the data row in the schema specifies no unique fields, the row
* data will be inserted as a new row. XMLS_MODE_IGNORE specifies that any data rows
* that would result in a unique key violation be ignored; no inserts or updates will
* take place. For backward compatibility, the default setting is XMLS_MODE_INSERT,
* but XMLS_MODE_UPDATE will generally be the most appropriate setting.
*
* @param int $mode XMLS_MODE_INSERT, XMLS_MODE_UPDATE, or XMLS_MODE_IGNORE
* @return int current mode
*/
function ExistingData( $mode = NULL ) {
if( is_int( $mode ) ) {
switch( $mode ) {
case XMLS_MODE_UPDATE:
$mode = XMLS_MODE_UPDATE;
break;
case XMLS_MODE_IGNORE:
$mode = XMLS_MODE_IGNORE;
break;
case XMLS_MODE_INSERT:
$mode = XMLS_MODE_INSERT;
break;
default:
$mode = XMLS_EXISITNG_DATA;
break;
}
$this->existingData = $mode;
}
return $this->existingData;
}
/**
* Enables/disables inline SQL execution.
*
* Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution),
* AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode
* is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema()
* to apply the schema to the database.
*
* @param bool $mode execute
* @return bool current execution mode
*
* @see ParseSchema(), ExecuteSchema()
*/
function ExecuteInline( $mode = NULL ) {
if( is_bool( $mode ) ) {
$this->executeInline = $mode;
}
return $this->executeInline;
}
/**
* Enables/disables SQL continue on error.
*
* Call this method to enable or disable continuation of SQL execution if an error occurs.
* If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs.
* If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing
* of the schema will continue.
*
* @param bool $mode execute
* @return bool current continueOnError mode
*
* @see addSQL(), ExecuteSchema()
*/
function ContinueOnError( $mode = NULL ) {
if( is_bool( $mode ) ) {
$this->continueOnError = $mode;
}
return $this->continueOnError;
}
/**
* Loads an XML schema from a file and converts it to SQL.
*
* Call this method to load the specified schema (see the DTD for the proper format) from
* the filesystem and generate the SQL necessary to create the database
* described. This method automatically converts the schema to the latest
* axmls schema version.
* @see ParseSchemaString()
*
* @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute
*/
function ParseSchema( $filename, $returnSchema = FALSE ) {
return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
}
/**
* Loads an XML schema from a file and converts it to SQL.
*
* Call this method to load the specified schema directly from a file (see
* the DTD for the proper format) and generate the SQL necessary to create
* the database described by the schema. Use this method when you are dealing
* with large schema files. Otherwise, ParseSchema() is faster.
* This method does not automatically convert the schema to the latest axmls
* schema version. You must convert the schema manually using either the
* ConvertSchemaFile() or ConvertSchemaString() method.
* @see ParseSchema()
* @see ConvertSchemaFile()
* @see ConvertSchemaString()
*
* @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute.
*
* @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString()
* @see ParseSchema(), ParseSchemaString()
*/
function ParseSchemaFile( $filename, $returnSchema = FALSE ) {
// Open the file
if( !($fp = fopen( $filename, 'r' )) ) {
logMsg( 'Unable to open file' );
return FALSE;
}
// do version detection here
if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) {
logMsg( 'Invalid Schema Version' );
return FALSE;
}
if( $returnSchema ) {
$xmlstring = '';
while( $data = fread( $fp, 4096 ) ) {
$xmlstring .= $data . "\n";
}
return $xmlstring;
}
$this->success = 2;
$xmlParser = $this->create_parser();
// Process the file
while( $data = fread( $fp, 4096 ) ) {
if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) {
die( sprintf(
"XML error: %s at line %d",
xml_error_string( xml_get_error_code( $xmlParser) ),
xml_get_current_line_number( $xmlParser)
) );
}
}
xml_parser_free( $xmlParser );
return $this->sqlArray;
}
/**
* Converts an XML schema string to SQL.
*
* Call this method to parse a string containing an XML schema (see the DTD for the proper format)
* and generate the SQL necessary to create the database described by the schema.
* @see ParseSchema()
*
* @param string $xmlstring XML schema string.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute.
*/
function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) {
if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
logMsg( 'Empty or Invalid Schema' );
return FALSE;
}
// do version detection here
if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) {
logMsg( 'Invalid Schema Version' );
return FALSE;
}
if( $returnSchema ) {
return $xmlstring;
}
$this->success = 2;
$xmlParser = $this->create_parser();
if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) {
die( sprintf(
"XML error: %s at line %d",
xml_error_string( xml_get_error_code( $xmlParser) ),
xml_get_current_line_number( $xmlParser)
) );
}
xml_parser_free( $xmlParser );
return $this->sqlArray;
}
/**
* Loads an XML schema from a file and converts it to uninstallation SQL.
*
* Call this method to load the specified schema (see the DTD for the proper format) from
* the filesystem and generate the SQL necessary to remove the database described.
* @see RemoveSchemaString()
*
* @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute
*/
function RemoveSchema( $filename, $returnSchema = FALSE ) {
return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
}
/**
* Converts an XML schema string to uninstallation SQL.
*
* Call this method to parse a string containing an XML schema (see the DTD for the proper format)
* and generate the SQL necessary to uninstall the database described by the schema.
* @see RemoveSchema()
*
* @param string $schema XML schema string.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute.
*/
function RemoveSchemaString( $schema, $returnSchema = FALSE ) {
// grab current version
if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
return FALSE;
}
return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema );
}
/**
* Applies the current XML schema to the database (post execution).
*
* Call this method to apply the current schema (generally created by calling
* ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes,
* and executing other SQL specified in the schema) after parsing.
* @see ParseSchema(), ParseSchemaString(), ExecuteInline()
*
* @param array $sqlArray Array of SQL statements that will be applied rather than
* the current schema.
* @param boolean $continueOnErr Continue to apply the schema even if an error occurs.
* @returns integer 0 if failure, 1 if errors, 2 if successful.
*/
function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) {
if( !is_bool( $continueOnErr ) ) {
$continueOnErr = $this->ContinueOnError();
}
if( !isset( $sqlArray ) ) {
$sqlArray = $this->sqlArray;
}
if( !is_array( $sqlArray ) ) {
$this->success = 0;
} else {
$this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr );
}
return $this->success;
}
/**
* Returns the current SQL array.
*
* Call this method to fetch the array of SQL queries resulting from
* ParseSchema() or ParseSchemaString().
*
* @param string $format Format: HTML, TEXT, or NONE (PHP array)
* @return array Array of SQL statements or FALSE if an error occurs
*/
function PrintSQL( $format = 'NONE' ) {
$sqlArray = null;
return $this->getSQL( $format, $sqlArray );
}
/**
* Saves the current SQL array to the local filesystem as a list of SQL queries.
*
* Call this method to save the array of SQL queries (generally resulting from a
* parsed XML schema) to the filesystem.
*
* @param string $filename Path and name where the file should be saved.
* @return boolean TRUE if save is successful, else FALSE.
*/
function SaveSQL( $filename = './schema.sql' ) {
if( !isset( $sqlArray ) ) {
$sqlArray = $this->sqlArray;
}
if( !isset( $sqlArray ) ) {
return FALSE;
}
$fp = fopen( $filename, "w" );
foreach( $sqlArray as $key => $query ) {
fwrite( $fp, $query . ";\n" );
}
fclose( $fp );
}
/**
* Create an xml parser
*
* @return object PHP XML parser object
*
* @access private
*/
function &create_parser() {
// Create the parser
$xmlParser = xml_parser_create();
xml_set_object( $xmlParser, $this );
// Initialize the XML callback functions
xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' );
xml_set_character_data_handler( $xmlParser, '_tag_cdata' );
return $xmlParser;
}
/**
* XML Callback to process start elements
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
switch( strtoupper( $tag ) ) {
case 'TABLE':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
$this->obj = new dbTable( $this, $attributes );
xml_set_object( $parser, $this->obj );
}
break;
case 'SQL':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
$this->obj = new dbQuerySet( $this, $attributes );
xml_set_object( $parser, $this->obj );
}
break;
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
}
/**
* XML Callback to process end elements
*
* @access private
* @internal
*/
function _tag_close( &$parser, $tag ) {
}
/**
* Converts an XML schema string to the specified DTD version.
*
* Call this method to convert a string containing an XML schema to a different AXMLS
* DTD version. For instance, to convert a schema created for an pre-1.0 version for
* AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version
* parameter is specified, the schema will be converted to the current DTD version.
* If the newFile parameter is provided, the converted schema will be written to the specified
* file.
* @see ConvertSchemaFile()
*
* @param string $schema String containing XML schema that will be converted.
* @param string $newVersion DTD version to convert to.
* @param string $newFile File name of (converted) output file.
* @return string Converted XML schema or FALSE if an error occurs.
*/
function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) {
// grab current version
if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
return FALSE;
}
if( !isset ($newVersion) ) {
$newVersion = $this->schemaVersion;
}
if( $version == $newVersion ) {
$result = $schema;
} else {
$result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion);
}
if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
fwrite( $fp, $result );
fclose( $fp );
}
return $result;
}
 
/*
// compat for pre-4.3 - jlim
function _file_get_contents($path)
{
if (function_exists('file_get_contents')) return file_get_contents($path);
return join('',file($path));
}*/
/**
* Converts an XML schema file to the specified DTD version.
*
* Call this method to convert the specified XML schema file to a different AXMLS
* DTD version. For instance, to convert a schema created for an pre-1.0 version for
* AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version
* parameter is specified, the schema will be converted to the current DTD version.
* If the newFile parameter is provided, the converted schema will be written to the specified
* file.
* @see ConvertSchemaString()
*
* @param string $filename Name of XML schema file that will be converted.
* @param string $newVersion DTD version to convert to.
* @param string $newFile File name of (converted) output file.
* @return string Converted XML schema or FALSE if an error occurs.
*/
function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) {
// grab current version
if( !( $version = $this->SchemaFileVersion( $filename ) ) ) {
return FALSE;
}
if( !isset ($newVersion) ) {
$newVersion = $this->schemaVersion;
}
if( $version == $newVersion ) {
$result = _file_get_contents( $filename );
// remove unicode BOM if present
if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) {
$result = substr( $result, 3 );
}
} else {
$result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' );
}
if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
fwrite( $fp, $result );
fclose( $fp );
}
return $result;
}
function TransformSchema( $schema, $xsl, $schematype='string' )
{
// Fail if XSLT extension is not available
if( ! function_exists( 'xslt_create' ) ) {
return FALSE;
}
$xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl';
// look for xsl
if( !is_readable( $xsl_file ) ) {
return FALSE;
}
switch( $schematype )
{
case 'file':
if( !is_readable( $schema ) ) {
return FALSE;
}
$schema = _file_get_contents( $schema );
break;
case 'string':
default:
if( !is_string( $schema ) ) {
return FALSE;
}
}
$arguments = array (
'/_xml' => $schema,
'/_xsl' => _file_get_contents( $xsl_file )
);
// create an XSLT processor
$xh = xslt_create ();
// set error handler
xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler'));
// process the schema
$result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
xslt_free ($xh);
return $result;
}
/**
* Processes XSLT transformation errors
*
* @param object $parser XML parser object
* @param integer $errno Error number
* @param integer $level Error level
* @param array $fields Error information fields
*
* @access private
*/
function xslt_error_handler( $parser, $errno, $level, $fields ) {
if( is_array( $fields ) ) {
$msg = array(
'Message Type' => ucfirst( $fields['msgtype'] ),
'Message Code' => $fields['code'],
'Message' => $fields['msg'],
'Error Number' => $errno,
'Level' => $level
);
switch( $fields['URI'] ) {
case 'arg:/_xml':
$msg['Input'] = 'XML';
break;
case 'arg:/_xsl':
$msg['Input'] = 'XSL';
break;
default:
$msg['Input'] = $fields['URI'];
}
$msg['Line'] = $fields['line'];
} else {
$msg = array(
'Message Type' => 'Error',
'Error Number' => $errno,
'Level' => $level,
'Fields' => var_export( $fields, TRUE )
);
}
$error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n"
. '<table>' . "\n";
foreach( $msg as $label => $details ) {
$error_details .= '<tr><td><b>' . $label . ': </b></td><td>' . htmlentities( $details ) . '</td></tr>' . "\n";
}
$error_details .= '</table>';
trigger_error( $error_details, E_USER_ERROR );
}
/**
* Returns the AXMLS Schema Version of the requested XML schema file.
*
* Call this method to obtain the AXMLS DTD version of the requested XML schema file.
* @see SchemaStringVersion()
*
* @param string $filename AXMLS schema file
* @return string Schema version number or FALSE on error
*/
function SchemaFileVersion( $filename ) {
// Open the file
if( !($fp = fopen( $filename, 'r' )) ) {
// die( 'Unable to open file' );
return FALSE;
}
// Process the file
while( $data = fread( $fp, 4096 ) ) {
if( preg_match( $this->versionRegex, $data, $matches ) ) {
return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION;
}
}
return FALSE;
}
/**
* Returns the AXMLS Schema Version of the provided XML schema string.
*
* Call this method to obtain the AXMLS DTD version of the provided XML schema string.
* @see SchemaFileVersion()
*
* @param string $xmlstring XML schema string
* @return string Schema version number or FALSE on error
*/
function SchemaStringVersion( $xmlstring ) {
if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
return FALSE;
}
if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) {
return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION;
}
return FALSE;
}
/**
* Extracts an XML schema from an existing database.
*
* Call this method to create an XML schema string from an existing database.
* If the data parameter is set to TRUE, AXMLS will include the data from the database
* in the schema.
*
* @param boolean $data Include data in schema dump
* @return string Generated XML schema
*/
function ExtractSchema( $data = FALSE, $indent = ' ' ) {
$old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM );
$schema = '<?xml version="1.0"?>' . "\n"
. '<schema version="' . $this->schemaVersion . '">' . "\n";
if( is_array( $tables = $this->db->MetaTables( 'TABLES' ) ) ) {
foreach( $tables as $table ) {
$schema .= $indent . '<table name="' . htmlentities( $table ) . '">' . "\n";
// grab details from database
$rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE -1' );
$fields = $this->db->MetaColumns( $table );
$indexes = $this->db->MetaIndexes( $table );
if( is_array( $fields ) ) {
foreach( $fields as $details ) {
$extra = '';
$content = array();
if( isset($details->max_length) && $details->max_length > 0 ) {
$extra .= ' size="' . $details->max_length . '"';
}
if( isset($details->primary_key) && $details->primary_key ) {
$content[] = '<KEY/>';
} elseif( isset($details->not_null) && $details->not_null ) {
$content[] = '<NOTNULL/>';
}
if( isset($details->has_default) && $details->has_default ) {
$content[] = '<DEFAULT value="' . htmlentities( $details->default_value ) . '"/>';
}
if( isset($details->auto_increment) && $details->auto_increment ) {
$content[] = '<AUTOINCREMENT/>';
}
if( isset($details->unsigned) && $details->unsigned ) {
$content[] = '<UNSIGNED/>';
}
// this stops the creation of 'R' columns,
// AUTOINCREMENT is used to create auto columns
$details->primary_key = 0;
$type = $rs->MetaType( $details );
$schema .= str_repeat( $indent, 2 ) . '<field name="' . htmlentities( $details->name ) . '" type="' . $type . '"' . $extra;
if( !empty( $content ) ) {
$schema .= ">\n" . str_repeat( $indent, 3 )
. implode( "\n" . str_repeat( $indent, 3 ), $content ) . "\n"
. str_repeat( $indent, 2 ) . '</field>' . "\n";
} else {
$schema .= "/>\n";
}
}
}
if( is_array( $indexes ) ) {
foreach( $indexes as $index => $details ) {
$schema .= str_repeat( $indent, 2 ) . '<index name="' . $index . '">' . "\n";
if( $details['unique'] ) {
$schema .= str_repeat( $indent, 3 ) . '<UNIQUE/>' . "\n";
}
foreach( $details['columns'] as $column ) {
$schema .= str_repeat( $indent, 3 ) . '<col>' . htmlentities( $column ) . '</col>' . "\n";
}
$schema .= str_repeat( $indent, 2 ) . '</index>' . "\n";
}
}
if( $data ) {
$rs = $this->db->Execute( 'SELECT * FROM ' . $table );
if( is_object( $rs ) && !$rs->EOF ) {
$schema .= str_repeat( $indent, 2 ) . "<data>\n";
while( $row = $rs->FetchRow() ) {
foreach( $row as $key => $val ) {
if ( $val != htmlentities( $val ) ) {
$row[$key] = '<![CDATA[' . $val . ']]>';
}
}
$schema .= str_repeat( $indent, 3 ) . '<row><f>' . implode( '</f><f>', $row ) . "</f></row>\n";
}
$schema .= str_repeat( $indent, 2 ) . "</data>\n";
}
}
$schema .= $indent . "</table>\n";
}
}
$this->db->SetFetchMode( $old_mode );
$schema .= '</schema>';
return $schema;
}
/**
* Sets a prefix for database objects
*
* Call this method to set a standard prefix that will be prepended to all database tables
* and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix.
*
* @param string $prefix Prefix that will be prepended.
* @param boolean $underscore If TRUE, automatically append an underscore character to the prefix.
* @return boolean TRUE if successful, else FALSE
*/
function SetPrefix( $prefix = '', $underscore = TRUE ) {
switch( TRUE ) {
// clear prefix
case empty( $prefix ):
logMsg( 'Cleared prefix' );
$this->objectPrefix = '';
return TRUE;
// prefix too long
case strlen( $prefix ) > XMLS_PREFIX_MAXLEN:
// prefix contains invalid characters
case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ):
logMsg( 'Invalid prefix: ' . $prefix );
return FALSE;
}
if( $underscore AND substr( $prefix, -1 ) != '_' ) {
$prefix .= '_';
}
// prefix valid
logMsg( 'Set prefix: ' . $prefix );
$this->objectPrefix = $prefix;
return TRUE;
}
/**
* Returns an object name with the current prefix prepended.
*
* @param string $name Name
* @return string Prefixed name
*
* @access private
*/
function prefix( $name = '' ) {
// if prefix is set
if( !empty( $this->objectPrefix ) ) {
// Prepend the object prefix to the table name
// prepend after quote if used
return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name );
}
// No prefix set. Use name provided.
return $name;
}
/**
* Checks if element references a specific platform
*
* @param string $platform Requested platform
* @returns boolean TRUE if platform check succeeds
*
* @access private
*/
function supportedPlatform( $platform = NULL ) {
if( !empty( $platform ) ) {
$regex = '/(^|\|)' . $this->db->databaseType . '(\||$)/i';
if( preg_match( '/^- /', $platform ) ) {
if (preg_match ( $regex, substr( $platform, 2 ) ) ) {
logMsg( 'Platform ' . $platform . ' is NOT supported' );
return FALSE;
}
} else {
if( !preg_match ( $regex, $platform ) ) {
logMsg( 'Platform ' . $platform . ' is NOT supported' );
return FALSE;
}
}
}
logMsg( 'Platform ' . $platform . ' is supported' );
return TRUE;
}
/**
* Clears the array of generated SQL.
*
* @access private
*/
function clearSQL() {
$this->sqlArray = array();
}
/**
* Adds SQL into the SQL array.
*
* @param mixed $sql SQL to Add
* @return boolean TRUE if successful, else FALSE.
*
* @access private
*/
function addSQL( $sql = NULL ) {
if( is_array( $sql ) ) {
foreach( $sql as $line ) {
$this->addSQL( $line );
}
return TRUE;
}
if( is_string( $sql ) ) {
$this->sqlArray[] = $sql;
// if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL.
if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) {
$saved = $this->db->debug;
$this->db->debug = $this->debug;
$ok = $this->db->Execute( $sql );
$this->db->debug = $saved;
if( !$ok ) {
if( $this->debug ) {
ADOConnection::outp( $this->db->ErrorMsg() );
}
$this->success = 1;
}
}
return TRUE;
}
return FALSE;
}
/**
* Gets the SQL array in the specified format.
*
* @param string $format Format
* @return mixed SQL
*
* @access private
*/
function getSQL( $format = NULL, $sqlArray = NULL ) {
if( !is_array( $sqlArray ) ) {
$sqlArray = $this->sqlArray;
}
if( !is_array( $sqlArray ) ) {
return FALSE;
}
switch( strtolower( $format ) ) {
case 'string':
case 'text':
return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : '';
case'html':
return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : '';
}
return $this->sqlArray;
}
/**
* Destroys an adoSchema object.
*
* Call this method to clean up after an adoSchema object that is no longer in use.
* @deprecated adoSchema now cleans up automatically.
*/
function Destroy() {
set_magic_quotes_runtime( $this->mgq );
unset( $this );
}
}
 
/**
* Message logging function
*
* @access private
*/
function logMsg( $msg, $title = NULL, $force = FALSE ) {
if( XMLS_DEBUG or $force ) {
echo '<pre>';
if( isset( $title ) ) {
echo '<h3>' . htmlentities( $title ) . '</h3>';
}
if( @is_object( $this ) ) {
echo '[' . get_class( $this ) . '] ';
}
print_r( $msg );
echo '</pre>';
}
}
?>
/web/kaklik's_web/torrentflux/adodb/adodb.inc.php
0,0 → 1,4007
<?php
/*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://adodb.sourceforge.net
*
* This is the main include file for ADOdb.
* Database specific drivers are stored in the adodb/drivers/adodb-*.inc.php
*
* The ADOdb files are formatted so that doxygen can be used to generate documentation.
* Doxygen is a documentation generation tool and can be downloaded from http://doxygen.org/
*/
 
/**
\mainpage
@version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
 
Released under both BSD license and Lesser GPL library license. You can choose which license
you prefer.
PHP's database access functions are not standardised. This creates a need for a database
class library to hide the differences between the different database API's (encapsulate
the differences) so we can easily switch databases.
 
We currently support MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, DB2,
Informix, PostgreSQL, FrontBase, Interbase (Firebird and Borland variants), Foxpro, Access,
ADO, SAP DB, SQLite and ODBC. We have had successful reports of connecting to Progress and
other databases via ODBC.
 
Latest Download at http://adodb.sourceforge.net/
*/
if (!defined('_ADODB_LAYER')) {
define('_ADODB_LAYER',1);
//==============================================================================================
// CONSTANT DEFINITIONS
//==============================================================================================
 
 
/**
* Set ADODB_DIR to the directory where this file resides...
* This constant was formerly called $ADODB_RootPath
*/
if (!defined('ADODB_DIR')) define('ADODB_DIR',dirname(__FILE__));
//==============================================================================================
// GLOBAL VARIABLES
//==============================================================================================
 
GLOBAL
$ADODB_vers, // database version
$ADODB_COUNTRECS, // count number of records returned - slows down query
$ADODB_CACHE_DIR, // directory to cache recordsets
$ADODB_EXTENSION, // ADODB extension installed
$ADODB_COMPAT_FETCH, // If $ADODB_COUNTRECS and this is true, $rs->fields is available on EOF
$ADODB_FETCH_MODE; // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default...
//==============================================================================================
// GLOBAL SETUP
//==============================================================================================
$ADODB_EXTENSION = defined('ADODB_EXTENSION');
//********************************************************//
/*
Controls $ADODB_FORCE_TYPE mode. Default is ADODB_FORCE_VALUE (3).
Used in GetUpdateSql and GetInsertSql functions. Thx to Niko, nuko#mbnet.fi
 
0 = ignore empty fields. All empty fields in array are ignored.
1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values.
2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values.
3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and empty fields '' are set to empty '' sql values.
*/
define('ADODB_FORCE_IGNORE',0);
define('ADODB_FORCE_NULL',1);
define('ADODB_FORCE_EMPTY',2);
define('ADODB_FORCE_VALUE',3);
//********************************************************//
 
 
if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) {
define('ADODB_BAD_RS','<p>Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;</p>');
// allow [ ] @ ` " and . in table names
define('ADODB_TABLE_REGEX','([]0-9a-z_\:\"\`\.\@\[-]*)');
// prefetching used by oracle
if (!defined('ADODB_PREFETCH_ROWS')) define('ADODB_PREFETCH_ROWS',10);
/*
Controls ADODB_FETCH_ASSOC field-name case. Default is 2, use native case-names.
This currently works only with mssql, odbc, oci8po and ibase derived drivers.
0 = assoc lowercase field names. $rs->fields['orderid']
1 = assoc uppercase field names. $rs->fields['ORDERID']
2 = use native-case field names. $rs->fields['OrderID']
*/
define('ADODB_FETCH_DEFAULT',0);
define('ADODB_FETCH_NUM',1);
define('ADODB_FETCH_ASSOC',2);
define('ADODB_FETCH_BOTH',3);
if (!defined('TIMESTAMP_FIRST_YEAR')) define('TIMESTAMP_FIRST_YEAR',100);
// PHP's version scheme makes converting to numbers difficult - workaround
$_adodb_ver = (float) PHP_VERSION;
if ($_adodb_ver >= 5.0) {
define('ADODB_PHPVER',0x5000);
} else if ($_adodb_ver > 4.299999) { # 4.3
define('ADODB_PHPVER',0x4300);
} else if ($_adodb_ver > 4.199999) { # 4.2
define('ADODB_PHPVER',0x4200);
} else if (strnatcmp(PHP_VERSION,'4.0.5')>=0) {
define('ADODB_PHPVER',0x4050);
} else {
define('ADODB_PHPVER',0x4000);
}
}
//if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2);
 
/**
Accepts $src and $dest arrays, replacing string $data
*/
function ADODB_str_replace($src, $dest, $data)
{
if (ADODB_PHPVER >= 0x4050) return str_replace($src,$dest,$data);
$s = reset($src);
$d = reset($dest);
while ($s !== false) {
$data = str_replace($s,$d,$data);
$s = next($src);
$d = next($dest);
}
return $data;
}
function ADODB_Setup()
{
GLOBAL
$ADODB_vers, // database version
$ADODB_COUNTRECS, // count number of records returned - slows down query
$ADODB_CACHE_DIR, // directory to cache recordsets
$ADODB_FETCH_MODE,
$ADODB_FORCE_TYPE;
$ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT;
$ADODB_FORCE_TYPE = ADODB_FORCE_VALUE;
 
 
if (!isset($ADODB_CACHE_DIR)) {
$ADODB_CACHE_DIR = '/tmp'; //(isset($_ENV['TMP'])) ? $_ENV['TMP'] : '/tmp';
} else {
// do not accept url based paths, eg. http:/ or ftp:/
if (strpos($ADODB_CACHE_DIR,'://') !== false)
die("Illegal path http:// or ftp://");
}
// Initialize random number generator for randomizing cache flushes
srand(((double)microtime())*1000000);
/**
* ADODB version as a string.
*/
$ADODB_vers = 'V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved. Released BSD & LGPL.';
/**
* Determines whether recordset->RecordCount() is used.
* Set to false for highest performance -- RecordCount() will always return -1 then
* for databases that provide "virtual" recordcounts...
*/
if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS = true;
}
//==============================================================================================
// CHANGE NOTHING BELOW UNLESS YOU ARE DESIGNING ADODB
//==============================================================================================
ADODB_Setup();
 
//==============================================================================================
// CLASS ADOFieldObject
//==============================================================================================
/**
* Helper class for FetchFields -- holds info on a column
*/
class ADOFieldObject {
var $name = '';
var $max_length=0;
var $type="";
/*
// additional fields by dannym... (danny_milo@yahoo.com)
var $not_null = false;
// actually, this has already been built-in in the postgres, fbsql AND mysql module? ^-^
// so we can as well make not_null standard (leaving it at "false" does not harm anyways)
 
var $has_default = false; // this one I have done only in mysql and postgres for now ...
// others to come (dannym)
var $default_value; // default, if any, and supported. Check has_default first.
*/
}
 
function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection)
{
//print "Errorno ($fn errno=$errno m=$errmsg) ";
$thisConnection->_transOK = false;
if ($thisConnection->_oldRaiseFn) {
$fn = $thisConnection->_oldRaiseFn;
$fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection);
}
}
//==============================================================================================
// CLASS ADOConnection
//==============================================================================================
/**
* Connection object. For connecting to databases, and executing queries.
*/
class ADOConnection {
//
// PUBLIC VARS
//
var $dataProvider = 'native';
var $databaseType = ''; /// RDBMS currently in use, eg. odbc, mysql, mssql
var $database = ''; /// Name of database to be used.
var $host = ''; /// The hostname of the database server
var $user = ''; /// The username which is used to connect to the database server.
var $password = ''; /// Password for the username. For security, we no longer store it.
var $debug = false; /// if set to true will output sql statements
var $maxblobsize = 262144; /// maximum size of blobs or large text fields (262144 = 256K)-- some db's die otherwise like foxpro
var $concat_operator = '+'; /// default concat operator -- change to || for Oracle/Interbase
var $substr = 'substr'; /// substring operator
var $length = 'length'; /// string length ofperator
var $random = 'rand()'; /// random function
var $upperCase = 'upper'; /// uppercase function
var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database
var $fmtTimeStamp = "'Y-m-d, h:i:s A'"; /// used by DBTimeStamp as the default timestamp fmt.
var $true = '1'; /// string that represents TRUE for a database
var $false = '0'; /// string that represents FALSE for a database
var $replaceQuote = "\\'"; /// string to use to replace quotes
var $nameQuote = '"'; /// string to use to quote identifiers and names
var $charSet=false; /// character set to use - only for interbase, postgres and oci8
var $metaDatabasesSQL = '';
var $metaTablesSQL = '';
var $uniqueOrderBy = false; /// All order by columns have to be unique
var $emptyDate = '&nbsp;';
var $emptyTimeStamp = '&nbsp;';
var $lastInsID = false;
//--
var $hasInsertID = false; /// supports autoincrement ID?
var $hasAffectedRows = false; /// supports affected rows for update/delete?
var $hasTop = false; /// support mssql/access SELECT TOP 10 * FROM TABLE
var $hasLimit = false; /// support pgsql/mysql SELECT * FROM TABLE LIMIT 10
var $readOnly = false; /// this is a readonly database - used by phpLens
var $hasMoveFirst = false; /// has ability to run MoveFirst(), scrolling backwards
var $hasGenID = false; /// can generate sequences using GenID();
var $hasTransactions = true; /// has transactions
//--
var $genID = 0; /// sequence id used by GenID();
var $raiseErrorFn = false; /// error function to call
var $isoDates = false; /// accepts dates in ISO format
var $cacheSecs = 3600; /// cache for 1 hour
var $sysDate = false; /// name of function that returns the current date
var $sysTimeStamp = false; /// name of function that returns the current timestamp
var $arrayClass = 'ADORecordSet_array'; /// name of class used to generate array recordsets, which are pre-downloaded recordsets
var $noNullStrings = false; /// oracle specific stuff - if true ensures that '' is converted to ' '
var $numCacheHits = 0;
var $numCacheMisses = 0;
var $pageExecuteCountRows = true;
var $uniqueSort = false; /// indicates that all fields in order by must be unique
var $leftOuter = false; /// operator to use for left outer join in WHERE clause
var $rightOuter = false; /// operator to use for right outer join in WHERE clause
var $ansiOuter = false; /// whether ansi outer join syntax supported
var $autoRollback = false; // autoRollback on PConnect().
var $poorAffectedRows = false; // affectedRows not working or unreliable
var $fnExecute = false;
var $fnCacheExecute = false;
var $blobEncodeType = false; // false=not required, 'I'=encode to integer, 'C'=encode to char
var $rsPrefix = "ADORecordSet_";
var $autoCommit = true; /// do not modify this yourself - actually private
var $transOff = 0; /// temporarily disable transactions
var $transCnt = 0; /// count of nested transactions
var $fetchMode=false;
//
// PRIVATE VARS
//
var $_oldRaiseFn = false;
var $_transOK = null;
var $_connectionID = false; /// The returned link identifier whenever a successful database connection is made.
var $_errorMsg = false; /// A variable which was used to keep the returned last error message. The value will
/// then returned by the errorMsg() function
var $_errorCode = false; /// Last error code, not guaranteed to be used - only by oci8
var $_queryID = false; /// This variable keeps the last created result link identifier
var $_isPersistentConnection = false; /// A boolean variable to state whether its a persistent connection or normal connection. */
var $_bindInputArray = false; /// set to true if ADOConnection.Execute() permits binding of array parameters.
var $_evalAll = false;
var $_affected = false;
var $_logsql = false;
/**
* Constructor
*/
function ADOConnection()
{
die('Virtual Class -- cannot instantiate');
}
function Version()
{
global $ADODB_vers;
return (float) substr($ADODB_vers,1);
}
/**
Get server version info...
@returns An array with 2 elements: $arr['string'] is the description string,
and $arr[version] is the version (also a string).
*/
function ServerInfo()
{
return array('description' => '', 'version' => '');
}
function IsConnected()
{
return !empty($this->_connectionID);
}
function _findvers($str)
{
if (preg_match('/([0-9]+\.([0-9\.])+)/',$str, $arr)) return $arr[1];
else return '';
}
/**
* All error messages go through this bottleneck function.
* You can define your own handler by defining the function name in ADODB_OUTP.
*/
function outp($msg,$newline=true)
{
global $ADODB_FLUSH,$ADODB_OUTP;
if (defined('ADODB_OUTP')) {
$fn = ADODB_OUTP;
$fn($msg,$newline);
return;
} else if (isset($ADODB_OUTP)) {
$fn = $ADODB_OUTP;
$fn($msg,$newline);
return;
}
if ($newline) $msg .= "<br>\n";
if (isset($_SERVER['HTTP_USER_AGENT']) || !$newline) echo $msg;
else echo strip_tags($msg);
if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // do not flush if output buffering enabled - useless - thx to Jesse Mullan
}
function Time()
{
$rs =& $this->_Execute("select $this->sysTimeStamp");
if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
return false;
}
/**
* Connect to database
*
* @param [argHostname] Host to connect to
* @param [argUsername] Userid to login
* @param [argPassword] Associated password
* @param [argDatabaseName] database
* @param [forceNew] force new connection
*
* @return true or false
*/
function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false)
{
if ($argHostname != "") $this->host = $argHostname;
if ($argUsername != "") $this->user = $argUsername;
if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons
if ($argDatabaseName != "") $this->database = $argDatabaseName;
$this->_isPersistentConnection = false;
if ($forceNew) {
if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true;
} else {
if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true;
}
if (isset($rez)) {
$err = $this->ErrorMsg();
if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
$ret = false;
} else {
$err = "Missing extension for ".$this->dataProvider;
$ret = 0;
}
if ($fn = $this->raiseErrorFn)
$fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
$this->_connectionID = false;
if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
return $ret;
}
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName);
}
/**
* Always force a new connection to database - currently only works with oracle
*
* @param [argHostname] Host to connect to
* @param [argUsername] Userid to login
* @param [argPassword] Associated password
* @param [argDatabaseName] database
*
* @return true or false
*/
function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
{
return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true);
}
/**
* Establish persistent connect to database
*
* @param [argHostname] Host to connect to
* @param [argUsername] Userid to login
* @param [argPassword] Associated password
* @param [argDatabaseName] database
*
* @return return true or false
*/
function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
{
if (defined('ADODB_NEVER_PERSIST'))
return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName);
if ($argHostname != "") $this->host = $argHostname;
if ($argUsername != "") $this->user = $argUsername;
if ($argPassword != "") $this->password = $argPassword;
if ($argDatabaseName != "") $this->database = $argDatabaseName;
$this->_isPersistentConnection = true;
if ($rez = $this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true;
if (isset($rez)) {
$err = $this->ErrorMsg();
if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
$ret = false;
} else {
$err = "Missing extension for ".$this->dataProvider;
$ret = 0;
}
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
}
$this->_connectionID = false;
if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
return $ret;
}
 
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysDate;
return $col; // child class implement
}
/**
* Should prepare the sql statement and return the stmt resource.
* For databases that do not support this, we return the $sql. To ensure
* compatibility with databases that do not support prepare:
*
* $stmt = $db->Prepare("insert into table (id, name) values (?,?)");
* $db->Execute($stmt,array(1,'Jill')) or die('insert failed');
* $db->Execute($stmt,array(2,'Joe')) or die('insert failed');
*
* @param sql SQL to send to database
*
* @return return FALSE, or the prepared statement, or the original sql if
* if the database does not support prepare.
*
*/
function Prepare($sql)
{
return $sql;
}
/**
* Some databases, eg. mssql require a different function for preparing
* stored procedures. So we cannot use Prepare().
*
* Should prepare the stored procedure and return the stmt resource.
* For databases that do not support this, we return the $sql. To ensure
* compatibility with databases that do not support prepare:
*
* @param sql SQL to send to database
*
* @return return FALSE, or the prepared statement, or the original sql if
* if the database does not support prepare.
*
*/
function PrepareSP($sql,$param=true)
{
return $this->Prepare($sql,$param);
}
/**
* PEAR DB Compat
*/
function Quote($s)
{
return $this->qstr($s,false);
}
/**
Requested by "Karsten Dambekalns" <k.dambekalns@fishfarm.de>
*/
function QMagic($s)
{
return $this->qstr($s,get_magic_quotes_gpc());
}
 
function q(&$s)
{
$s = $this->qstr($s,false);
}
/**
* PEAR DB Compat - do not use internally.
*/
function ErrorNative()
{
return $this->ErrorNo();
}
 
/**
* PEAR DB Compat - do not use internally.
*/
function nextId($seq_name)
{
return $this->GenID($seq_name);
}
 
/**
* Lock a row, will escalate and lock the table if row locking not supported
* will normally free the lock at the end of the transaction
*
* @param $table name of table to lock
* @param $where where clause to use, eg: "WHERE row=12". If left empty, will escalate to table lock
*/
function RowLock($table,$where)
{
return false;
}
function CommitLock($table)
{
return $this->CommitTrans();
}
function RollbackLock($table)
{
return $this->RollbackTrans();
}
/**
* PEAR DB Compat - do not use internally.
*
* The fetch modes for NUMERIC and ASSOC for PEAR DB and ADODB are identical
* for easy porting :-)
*
* @param mode The fetchmode ADODB_FETCH_ASSOC or ADODB_FETCH_NUM
* @returns The previous fetch mode
*/
function SetFetchMode($mode)
{
$old = $this->fetchMode;
$this->fetchMode = $mode;
if ($old === false) {
global $ADODB_FETCH_MODE;
return $ADODB_FETCH_MODE;
}
return $old;
}
 
/**
* PEAR DB Compat - do not use internally.
*/
function &Query($sql, $inputarr=false)
{
$rs = &$this->Execute($sql, $inputarr);
if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error();
return $rs;
}
 
/**
* PEAR DB Compat - do not use internally
*/
function &LimitQuery($sql, $offset, $count, $params=false)
{
$rs = &$this->SelectLimit($sql, $count, $offset, $params);
if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error();
return $rs;
}
 
/**
* PEAR DB Compat - do not use internally
*/
function Disconnect()
{
return $this->Close();
}
/*
Returns placeholder for parameter, eg.
$DB->Param('a')
will return ':a' for Oracle, and '?' for most other databases...
For databases that require positioned params, eg $1, $2, $3 for postgresql,
pass in Param(false) before setting the first parameter.
*/
function Param($name,$type='C')
{
return '?';
}
/*
InParameter and OutParameter are self-documenting versions of Parameter().
*/
function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
{
return $this->Parameter($stmt,$var,$name,false,$maxLen,$type);
}
/*
*/
function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
{
return $this->Parameter($stmt,$var,$name,true,$maxLen,$type);
}
/*
Usage in oracle
$stmt = $db->Prepare('select * from table where id =:myid and group=:group');
$db->Parameter($stmt,$id,'myid');
$db->Parameter($stmt,$group,'group',64);
$db->Execute();
@param $stmt Statement returned by Prepare() or PrepareSP().
@param $var PHP variable to bind to
@param $name Name of stored procedure variable name to bind to.
@param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8.
@param [$maxLen] Holds an maximum length of the variable.
@param [$type] The data type of $var. Legal values depend on driver.
 
*/
function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false)
{
return false;
}
/**
Improved method of initiating a transaction. Used together with CompleteTrans().
Advantages include:
a. StartTrans/CompleteTrans is nestable, unlike BeginTrans/CommitTrans/RollbackTrans.
Only the outermost block is treated as a transaction.<br>
b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.<br>
c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block
are disabled, making it backward compatible.
*/
function StartTrans($errfn = 'ADODB_TransMonitor')
{
if ($this->transOff > 0) {
$this->transOff += 1;
return;
}
$this->_oldRaiseFn = $this->raiseErrorFn;
$this->raiseErrorFn = $errfn;
$this->_transOK = true;
if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans");
$this->BeginTrans();
$this->transOff = 1;
}
/**
Used together with StartTrans() to end a transaction. Monitors connection
for sql errors, and will commit or rollback as appropriate.
@autoComplete if true, monitor sql errors and commit and rollback as appropriate,
and if set to false force rollback even if no SQL error detected.
@returns true on commit, false on rollback.
*/
function CompleteTrans($autoComplete = true)
{
if ($this->transOff > 1) {
$this->transOff -= 1;
return true;
}
$this->raiseErrorFn = $this->_oldRaiseFn;
$this->transOff = 0;
if ($this->_transOK && $autoComplete) {
if (!$this->CommitTrans()) {
$this->_transOK = false;
if ($this->debug) ADOConnection::outp("Smart Commit failed");
} else
if ($this->debug) ADOConnection::outp("Smart Commit occurred");
} else {
$this->_transOK = false;
$this->RollbackTrans();
if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred");
}
return $this->_transOK;
}
/*
At the end of a StartTrans/CompleteTrans block, perform a rollback.
*/
function FailTrans()
{
if ($this->debug)
if ($this->transOff == 0) {
ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans");
} else {
ADOConnection::outp("FailTrans was called");
adodb_backtrace();
}
$this->_transOK = false;
}
/**
Check if transaction has failed, only for Smart Transactions.
*/
function HasFailedTrans()
{
if ($this->transOff > 0) return $this->_transOK == false;
return false;
}
/**
* Execute SQL
*
* @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text)
* @param [inputarr] holds the input data to bind to. Null elements will be set to null.
* @return RecordSet or false
*/
function &Execute($sql,$inputarr=false)
{
if ($this->fnExecute) {
$fn = $this->fnExecute;
$ret =& $fn($this,$sql,$inputarr);
if (isset($ret)) return $ret;
}
if ($inputarr) {
if (!is_array($inputarr)) $inputarr = array($inputarr);
$element0 = reset($inputarr);
# is_object check because oci8 descriptors can be passed in
$array_2d = is_array($element0) && !is_object(reset($element0));
//remove extra memory copy of input -mikefedyk
unset($element0);
if (!is_array($sql) && !$this->_bindInputArray) {
$sqlarr = explode('?',$sql);
if (!$array_2d) $inputarr = array($inputarr);
foreach($inputarr as $arr) {
$sql = ''; $i = 0;
//Use each() instead of foreach to reduce memory usage -mikefedyk
while(list(, $v) = each($arr)) {
$sql .= $sqlarr[$i];
// from Ron Baldwin <ron.baldwin#sourceprose.com>
// Only quote string types
$typ = gettype($v);
if ($typ == 'string')
//New memory copy of input created here -mikefedyk
$sql .= $this->qstr($v);
else if ($typ == 'double')
$sql .= str_replace(',','.',$v); // locales fix so 1.1 does not get converted to 1,1
else if ($typ == 'boolean')
$sql .= $v ? $this->true : $this->false;
else if ($v === null)
$sql .= 'NULL';
else
$sql .= $v;
$i += 1;
}
if (isset($sqlarr[$i])) {
$sql .= $sqlarr[$i];
if ($i+1 != sizeof($sqlarr)) ADOConnection::outp( "Input Array does not match ?: ".htmlspecialchars($sql));
} else if ($i != sizeof($sqlarr))
ADOConnection::outp( "Input array does not match ?: ".htmlspecialchars($sql));
$ret =& $this->_Execute($sql);
if (!$ret) return $ret;
}
} else {
if ($array_2d) {
if (is_string($sql))
$stmt = $this->Prepare($sql);
else
$stmt = $sql;
foreach($inputarr as $arr) {
$ret =& $this->_Execute($stmt,$arr);
if (!$ret) return $ret;
}
} else {
$ret =& $this->_Execute($sql,$inputarr);
}
}
} else {
$ret =& $this->_Execute($sql,false);
}
 
return $ret;
}
function &_Execute($sql,$inputarr=false)
{
if ($this->debug) {
global $ADODB_INCLUDED_LIB;
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
$this->_queryID = _adodb_debug_execute($this, $sql,$inputarr);
} else {
$this->_queryID = @$this->_query($sql,$inputarr);
}
/************************
// OK, query executed
*************************/
 
if ($this->_queryID === false) { // error handling if query fails
if ($this->debug == 99) adodb_backtrace(true,5);
$fn = $this->raiseErrorFn;
if ($fn) {
$fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this);
}
$false = false;
return $false;
}
if ($this->_queryID === true) { // return simplified recordset for inserts/updates/deletes with lower overhead
$rs =& new ADORecordSet_empty();
return $rs;
}
// return real recordset from select statement
$rsclass = $this->rsPrefix.$this->databaseType;
$rs = new $rsclass($this->_queryID,$this->fetchMode);
$rs->connection = &$this; // Pablo suggestion
$rs->Init();
if (is_array($sql)) $rs->sql = $sql[0];
else $rs->sql = $sql;
if ($rs->_numOfRows <= 0) {
global $ADODB_COUNTRECS;
if ($ADODB_COUNTRECS) {
if (!$rs->EOF) {
$rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql));
$rs->_queryID = $this->_queryID;
} else
$rs->_numOfRows = 0;
}
}
return $rs;
}
 
function CreateSequence($seqname='adodbseq',$startID=1)
{
if (empty($this->_genSeqSQL)) return false;
return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
}
 
function DropSequence($seqname='adodbseq')
{
if (empty($this->_dropSeqSQL)) return false;
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
}
 
/**
* Generates a sequence id and stores it in $this->genID;
* GenID is only available if $this->hasGenID = true;
*
* @param seqname name of sequence to use
* @param startID if sequence does not exist, start at this ID
* @return 0 if not supported, otherwise a sequence id
*/
function GenID($seqname='adodbseq',$startID=1)
{
if (!$this->hasGenID) {
return 0; // formerly returns false pre 1.60
}
$getnext = sprintf($this->_genIDSQL,$seqname);
$holdtransOK = $this->_transOK;
$save_handler = $this->raiseErrorFn;
$this->raiseErrorFn = '';
@($rs = $this->Execute($getnext));
$this->raiseErrorFn = $save_handler;
if (!$rs) {
$this->_transOK = $holdtransOK; //if the status was ok before reset
$createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
$rs = $this->Execute($getnext);
}
if ($rs && !$rs->EOF) $this->genID = reset($rs->fields);
else $this->genID = 0; // false
if ($rs) $rs->Close();
 
return $this->genID;
}
 
/**
* @param $table string name of the table, not needed by all databases (eg. mysql), default ''
* @param $column string name of the column, not needed by all databases (eg. mysql), default ''
* @return the last inserted ID. Not all databases support this.
*/
function Insert_ID($table='',$column='')
{
if ($this->_logsql && $this->lastInsID) return $this->lastInsID;
if ($this->hasInsertID) return $this->_insertid($table,$column);
if ($this->debug) {
ADOConnection::outp( '<p>Insert_ID error</p>');
adodb_backtrace();
}
return false;
}
 
 
/**
* Portable Insert ID. Pablo Roca <pabloroca#mvps.org>
*
* @return the last inserted ID. All databases support this. But aware possible
* problems in multiuser environments. Heavy test this before deploying.
*/
function PO_Insert_ID($table="", $id="")
{
if ($this->hasInsertID){
return $this->Insert_ID($table,$id);
} else {
return $this->GetOne("SELECT MAX($id) FROM $table");
}
}
 
/**
* @return # rows affected by UPDATE/DELETE
*/
function Affected_Rows()
{
if ($this->hasAffectedRows) {
if ($this->fnExecute === 'adodb_log_sql') {
if ($this->_logsql && $this->_affected !== false) return $this->_affected;
}
$val = $this->_affectedrows();
return ($val < 0) ? false : $val;
}
if ($this->debug) ADOConnection::outp( '<p>Affected_Rows error</p>',false);
return false;
}
/**
* @return the last error message
*/
function ErrorMsg()
{
if ($this->_errorMsg) return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg;
else return '';
}
/**
* @return the last error number. Normally 0 means no error.
*/
function ErrorNo()
{
return ($this->_errorMsg) ? -1 : 0;
}
function MetaError($err=false)
{
include_once(ADODB_DIR."/adodb-error.inc.php");
if ($err === false) $err = $this->ErrorNo();
return adodb_error($this->dataProvider,$this->databaseType,$err);
}
function MetaErrorMsg($errno)
{
include_once(ADODB_DIR."/adodb-error.inc.php");
return adodb_errormsg($errno);
}
/**
* @returns an array with the primary key columns in it.
*/
function MetaPrimaryKeys($table, $owner=false)
{
// owner not used in base class - see oci8
$p = array();
$objs =& $this->MetaColumns($table);
if ($objs) {
foreach($objs as $v) {
if (!empty($v->primary_key))
$p[] = $v->name;
}
}
if (sizeof($p)) return $p;
if (function_exists('ADODB_VIEW_PRIMARYKEYS'))
return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner);
return false;
}
/**
* @returns assoc array where keys are tables, and values are foreign keys
*/
function MetaForeignKeys($table, $owner=false, $upper=false)
{
return false;
}
/**
* Choose a database to connect to. Many databases do not support this.
*
* @param dbName is the name of the database to select
* @return true or false
*/
function SelectDB($dbName)
{return false;}
/**
* Will select, getting rows from $offset (1-based), for $nrows.
* This simulates the MySQL "select * from table limit $offset,$nrows" , and
* the PostgreSQL "select * from table limit $nrows offset $offset". Note that
* MySQL and PostgreSQL parameter ordering is the opposite of the other.
* eg.
* SelectLimit('select * from table',3); will return rows 1 to 3 (1-based)
* SelectLimit('select * from table',3,2); will return rows 3 to 5 (1-based)
*
* Uses SELECT TOP for Microsoft databases (when $this->hasTop is set)
* BUG: Currently SelectLimit fails with $sql with LIMIT or TOP clause already set
*
* @param sql
* @param [offset] is the row to start calculations from (1-based)
* @param [nrows] is the number of rows to get
* @param [inputarr] array of bind variables
* @param [secs2cache] is a private parameter only used by jlim
* @return the recordset ($rs->databaseType == 'array')
*/
function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
{
if ($this->hasTop && $nrows > 0) {
// suggested by Reinhard Balling. Access requires top after distinct
// Informix requires first before distinct - F Riosa
$ismssql = (strpos($this->databaseType,'mssql') !== false);
if ($ismssql) $isaccess = false;
else $isaccess = (strpos($this->databaseType,'access') !== false);
if ($offset <= 0) {
// access includes ties in result
if ($isaccess) {
$sql = preg_replace(
'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
 
if ($secs2cache>0) {
$ret =& $this->CacheExecute($secs2cache, $sql,$inputarr);
} else {
$ret =& $this->Execute($sql,$inputarr);
}
return $ret; // PHP5 fix
} else if ($ismssql){
$sql = preg_replace(
'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
} else {
$sql = preg_replace(
'/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
}
} else {
$nn = $nrows + $offset;
if ($isaccess || $ismssql) {
$sql = preg_replace(
'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql);
} else {
$sql = preg_replace(
'/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql);
}
}
}
// if $offset>0, we want to skip rows, and $ADODB_COUNTRECS is set, we buffer rows
// 0 to offset-1 which will be discarded anyway. So we disable $ADODB_COUNTRECS.
global $ADODB_COUNTRECS;
$savec = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
if ($offset>0){
if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
else $rs = &$this->Execute($sql,$inputarr);
} else {
if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
else $rs = &$this->Execute($sql,$inputarr);
}
$ADODB_COUNTRECS = $savec;
if ($rs && !$rs->EOF) {
$rs =& $this->_rs2rs($rs,$nrows,$offset);
}
//print_r($rs);
return $rs;
}
/**
* Create serializable recordset. Breaks rs link to connection.
*
* @param rs the recordset to serialize
*/
function &SerializableRS(&$rs)
{
$rs2 =& $this->_rs2rs($rs);
$ignore = false;
$rs2->connection =& $ignore;
return $rs2;
}
/**
* Convert database recordset to an array recordset
* input recordset's cursor should be at beginning, and
* old $rs will be closed.
*
* @param rs the recordset to copy
* @param [nrows] number of rows to retrieve (optional)
* @param [offset] offset by number of rows (optional)
* @return the new recordset
*/
function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true)
{
if (! $rs) {
$false = false;
return $false;
}
$dbtype = $rs->databaseType;
if (!$dbtype) {
$rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ?
return $rs;
}
if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) {
$rs->MoveFirst();
$rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ?
return $rs;
}
$flds = array();
for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
$flds[] = $rs->FetchField($i);
}
 
$arr =& $rs->GetArrayLimit($nrows,$offset);
//print_r($arr);
if ($close) $rs->Close();
$arrayClass = $this->arrayClass;
$rs2 = new $arrayClass();
$rs2->connection = &$this;
$rs2->sql = $rs->sql;
$rs2->dataProvider = $this->dataProvider;
$rs2->InitArrayFields($arr,$flds);
$rs2->fetchMode = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode;
return $rs2;
}
/*
* Return all rows. Compat with PEAR DB
*/
function &GetAll($sql, $inputarr=false)
{
$arr =& $this->GetArray($sql,$inputarr);
return $arr;
}
function &GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false)
{
$rs =& $this->Execute($sql, $inputarr);
if (!$rs) {
$false = false;
return $false;
}
$arr =& $rs->GetAssoc($force_array,$first2cols);
return $arr;
}
function &CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false)
{
if (!is_numeric($secs2cache)) {
$first2cols = $force_array;
$force_array = $inputarr;
}
$rs =& $this->CacheExecute($secs2cache, $sql, $inputarr);
if (!$rs) {
$false = false;
return $false;
}
$arr =& $rs->GetAssoc($force_array,$first2cols);
return $arr;
}
/**
* Return first element of first row of sql statement. Recordset is disposed
* for you.
*
* @param sql SQL statement
* @param [inputarr] input bind array
*/
function GetOne($sql,$inputarr=false)
{
global $ADODB_COUNTRECS;
$crecs = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
$ret = false;
$rs = &$this->Execute($sql,$inputarr);
if ($rs) {
if (!$rs->EOF) $ret = reset($rs->fields);
$rs->Close();
}
$ADODB_COUNTRECS = $crecs;
return $ret;
}
function CacheGetOne($secs2cache,$sql=false,$inputarr=false)
{
$ret = false;
$rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
if ($rs) {
if (!$rs->EOF) $ret = reset($rs->fields);
$rs->Close();
}
return $ret;
}
function GetCol($sql, $inputarr = false, $trim = false)
{
$rv = false;
$rs = &$this->Execute($sql, $inputarr);
if ($rs) {
$rv = array();
if ($trim) {
while (!$rs->EOF) {
$rv[] = trim(reset($rs->fields));
$rs->MoveNext();
}
} else {
while (!$rs->EOF) {
$rv[] = reset($rs->fields);
$rs->MoveNext();
}
}
$rs->Close();
}
return $rv;
}
function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false)
{
$rv = false;
$rs = &$this->CacheExecute($secs, $sql, $inputarr);
if ($rs) {
if ($trim) {
while (!$rs->EOF) {
$rv[] = trim(reset($rs->fields));
$rs->MoveNext();
}
} else {
while (!$rs->EOF) {
$rv[] = reset($rs->fields);
$rs->MoveNext();
}
}
$rs->Close();
}
return $rv;
}
/*
Calculate the offset of a date for a particular database and generate
appropriate SQL. Useful for calculating future/past dates and storing
in a database.
If dayFraction=1.5 means 1.5 days from now, 1.0/24 for 1 hour.
*/
function OffsetDate($dayFraction,$date=false)
{
if (!$date) $date = $this->sysDate;
return '('.$date.'+'.$dayFraction.')';
}
/**
*
* @param sql SQL statement
* @param [inputarr] input bind array
*/
function &GetArray($sql,$inputarr=false)
{
global $ADODB_COUNTRECS;
$savec = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
$rs =& $this->Execute($sql,$inputarr);
$ADODB_COUNTRECS = $savec;
if (!$rs)
if (defined('ADODB_PEAR')) {
$cls = ADODB_PEAR_Error();
return $cls;
} else {
$false = false;
return $false;
}
$arr =& $rs->GetArray();
$rs->Close();
return $arr;
}
function &CacheGetAll($secs2cache,$sql=false,$inputarr=false)
{
return $this->CacheGetArray($secs2cache,$sql,$inputarr);
}
function &CacheGetArray($secs2cache,$sql=false,$inputarr=false)
{
global $ADODB_COUNTRECS;
$savec = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
$rs =& $this->CacheExecute($secs2cache,$sql,$inputarr);
$ADODB_COUNTRECS = $savec;
if (!$rs)
if (defined('ADODB_PEAR')) {
$cls = ADODB_PEAR_Error();
return $cls;
} else {
$false = false;
return $false;
}
$arr =& $rs->GetArray();
$rs->Close();
return $arr;
}
/**
* Return one row of sql statement. Recordset is disposed for you.
*
* @param sql SQL statement
* @param [inputarr] input bind array
*/
function &GetRow($sql,$inputarr=false)
{
global $ADODB_COUNTRECS;
$crecs = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
$rs =& $this->Execute($sql,$inputarr);
$ADODB_COUNTRECS = $crecs;
if ($rs) {
if (!$rs->EOF) $arr = $rs->fields;
else $arr = array();
$rs->Close();
return $arr;
}
$false = false;
return $false;
}
function &CacheGetRow($secs2cache,$sql=false,$inputarr=false)
{
$rs =& $this->CacheExecute($secs2cache,$sql,$inputarr);
if ($rs) {
$arr = false;
if (!$rs->EOF) $arr = $rs->fields;
$rs->Close();
return $arr;
}
$false = false;
return $false;
}
/**
* Insert or replace a single record. Note: this is not the same as MySQL's replace.
* ADOdb's Replace() uses update-insert semantics, not insert-delete-duplicates of MySQL.
* Also note that no table locking is done currently, so it is possible that the
* record be inserted twice by two programs...
*
* $this->Replace('products', array('prodname' =>"'Nails'","price" => 3.99), 'prodname');
*
* $table table name
* $fieldArray associative array of data (you must quote strings yourself).
* $keyCol the primary key field name or if compound key, array of field names
* autoQuote set to true to use a hueristic to quote strings. Works with nulls and numbers
* but does not work with dates nor SQL functions.
* has_autoinc the primary key is an auto-inc field, so skip in insert.
*
* Currently blob replace not supported
*
* returns 0 = fail, 1 = update, 2 = insert
*/
function Replace($table, $fieldArray, $keyCol, $autoQuote=false, $has_autoinc=false)
{
global $ADODB_INCLUDED_LIB;
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_replace($this, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc);
}
/**
* Will select, getting rows from $offset (1-based), for $nrows.
* This simulates the MySQL "select * from table limit $offset,$nrows" , and
* the PostgreSQL "select * from table limit $nrows offset $offset". Note that
* MySQL and PostgreSQL parameter ordering is the opposite of the other.
* eg.
* CacheSelectLimit(15,'select * from table',3); will return rows 1 to 3 (1-based)
* CacheSelectLimit(15,'select * from table',3,2); will return rows 3 to 5 (1-based)
*
* BUG: Currently CacheSelectLimit fails with $sql with LIMIT or TOP clause already set
*
* @param [secs2cache] seconds to cache data, set to 0 to force query. This is optional
* @param sql
* @param [offset] is the row to start calculations from (1-based)
* @param [nrows] is the number of rows to get
* @param [inputarr] array of bind variables
* @return the recordset ($rs->databaseType == 'array')
*/
function &CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false)
{
if (!is_numeric($secs2cache)) {
if ($sql === false) $sql = -1;
if ($offset == -1) $offset = false;
// sql, nrows, offset,inputarr
$rs =& $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs);
} else {
if ($sql === false) ADOConnection::outp( "Warning: \$sql missing from CacheSelectLimit()");
$rs =& $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
}
return $rs;
}
/**
* Flush cached recordsets that match a particular $sql statement.
* If $sql == false, then we purge all files in the cache.
*/
/**
* Flush cached recordsets that match a particular $sql statement.
* If $sql == false, then we purge all files in the cache.
*/
function CacheFlush($sql=false,$inputarr=false)
{
global $ADODB_CACHE_DIR;
if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) {
/*if (strncmp(PHP_OS,'WIN',3) === 0)
$dir = str_replace('/', '\\', $ADODB_CACHE_DIR);
else */
$dir = $ADODB_CACHE_DIR;
if ($this->debug) {
ADOConnection::outp( "CacheFlush: $dir<br><pre>\n", $this->_dirFlush($dir),"</pre>");
} else {
$this->_dirFlush($dir);
}
return;
}
global $ADODB_INCLUDED_CSV;
if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
$f = $this->_gencachename($sql.serialize($inputarr),false);
adodb_write_file($f,''); // is adodb_write_file needed?
if (!@unlink($f)) {
if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f");
}
}
/**
* Private function to erase all of the files and subdirectories in a directory.
*
* Just specify the directory, and tell it if you want to delete the directory or just clear it out.
* Note: $kill_top_level is used internally in the function to flush subdirectories.
*/
function _dirFlush($dir, $kill_top_level = false) {
if(!$dh = @opendir($dir)) return;
while (($obj = readdir($dh))) {
if($obj=='.' || $obj=='..')
continue;
if (!@unlink($dir.'/'.$obj))
$this->_dirFlush($dir.'/'.$obj, true);
}
if ($kill_top_level === true)
@rmdir($dir);
return true;
}
function xCacheFlush($sql=false,$inputarr=false)
{
global $ADODB_CACHE_DIR;
if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) {
if (strncmp(PHP_OS,'WIN',3) === 0) {
$cmd = 'del /s '.str_replace('/','\\',$ADODB_CACHE_DIR).'\adodb_*.cache';
} else {
//$cmd = 'find "'.$ADODB_CACHE_DIR.'" -type f -maxdepth 1 -print0 | xargs -0 rm -f';
$cmd = 'rm -rf '.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/';
// old version 'rm -f `find '.$ADODB_CACHE_DIR.' -name adodb_*.cache`';
}
if ($this->debug) {
ADOConnection::outp( "CacheFlush: $cmd<br><pre>\n", system($cmd),"</pre>");
} else {
exec($cmd);
}
return;
}
global $ADODB_INCLUDED_CSV;
if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
$f = $this->_gencachename($sql.serialize($inputarr),false);
adodb_write_file($f,''); // is adodb_write_file needed?
if (!@unlink($f)) {
if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f");
}
}
/**
* Private function to generate filename for caching.
* Filename is generated based on:
*
* - sql statement
* - database type (oci8, ibase, ifx, etc)
* - database name
* - userid
* - setFetchMode (adodb 4.23)
*
* When not in safe mode, we create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR).
* Assuming that we can have 50,000 files per directory with good performance,
* then we can scale to 12.8 million unique cached recordsets. Wow!
*/
function _gencachename($sql,$createdir)
{
global $ADODB_CACHE_DIR;
static $notSafeMode;
if ($this->fetchMode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
} else {
$mode = $this->fetchMode;
}
$m = md5($sql.$this->databaseType.$this->database.$this->user.$mode);
if (!isset($notSafeMode)) $notSafeMode = !ini_get('safe_mode');
$dir = ($notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($m,0,2) : $ADODB_CACHE_DIR;
if ($createdir && $notSafeMode && !file_exists($dir)) {
$oldu = umask(0);
if (!mkdir($dir,0771))
if ($this->debug) ADOConnection::outp( "Unable to mkdir $dir for $sql");
umask($oldu);
}
return $dir.'/adodb_'.$m.'.cache';
}
/**
* Execute SQL, caching recordsets.
*
* @param [secs2cache] seconds to cache data, set to 0 to force query.
* This is an optional parameter.
* @param sql SQL statement to execute
* @param [inputarr] holds the input data to bind to
* @return RecordSet or false
*/
function &CacheExecute($secs2cache,$sql=false,$inputarr=false)
{
 
if (!is_numeric($secs2cache)) {
$inputarr = $sql;
$sql = $secs2cache;
$secs2cache = $this->cacheSecs;
}
if (is_array($sql)) {
$sqlparam = $sql;
$sql = $sql[0];
} else
$sqlparam = $sql;
global $ADODB_INCLUDED_CSV;
if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
$md5file = $this->_gencachename($sql.serialize($inputarr),true);
$err = '';
if ($secs2cache > 0){
$rs = &csv2rs($md5file,$err,$secs2cache,$this->arrayClass);
$this->numCacheHits += 1;
} else {
$err='Timeout 1';
$rs = false;
$this->numCacheMisses += 1;
}
if (!$rs) {
// no cached rs found
if ($this->debug) {
if (get_magic_quotes_runtime()) {
ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :(");
}
if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)");
}
$rs = &$this->Execute($sqlparam,$inputarr);
 
if ($rs) {
$eof = $rs->EOF;
$rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately
$txt = _rs2serialize($rs,false,$sql); // serialize
if (!adodb_write_file($md5file,$txt,$this->debug)) {
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this);
}
if ($this->debug) ADOConnection::outp( " Cache write error");
}
if ($rs->EOF && !$eof) {
$rs->MoveFirst();
//$rs = &csv2rs($md5file,$err);
$rs->connection = &$this; // Pablo suggestion
}
} else
@unlink($md5file);
} else {
$this->_errorMsg = '';
$this->_errorCode = 0;
if ($this->fnCacheExecute) {
$fn = $this->fnCacheExecute;
$fn($this, $secs2cache, $sql, $inputarr);
}
// ok, set cached object found
$rs->connection = &$this; // Pablo suggestion
if ($this->debug){
$inBrowser = isset($_SERVER['HTTP_USER_AGENT']);
$ttl = $rs->timeCreated + $secs2cache - time();
$s = is_array($sql) ? $sql[0] : $sql;
if ($inBrowser) $s = '<i>'.htmlspecialchars($s).'</i>';
ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]");
}
}
return $rs;
}
/*
Similar to PEAR DB's autoExecute(), except that
$mode can be 'INSERT' or 'UPDATE' or DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE
If $mode == 'UPDATE', then $where is compulsory as a safety measure.
$forceUpdate means that even if the data has not changed, perform update.
*/
function& AutoExecute($table, $fields_values, $mode = 'INSERT', $where = FALSE, $forceUpdate=true, $magicq=false)
{
$sql = 'SELECT * FROM '.$table;
if ($where!==FALSE) $sql .= ' WHERE '.$where;
else if ($mode == 'UPDATE' || $mode == 2 /* DB_AUTOQUERY_UPDATE */) {
ADOConnection::outp('AutoExecute: Illegal mode=UPDATE with empty WHERE clause');
return false;
}
 
$rs =& $this->SelectLimit($sql,1);
if (!$rs) return false; // table does not exist
$rs->tableName = $table;
switch((string) $mode) {
case 'UPDATE':
case '2':
$sql = $this->GetUpdateSQL($rs, $fields_values, $forceUpdate, $magicq);
break;
case 'INSERT':
case '1':
$sql = $this->GetInsertSQL($rs, $fields_values, $magicq);
break;
default:
ADOConnection::outp("AutoExecute: Unknown mode=$mode");
return false;
}
$ret = false;
if ($sql) $ret = $this->Execute($sql);
if ($ret) $ret = true;
return $ret;
}
/**
* Generates an Update Query based on an existing recordset.
* $arrFields is an associative array of fields with the value
* that should be assigned.
*
* Note: This function should only be used on a recordset
* that is run against a single table and sql should only
* be a simple select stmt with no groupby/orderby/limit
*
* "Jonathan Younger" <jyounger@unilab.com>
*/
function GetUpdateSQL(&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=null)
{
global $ADODB_INCLUDED_LIB;
 
//********************************************************//
//This is here to maintain compatibility
//with older adodb versions. Sets force type to force nulls if $forcenulls is set.
if (!isset($force)) {
global $ADODB_FORCE_TYPE;
$force = $ADODB_FORCE_TYPE;
}
//********************************************************//
 
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq,$force);
}
 
/**
* Generates an Insert Query based on an existing recordset.
* $arrFields is an associative array of fields with the value
* that should be assigned.
*
* Note: This function should only be used on a recordset
* that is run against a single table.
*/
function GetInsertSQL(&$rs, $arrFields,$magicq=false,$force=null)
{
global $ADODB_INCLUDED_LIB;
if (!isset($force)) {
global $ADODB_FORCE_TYPE;
$force = $ADODB_FORCE_TYPE;
}
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_getinsertsql($this,$rs,$arrFields,$magicq,$force);
}
 
/**
* Update a blob column, given a where clause. There are more sophisticated
* blob handling functions that we could have implemented, but all require
* a very complex API. Instead we have chosen something that is extremely
* simple to understand and use.
*
* Note: $blobtype supports 'BLOB' and 'CLOB', default is BLOB of course.
*
* Usage to update a $blobvalue which has a primary key blob_id=1 into a
* field blobtable.blobcolumn:
*
* UpdateBlob('blobtable', 'blobcolumn', $blobvalue, 'blob_id=1');
*
* Insert example:
*
* $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
* $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
*/
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{
return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
}
 
/**
* Usage:
* UpdateBlob('TABLE', 'COLUMN', '/path/to/file', 'ID=1');
*
* $blobtype supports 'BLOB' and 'CLOB'
*
* $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
* $conn->UpdateBlob('blobtable','blobcol',$blobpath,'id=1');
*/
function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
{
$fd = fopen($path,'rb');
if ($fd === false) return false;
$val = fread($fd,filesize($path));
fclose($fd);
return $this->UpdateBlob($table,$column,$val,$where,$blobtype);
}
function BlobDecode($blob)
{
return $blob;
}
function BlobEncode($blob)
{
return $blob;
}
function SetCharSet($charset)
{
return false;
}
function IfNull( $field, $ifNull )
{
return " CASE WHEN $field is null THEN $ifNull ELSE $field END ";
}
function LogSQL($enable=true)
{
include_once(ADODB_DIR.'/adodb-perf.inc.php');
if ($enable) $this->fnExecute = 'adodb_log_sql';
else $this->fnExecute = false;
$old = $this->_logsql;
$this->_logsql = $enable;
if ($enable && !$old) $this->_affected = false;
return $old;
}
function GetCharSet()
{
return false;
}
/**
* Usage:
* UpdateClob('TABLE', 'COLUMN', $var, 'ID=1', 'CLOB');
*
* $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)');
* $conn->UpdateClob('clobtable','clobcol',$clob,'id=1');
*/
function UpdateClob($table,$column,$val,$where)
{
return $this->UpdateBlob($table,$column,$val,$where,'CLOB');
}
// not the fastest implementation - quick and dirty - jlim
// for best performance, use the actual $rs->MetaType().
function MetaType($t,$len=-1,$fieldobj=false)
{
if (empty($this->_metars)) {
$rsclass = $this->rsPrefix.$this->databaseType;
$this->_metars =& new $rsclass(false,$this->fetchMode);
$this->_metars->connection =& $this;
}
return $this->_metars->MetaType($t,$len,$fieldobj);
}
/**
* Change the SQL connection locale to a specified locale.
* This is used to get the date formats written depending on the client locale.
*/
function SetDateLocale($locale = 'En')
{
$this->locale = $locale;
switch (strtoupper($locale))
{
case 'EN':
$this->fmtDate="'Y-m-d'";
$this->fmtTimeStamp = "'Y-m-d H:i:s'";
break;
case 'US':
$this->fmtDate = "'m-d-Y'";
$this->fmtTimeStamp = "'m-d-Y H:i:s'";
break;
case 'NL':
case 'FR':
case 'RO':
case 'IT':
$this->fmtDate="'d-m-Y'";
$this->fmtTimeStamp = "'d-m-Y H:i:s'";
break;
case 'GE':
$this->fmtDate="'d.m.Y'";
$this->fmtTimeStamp = "'d.m.Y H:i:s'";
break;
default:
$this->fmtDate="'Y-m-d'";
$this->fmtTimeStamp = "'Y-m-d H:i:s'";
break;
}
}
 
function &GetActiveRecordsClass($class, $table,$whereOrderBy=false,$bindarr=false, $primkeyArr=false)
{
global $_ADODB_ACTIVE_DBS;
$save = $this->SetFetchMode(ADODB_FETCH_NUM);
if (empty($whereOrderBy)) $whereOrderBy = '1=1';
$rows = $this->GetAll("select * from ".$table.' WHERE '.$whereOrderBy,$bindarr);
$this->SetFetchMode($save);
$false = false;
if ($rows === false) {
return $false;
}
if (!isset($_ADODB_ACTIVE_DBS)) {
include_once(ADODB_DIR.'/adodb-active-record.inc.php');
}
if (!class_exists($class)) {
ADOConnection::outp("Unknown class $class in GetActiveRcordsClass()");
return $false;
}
$arr = array();
foreach($rows as $row) {
$obj =& new $class($table,$primkeyArr,$this);
if ($obj->ErrorMsg()){
$this->_errorMsg = $obj->ErrorMsg();
return $false;
}
$obj->Set($row);
$arr[] =& $obj;
}
return $arr;
}
function &GetActiveRecords($table,$where=false,$bindarr=false,$primkeyArr=false)
{
$arr =& $this->GetActiveRecordsClass('ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr);
return $arr;
}
/**
* Close Connection
*/
function Close()
{
$rez = $this->_close();
$this->_connectionID = false;
return $rez;
}
/**
* Begin a Transaction. Must be followed by CommitTrans() or RollbackTrans().
*
* @return true if succeeded or false if database does not support transactions
*/
function BeginTrans() {return false;}
/**
* If database does not support transactions, always return true as data always commited
*
* @param $ok set to false to rollback transaction, true to commit
*
* @return true/false.
*/
function CommitTrans($ok=true)
{ return true;}
/**
* If database does not support transactions, rollbacks always fail, so return false
*
* @return true/false.
*/
function RollbackTrans()
{ return false;}
 
 
/**
* return the databases that the driver can connect to.
* Some databases will return an empty array.
*
* @return an array of database names.
*/
function MetaDatabases()
{
global $ADODB_FETCH_MODE;
if ($this->metaDatabasesSQL) {
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$arr = $this->GetCol($this->metaDatabasesSQL);
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
return $arr;
}
return false;
}
/**
* @param ttype can either be 'VIEW' or 'TABLE' or false.
* If false, both views and tables are returned.
* "VIEW" returns only views
* "TABLE" returns only tables
* @param showSchema returns the schema/user with the table name, eg. USER.TABLE
* @param mask is the input mask - only supported by oci8 and postgresql
*
* @return array of tables for current database.
*/
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
global $ADODB_FETCH_MODE;
$false = false;
if ($mask) {
return $false;
}
if ($this->metaTablesSQL) {
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs = $this->Execute($this->metaTablesSQL);
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rs === false) return $false;
$arr =& $rs->GetArray();
$arr2 = array();
if ($hast = ($ttype && isset($arr[0][1]))) {
$showt = strncmp($ttype,'T',1);
}
for ($i=0; $i < sizeof($arr); $i++) {
if ($hast) {
if ($showt == 0) {
if (strncmp($arr[$i][1],'T',1) == 0) $arr2[] = trim($arr[$i][0]);
} else {
if (strncmp($arr[$i][1],'V',1) == 0) $arr2[] = trim($arr[$i][0]);
}
} else
$arr2[] = trim($arr[$i][0]);
}
$rs->Close();
return $arr2;
}
return $false;
}
function _findschema(&$table,&$schema)
{
if (!$schema && ($at = strpos($table,'.')) !== false) {
$schema = substr($table,0,$at);
$table = substr($table,$at+1);
}
}
/**
* List columns in a database as an array of ADOFieldObjects.
* See top of file for definition of object.
*
* @param $table table name to query
* @param $normalize makes table name case-insensitive (required by some databases)
* @schema is optional database schema to use - not supported by all databases.
*
* @return array of ADOFieldObjects for current table.
*/
function &MetaColumns($table,$normalize=true)
{
global $ADODB_FETCH_MODE;
$false = false;
if (!empty($this->metaColumnsSQL)) {
$schema = false;
$this->_findschema($table,$schema);
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs = $this->Execute(sprintf($this->metaColumnsSQL,($normalize)?strtoupper($table):$table));
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rs === false || $rs->EOF) return $false;
 
$retarr = array();
while (!$rs->EOF) { //print_r($rs->fields);
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$fld->type = $rs->fields[1];
if (isset($rs->fields[3]) && $rs->fields[3]) {
if ($rs->fields[3]>0) $fld->max_length = $rs->fields[3];
$fld->scale = $rs->fields[4];
if ($fld->scale>0) $fld->max_length += 1;
} else
$fld->max_length = $rs->fields[2];
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[strtoupper($fld->name)] = $fld;
$rs->MoveNext();
}
$rs->Close();
return $retarr;
}
return $false;
}
/**
* List indexes on a table as an array.
* @param table table name to query
* @param primary true to only show primary keys. Not actually used for most databases
*
* @return array of indexes on current table. Each element represents an index, and is itself an associative array.
Array (
[name_of_index] => Array
(
[unique] => true or false
[columns] => Array
(
[0] => firstname
[1] => lastname
)
)
*/
function &MetaIndexes($table, $primary = false, $owner = false)
{
$false = false;
return $false;
}
 
/**
* List columns names in a table as an array.
* @param table table name to query
*
* @return array of column names for current table.
*/
function &MetaColumnNames($table, $numIndexes=false)
{
$objarr =& $this->MetaColumns($table);
if (!is_array($objarr)) {
$false = false;
return $false;
}
$arr = array();
if ($numIndexes) {
$i = 0;
foreach($objarr as $v) $arr[$i++] = $v->name;
} else
foreach($objarr as $v) $arr[strtoupper($v->name)] = $v->name;
return $arr;
}
/**
* Different SQL databases used different methods to combine strings together.
* This function provides a wrapper.
*
* param s variable number of string parameters
*
* Usage: $db->Concat($str1,$str2);
*
* @return concatenated string
*/
function Concat()
{
$arr = func_get_args();
return implode($this->concat_operator, $arr);
}
/**
* Converts a date "d" to a string that the database can understand.
*
* @param d a date in Unix date time format.
*
* @return date string in database date format
*/
function DBDate($d)
{
if (empty($d) && $d !== 0) return 'null';
 
if (is_string($d) && !is_numeric($d)) {
if ($d === 'null' || strncmp($d,"'",1) === 0) return $d;
if ($this->isoDates) return "'$d'";
$d = ADOConnection::UnixDate($d);
}
 
return adodb_date($this->fmtDate,$d);
}
/**
* Converts a timestamp "ts" to a string that the database can understand.
*
* @param ts a timestamp in Unix date time format.
*
* @return timestamp string in database timestamp format
*/
function DBTimeStamp($ts)
{
if (empty($ts) && $ts !== 0) return 'null';
 
# strlen(14) allows YYYYMMDDHHMMSS format
if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14))
return adodb_date($this->fmtTimeStamp,$ts);
if ($ts === 'null') return $ts;
if ($this->isoDates && strlen($ts) !== 14) return "'$ts'";
$ts = ADOConnection::UnixTimeStamp($ts);
return adodb_date($this->fmtTimeStamp,$ts);
}
/**
* Also in ADORecordSet.
* @param $v is a date string in YYYY-MM-DD format
*
* @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
*/
function UnixDate($v)
{
if (is_object($v)) {
// odbtp support
//( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 )
return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year);
}
if (is_numeric($v) && strlen($v) !== 8) return $v;
if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|",
($v), $rr)) return false;
 
if ($rr[1] <= TIMESTAMP_FIRST_YEAR) return 0;
// h-m-s-MM-DD-YY
return @adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
}
 
/**
* Also in ADORecordSet.
* @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format
*
* @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
*/
function UnixTimeStamp($v)
{
if (is_object($v)) {
// odbtp support
//( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 )
return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year);
}
if (!preg_match(
"|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ ,-]*(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
($v), $rr)) return false;
if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1) return 0;
// h-m-s-MM-DD-YY
if (!isset($rr[5])) return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
return @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]);
}
/**
* Also in ADORecordSet.
*
* Format database date based on user defined format.
*
* @param v is the character date in YYYY-MM-DD format, returned by database
* @param fmt is the format to apply to it, using date()
*
* @return a date formated as user desires
*/
function UserDate($v,$fmt='Y-m-d',$gmt=false)
{
$tt = $this->UnixDate($v);
 
// $tt == -1 if pre TIMESTAMP_FIRST_YEAR
if (($tt === false || $tt == -1) && $v != false) return $v;
else if ($tt == 0) return $this->emptyDate;
else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR
}
return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt);
}
/**
*
* @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format
* @param fmt is the format to apply to it, using date()
*
* @return a timestamp formated as user desires
*/
function UserTimeStamp($v,$fmt='Y-m-d H:i:s',$gmt=false)
{
if (!isset($v)) return $this->emptyTimeStamp;
# strlen(14) allows YYYYMMDDHHMMSS format
if (is_numeric($v) && strlen($v)<14) return ($gmt) ? adodb_gmdate($fmt,$v) : adodb_date($fmt,$v);
$tt = $this->UnixTimeStamp($v);
// $tt == -1 if pre TIMESTAMP_FIRST_YEAR
if (($tt === false || $tt == -1) && $v != false) return $v;
if ($tt == 0) return $this->emptyTimeStamp;
return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt);
}
function escape($s,$magic_quotes=false)
{
return $this->addq($s,$magic_quotes);
}
/**
* Quotes a string, without prefixing nor appending quotes.
*/
function addq($s,$magic_quotes=false)
{
if (!$magic_quotes) {
if ($this->replaceQuote[0] == '\\'){
// only since php 4.0.5
$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
//$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s));
}
return str_replace("'",$this->replaceQuote,$s);
}
// undo magic quotes for "
$s = str_replace('\\"','"',$s);
if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything
return $s;
else {// change \' to '' for sybase/mssql
$s = str_replace('\\\\','\\',$s);
return str_replace("\\'",$this->replaceQuote,$s);
}
}
/**
* Correctly quotes a string so that all strings are escaped. We prefix and append
* to the string single-quotes.
* An example is $db->qstr("Don't bother",magic_quotes_runtime());
*
* @param s the string to quote
* @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc().
* This undoes the stupidity of magic quotes for GPC.
*
* @return quoted string to be sent back to database
*/
function qstr($s,$magic_quotes=false)
{
if (!$magic_quotes) {
if ($this->replaceQuote[0] == '\\'){
// only since php 4.0.5
$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
//$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s));
}
return "'".str_replace("'",$this->replaceQuote,$s)."'";
}
// undo magic quotes for "
$s = str_replace('\\"','"',$s);
if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything
return "'$s'";
else {// change \' to '' for sybase/mssql
$s = str_replace('\\\\','\\',$s);
return "'".str_replace("\\'",$this->replaceQuote,$s)."'";
}
}
/**
* Will select the supplied $page number from a recordset, given that it is paginated in pages of
* $nrows rows per page. It also saves two boolean values saying if the given page is the first
* and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination.
*
* See readme.htm#ex8 for an example of usage.
*
* @param sql
* @param nrows is the number of rows per page to get
* @param page is the page number to get (1-based)
* @param [inputarr] array of bind variables
* @param [secs2cache] is a private parameter only used by jlim
* @return the recordset ($rs->databaseType == 'array')
*
* NOTE: phpLens uses a different algorithm and does not use PageExecute().
*
*/
function &PageExecute($sql, $nrows, $page, $inputarr=false, $secs2cache=0)
{
global $ADODB_INCLUDED_LIB;
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
if ($this->pageExecuteCountRows) $rs =& _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $secs2cache);
else $rs =& _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $secs2cache);
return $rs;
}
/**
* Will select the supplied $page number from a recordset, given that it is paginated in pages of
* $nrows rows per page. It also saves two boolean values saying if the given page is the first
* and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination.
*
* @param secs2cache seconds to cache data, set to 0 to force query
* @param sql
* @param nrows is the number of rows per page to get
* @param page is the page number to get (1-based)
* @param [inputarr] array of bind variables
* @return the recordset ($rs->databaseType == 'array')
*/
function &CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false)
{
/*switch($this->dataProvider) {
case 'postgres':
case 'mysql':
break;
default: $secs2cache = 0; break;
}*/
$rs =& $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache);
return $rs;
}
 
} // end class ADOConnection
//==============================================================================================
// CLASS ADOFetchObj
//==============================================================================================
/**
* Internal placeholder for record objects. Used by ADORecordSet->FetchObj().
*/
class ADOFetchObj {
};
//==============================================================================================
// CLASS ADORecordSet_empty
//==============================================================================================
/**
* Lightweight recordset when there are no records to be returned
*/
class ADORecordSet_empty
{
var $dataProvider = 'empty';
var $databaseType = false;
var $EOF = true;
var $_numOfRows = 0;
var $fields = false;
var $connection = false;
function RowCount() {return 0;}
function RecordCount() {return 0;}
function PO_RecordCount(){return 0;}
function Close(){return true;}
function FetchRow() {return false;}
function FieldCount(){ return 0;}
function Init() {}
}
//==============================================================================================
// DATE AND TIME FUNCTIONS
//==============================================================================================
include_once(ADODB_DIR.'/adodb-time.inc.php');
//==============================================================================================
// CLASS ADORecordSet
//==============================================================================================
 
if (PHP_VERSION < 5) include_once(ADODB_DIR.'/adodb-php4.inc.php');
else include_once(ADODB_DIR.'/adodb-iterator.inc.php');
/**
* RecordSet class that represents the dataset returned by the database.
* To keep memory overhead low, this class holds only the current row in memory.
* No prefetching of data is done, so the RecordCount() can return -1 ( which
* means recordcount not known).
*/
class ADORecordSet extends ADODB_BASE_RS {
/*
* public variables
*/
var $dataProvider = "native";
var $fields = false; /// holds the current row data
var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob
/// in other words, we use a text area for editing.
var $canSeek = false; /// indicates that seek is supported
var $sql; /// sql text
var $EOF = false; /// Indicates that the current record position is after the last record in a Recordset object.
var $emptyTimeStamp = '&nbsp;'; /// what to display when $time==0
var $emptyDate = '&nbsp;'; /// what to display when $time==0
var $debug = false;
var $timeCreated=0; /// datetime in Unix format rs created -- for cached recordsets
 
var $bind = false; /// used by Fields() to hold array - should be private?
var $fetchMode; /// default fetch mode
var $connection = false; /// the parent connection
/*
* private variables
*/
var $_numOfRows = -1; /** number of rows, or -1 */
var $_numOfFields = -1; /** number of fields in recordset */
var $_queryID = -1; /** This variable keeps the result link identifier. */
var $_currentRow = -1; /** This variable keeps the current row in the Recordset. */
var $_closed = false; /** has recordset been closed */
var $_inited = false; /** Init() should only be called once */
var $_obj; /** Used by FetchObj */
var $_names; /** Used by FetchObj */
var $_currentPage = -1; /** Added by Iván Oliva to implement recordset pagination */
var $_atFirstPage = false; /** Added by Iván Oliva to implement recordset pagination */
var $_atLastPage = false; /** Added by Iván Oliva to implement recordset pagination */
var $_lastPageNo = -1;
var $_maxRecordCount = 0;
var $datetime = false;
/**
* Constructor
*
* @param queryID this is the queryID returned by ADOConnection->_query()
*
*/
function ADORecordSet($queryID)
{
$this->_queryID = $queryID;
}
function Init()
{
if ($this->_inited) return;
$this->_inited = true;
if ($this->_queryID) @$this->_initrs();
else {
$this->_numOfRows = 0;
$this->_numOfFields = 0;
}
if ($this->_numOfRows != 0 && $this->_numOfFields && $this->_currentRow == -1) {
$this->_currentRow = 0;
if ($this->EOF = ($this->_fetch() === false)) {
$this->_numOfRows = 0; // _numOfRows could be -1
}
} else {
$this->EOF = true;
}
}
/**
* Generate a SELECT tag string from a recordset, and return the string.
* If the recordset has 2 cols, we treat the 1st col as the containing
* the text to display to the user, and 2nd col as the return value. Default
* strings are compared with the FIRST column.
*
* @param name name of SELECT tag
* @param [defstr] the value to hilite. Use an array for multiple hilites for listbox.
* @param [blank1stItem] true to leave the 1st item in list empty
* @param [multiple] true for listbox, false for popup
* @param [size] #rows to show for listbox. not used by popup
* @param [selectAttr] additional attributes to defined for SELECT tag.
* useful for holding javascript onChange='...' handlers.
& @param [compareFields0] when we have 2 cols in recordset, we compare the defstr with
* column 0 (1st col) if this is true. This is not documented.
*
* @return HTML
*
* changes by glen.davies@cce.ac.nz to support multiple hilited items
*/
function GetMenu($name,$defstr='',$blank1stItem=true,$multiple=false,
$size=0, $selectAttr='',$compareFields0=true)
{
global $ADODB_INCLUDED_LIB;
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple,
$size, $selectAttr,$compareFields0);
}
 
/**
* Generate a SELECT tag string from a recordset, and return the string.
* If the recordset has 2 cols, we treat the 1st col as the containing
* the text to display to the user, and 2nd col as the return value. Default
* strings are compared with the SECOND column.
*
*/
function GetMenu2($name,$defstr='',$blank1stItem=true,$multiple=false,$size=0, $selectAttr='')
{
return $this->GetMenu($name,$defstr,$blank1stItem,$multiple,
$size, $selectAttr,false);
}
/*
Grouped Menu
*/
function GetMenu3($name,$defstr='',$blank1stItem=true,$multiple=false,
$size=0, $selectAttr='')
{
global $ADODB_INCLUDED_LIB;
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_getmenu_gp($this, $name,$defstr,$blank1stItem,$multiple,
$size, $selectAttr,false);
}
 
/**
* return recordset as a 2-dimensional array.
*
* @param [nRows] is the number of rows to return. -1 means every row.
*
* @return an array indexed by the rows (0-based) from the recordset
*/
function &GetArray($nRows = -1)
{
global $ADODB_EXTENSION; if ($ADODB_EXTENSION) {
$results = adodb_getall($this,$nRows);
return $results;
}
$results = array();
$cnt = 0;
while (!$this->EOF && $nRows != $cnt) {
$results[] = $this->fields;
$this->MoveNext();
$cnt++;
}
return $results;
}
function &GetAll($nRows = -1)
{
$arr =& $this->GetArray($nRows);
return $arr;
}
/*
* Some databases allow multiple recordsets to be returned. This function
* will return true if there is a next recordset, or false if no more.
*/
function NextRecordSet()
{
return false;
}
/**
* return recordset as a 2-dimensional array.
* Helper function for ADOConnection->SelectLimit()
*
* @param offset is the row to start calculations from (1-based)
* @param [nrows] is the number of rows to return
*
* @return an array indexed by the rows (0-based) from the recordset
*/
function &GetArrayLimit($nrows,$offset=-1)
{
if ($offset <= 0) {
$arr =& $this->GetArray($nrows);
return $arr;
}
$this->Move($offset);
$results = array();
$cnt = 0;
while (!$this->EOF && $nrows != $cnt) {
$results[$cnt++] = $this->fields;
$this->MoveNext();
}
return $results;
}
/**
* Synonym for GetArray() for compatibility with ADO.
*
* @param [nRows] is the number of rows to return. -1 means every row.
*
* @return an array indexed by the rows (0-based) from the recordset
*/
function &GetRows($nRows = -1)
{
$arr =& $this->GetArray($nRows);
return $arr;
}
/**
* return whole recordset as a 2-dimensional associative array if there are more than 2 columns.
* The first column is treated as the key and is not included in the array.
* If there is only 2 columns, it will return a 1 dimensional array of key-value pairs unless
* $force_array == true.
*
* @param [force_array] has only meaning if we have 2 data columns. If false, a 1 dimensional
* array is returned, otherwise a 2 dimensional array is returned. If this sounds confusing,
* read the source.
*
* @param [first2cols] means if there are more than 2 cols, ignore the remaining cols and
* instead of returning array[col0] => array(remaining cols), return array[col0] => col1
*
* @return an associative array indexed by the first column of the array,
* or false if the data has less than 2 cols.
*/
function &GetAssoc($force_array = false, $first2cols = false)
{
global $ADODB_EXTENSION;
$cols = $this->_numOfFields;
if ($cols < 2) {
$false = false;
return $false;
}
$numIndex = isset($this->fields[0]);
$results = array();
if (!$first2cols && ($cols > 2 || $force_array)) {
if ($ADODB_EXTENSION) {
if ($numIndex) {
while (!$this->EOF) {
$results[trim($this->fields[0])] = array_slice($this->fields, 1);
adodb_movenext($this);
}
} else {
while (!$this->EOF) {
$results[trim(reset($this->fields))] = array_slice($this->fields, 1);
adodb_movenext($this);
}
}
} else {
if ($numIndex) {
while (!$this->EOF) {
$results[trim($this->fields[0])] = array_slice($this->fields, 1);
$this->MoveNext();
}
} else {
while (!$this->EOF) {
$results[trim(reset($this->fields))] = array_slice($this->fields, 1);
$this->MoveNext();
}
}
}
} else {
if ($ADODB_EXTENSION) {
// return scalar values
if ($numIndex) {
while (!$this->EOF) {
// some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
$results[trim(($this->fields[0]))] = $this->fields[1];
adodb_movenext($this);
}
} else {
while (!$this->EOF) {
// some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
$v1 = trim(reset($this->fields));
$v2 = ''.next($this->fields);
$results[$v1] = $v2;
adodb_movenext($this);
}
}
} else {
if ($numIndex) {
while (!$this->EOF) {
// some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
$results[trim(($this->fields[0]))] = $this->fields[1];
$this->MoveNext();
}
} else {
while (!$this->EOF) {
// some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
$v1 = trim(reset($this->fields));
$v2 = ''.next($this->fields);
$results[$v1] = $v2;
$this->MoveNext();
}
}
}
}
$ref =& $results; # workaround accelerator incompat with PHP 4.4 :(
return $ref;
}
/**
*
* @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format
* @param fmt is the format to apply to it, using date()
*
* @return a timestamp formated as user desires
*/
function UserTimeStamp($v,$fmt='Y-m-d H:i:s')
{
if (is_numeric($v) && strlen($v)<14) return adodb_date($fmt,$v);
$tt = $this->UnixTimeStamp($v);
// $tt == -1 if pre TIMESTAMP_FIRST_YEAR
if (($tt === false || $tt == -1) && $v != false) return $v;
if ($tt === 0) return $this->emptyTimeStamp;
return adodb_date($fmt,$tt);
}
/**
* @param v is the character date in YYYY-MM-DD format, returned by database
* @param fmt is the format to apply to it, using date()
*
* @return a date formated as user desires
*/
function UserDate($v,$fmt='Y-m-d')
{
$tt = $this->UnixDate($v);
// $tt == -1 if pre TIMESTAMP_FIRST_YEAR
if (($tt === false || $tt == -1) && $v != false) return $v;
else if ($tt == 0) return $this->emptyDate;
else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR
}
return adodb_date($fmt,$tt);
}
/**
* @param $v is a date string in YYYY-MM-DD format
*
* @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
*/
function UnixDate($v)
{
return ADOConnection::UnixDate($v);
}
 
/**
* @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format
*
* @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
*/
function UnixTimeStamp($v)
{
return ADOConnection::UnixTimeStamp($v);
}
/**
* PEAR DB Compat - do not use internally
*/
function Free()
{
return $this->Close();
}
/**
* PEAR DB compat, number of rows
*/
function NumRows()
{
return $this->_numOfRows;
}
/**
* PEAR DB compat, number of cols
*/
function NumCols()
{
return $this->_numOfFields;
}
/**
* Fetch a row, returning false if no more rows.
* This is PEAR DB compat mode.
*
* @return false or array containing the current record
*/
function &FetchRow()
{
if ($this->EOF) {
$false = false;
return $false;
}
$arr = $this->fields;
$this->_currentRow++;
if (!$this->_fetch()) $this->EOF = true;
return $arr;
}
/**
* Fetch a row, returning PEAR_Error if no more rows.
* This is PEAR DB compat mode.
*
* @return DB_OK or error object
*/
function FetchInto(&$arr)
{
if ($this->EOF) return (defined('PEAR_ERROR_RETURN')) ? new PEAR_Error('EOF',-1): false;
$arr = $this->fields;
$this->MoveNext();
return 1; // DB_OK
}
/**
* Move to the first row in the recordset. Many databases do NOT support this.
*
* @return true or false
*/
function MoveFirst()
{
if ($this->_currentRow == 0) return true;
return $this->Move(0);
}
 
/**
* Move to the last row in the recordset.
*
* @return true or false
*/
function MoveLast()
{
if ($this->_numOfRows >= 0) return $this->Move($this->_numOfRows-1);
if ($this->EOF) return false;
while (!$this->EOF) {
$f = $this->fields;
$this->MoveNext();
}
$this->fields = $f;
$this->EOF = false;
return true;
}
/**
* Move to next record in the recordset.
*
* @return true if there still rows available, or false if there are no more rows (EOF).
*/
function MoveNext()
{
if (!$this->EOF) {
$this->_currentRow++;
if ($this->_fetch()) return true;
}
$this->EOF = true;
/* -- tested error handling when scrolling cursor -- seems useless.
$conn = $this->connection;
if ($conn && $conn->raiseErrorFn && ($errno = $conn->ErrorNo())) {
$fn = $conn->raiseErrorFn;
$fn($conn->databaseType,'MOVENEXT',$errno,$conn->ErrorMsg().' ('.$this->sql.')',$conn->host,$conn->database);
}
*/
return false;
}
/**
* Random access to a specific row in the recordset. Some databases do not support
* access to previous rows in the databases (no scrolling backwards).
*
* @param rowNumber is the row to move to (0-based)
*
* @return true if there still rows available, or false if there are no more rows (EOF).
*/
function Move($rowNumber = 0)
{
$this->EOF = false;
if ($rowNumber == $this->_currentRow) return true;
if ($rowNumber >= $this->_numOfRows)
if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2;
if ($this->canSeek) {
if ($this->_seek($rowNumber)) {
$this->_currentRow = $rowNumber;
if ($this->_fetch()) {
return true;
}
} else {
$this->EOF = true;
return false;
}
} else {
if ($rowNumber < $this->_currentRow) return false;
global $ADODB_EXTENSION;
if ($ADODB_EXTENSION) {
while (!$this->EOF && $this->_currentRow < $rowNumber) {
adodb_movenext($this);
}
} else {
while (! $this->EOF && $this->_currentRow < $rowNumber) {
$this->_currentRow++;
if (!$this->_fetch()) $this->EOF = true;
}
}
return !($this->EOF);
}
$this->fields = false;
$this->EOF = true;
return false;
}
/**
* Get the value of a field in the current row by column name.
* Will not work if ADODB_FETCH_MODE is set to ADODB_FETCH_NUM.
*
* @param colname is the field to access
*
* @return the value of $colname column
*/
function Fields($colname)
{
return $this->fields[$colname];
}
function GetAssocKeys($upper=true)
{
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
if ($upper === 2) $this->bind[$o->name] = $i;
else $this->bind[($upper) ? strtoupper($o->name) : strtolower($o->name)] = $i;
}
}
/**
* Use associative array to get fields array for databases that do not support
* associative arrays. Submitted by Paolo S. Asioli paolo.asioli#libero.it
*
* If you don't want uppercase cols, set $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC
* before you execute your SQL statement, and access $rs->fields['col'] directly.
*
* $upper 0 = lowercase, 1 = uppercase, 2 = whatever is returned by FetchField
*/
function &GetRowAssoc($upper=1)
{
$record = array();
// if (!$this->fields) return $record;
if (!$this->bind) {
$this->GetAssocKeys($upper);
}
foreach($this->bind as $k => $v) {
$record[$k] = $this->fields[$v];
}
 
return $record;
}
/**
* Clean up recordset
*
* @return true or false
*/
function Close()
{
// free connection object - this seems to globally free the object
// and not merely the reference, so don't do this...
// $this->connection = false;
if (!$this->_closed) {
$this->_closed = true;
return $this->_close();
} else
return true;
}
/**
* synonyms RecordCount and RowCount
*
* @return the number of rows or -1 if this is not supported
*/
function RecordCount() {return $this->_numOfRows;}
/*
* If we are using PageExecute(), this will return the maximum possible rows
* that can be returned when paging a recordset.
*/
function MaxRecordCount()
{
return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount();
}
/**
* synonyms RecordCount and RowCount
*
* @return the number of rows or -1 if this is not supported
*/
function RowCount() {return $this->_numOfRows;}
 
/**
* Portable RecordCount. Pablo Roca <pabloroca@mvps.org>
*
* @return the number of records from a previous SELECT. All databases support this.
*
* But aware possible problems in multiuser environments. For better speed the table
* must be indexed by the condition. Heavy test this before deploying.
*/
function PO_RecordCount($table="", $condition="") {
$lnumrows = $this->_numOfRows;
// the database doesn't support native recordcount, so we do a workaround
if ($lnumrows == -1 && $this->connection) {
IF ($table) {
if ($condition) $condition = " WHERE " . $condition;
$resultrows = &$this->connection->Execute("SELECT COUNT(*) FROM $table $condition");
if ($resultrows) $lnumrows = reset($resultrows->fields);
}
}
return $lnumrows;
}
/**
* @return the current row in the recordset. If at EOF, will return the last row. 0-based.
*/
function CurrentRow() {return $this->_currentRow;}
/**
* synonym for CurrentRow -- for ADO compat
*
* @return the current row in the recordset. If at EOF, will return the last row. 0-based.
*/
function AbsolutePosition() {return $this->_currentRow;}
/**
* @return the number of columns in the recordset. Some databases will set this to 0
* if no records are returned, others will return the number of columns in the query.
*/
function FieldCount() {return $this->_numOfFields;}
 
 
/**
* Get the ADOFieldObject of a specific column.
*
* @param fieldoffset is the column position to access(0-based).
*
* @return the ADOFieldObject for that column, or false.
*/
function &FetchField($fieldoffset)
{
// must be defined by child class
}
/**
* Get the ADOFieldObjects of all columns in an array.
*
*/
function& FieldTypesArray()
{
$arr = array();
for ($i=0, $max=$this->_numOfFields; $i < $max; $i++)
$arr[] = $this->FetchField($i);
return $arr;
}
/**
* Return the fields array of the current row as an object for convenience.
* The default case is lowercase field names.
*
* @return the object with the properties set to the fields of the current row
*/
function &FetchObj()
{
$o =& $this->FetchObject(false);
return $o;
}
/**
* Return the fields array of the current row as an object for convenience.
* The default case is uppercase.
*
* @param $isupper to set the object property names to uppercase
*
* @return the object with the properties set to the fields of the current row
*/
function &FetchObject($isupper=true)
{
if (empty($this->_obj)) {
$this->_obj = new ADOFetchObj();
$this->_names = array();
for ($i=0; $i <$this->_numOfFields; $i++) {
$f = $this->FetchField($i);
$this->_names[] = $f->name;
}
}
$i = 0;
if (PHP_VERSION >= 5) $o = clone($this->_obj);
else $o = $this->_obj;
for ($i=0; $i <$this->_numOfFields; $i++) {
$name = $this->_names[$i];
if ($isupper) $n = strtoupper($name);
else $n = $name;
$o->$n = $this->Fields($name);
}
return $o;
}
/**
* Return the fields array of the current row as an object for convenience.
* The default is lower-case field names.
*
* @return the object with the properties set to the fields of the current row,
* or false if EOF
*
* Fixed bug reported by tim@orotech.net
*/
function &FetchNextObj()
{
$o =& $this->FetchNextObject(false);
return $o;
}
/**
* Return the fields array of the current row as an object for convenience.
* The default is upper case field names.
*
* @param $isupper to set the object property names to uppercase
*
* @return the object with the properties set to the fields of the current row,
* or false if EOF
*
* Fixed bug reported by tim@orotech.net
*/
function &FetchNextObject($isupper=true)
{
$o = false;
if ($this->_numOfRows != 0 && !$this->EOF) {
$o = $this->FetchObject($isupper);
$this->_currentRow++;
if ($this->_fetch()) return $o;
}
$this->EOF = true;
return $o;
}
/**
* Get the metatype of the column. This is used for formatting. This is because
* many databases use different names for the same type, so we transform the original
* type to our standardised version which uses 1 character codes:
*
* @param t is the type passed in. Normally is ADOFieldObject->type.
* @param len is the maximum length of that field. This is because we treat character
* fields bigger than a certain size as a 'B' (blob).
* @param fieldobj is the field object returned by the database driver. Can hold
* additional info (eg. primary_key for mysql).
*
* @return the general type of the data:
* C for character < 250 chars
* X for teXt (>= 250 chars)
* B for Binary
* N for numeric or floating point
* D for date
* T for timestamp
* L for logical/Boolean
* I for integer
* R for autoincrement counter/integer
*
*
*/
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
// changed in 2.32 to hashing instead of switch stmt for speed...
static $typeMap = array(
'VARCHAR' => 'C',
'VARCHAR2' => 'C',
'CHAR' => 'C',
'C' => 'C',
'STRING' => 'C',
'NCHAR' => 'C',
'NVARCHAR' => 'C',
'VARYING' => 'C',
'BPCHAR' => 'C',
'CHARACTER' => 'C',
'INTERVAL' => 'C', # Postgres
##
'LONGCHAR' => 'X',
'TEXT' => 'X',
'NTEXT' => 'X',
'M' => 'X',
'X' => 'X',
'CLOB' => 'X',
'NCLOB' => 'X',
'LVARCHAR' => 'X',
##
'BLOB' => 'B',
'IMAGE' => 'B',
'BINARY' => 'B',
'VARBINARY' => 'B',
'LONGBINARY' => 'B',
'B' => 'B',
##
'YEAR' => 'D', // mysql
'DATE' => 'D',
'D' => 'D',
##
'TIME' => 'T',
'TIMESTAMP' => 'T',
'DATETIME' => 'T',
'TIMESTAMPTZ' => 'T',
'T' => 'T',
##
'BOOL' => 'L',
'BOOLEAN' => 'L',
'BIT' => 'L',
'L' => 'L',
##
'COUNTER' => 'R',
'R' => 'R',
'SERIAL' => 'R', // ifx
'INT IDENTITY' => 'R',
##
'INT' => 'I',
'INT2' => 'I',
'INT4' => 'I',
'INT8' => 'I',
'INTEGER' => 'I',
'INTEGER UNSIGNED' => 'I',
'SHORT' => 'I',
'TINYINT' => 'I',
'SMALLINT' => 'I',
'I' => 'I',
##
'LONG' => 'N', // interbase is numeric, oci8 is blob
'BIGINT' => 'N', // this is bigger than PHP 32-bit integers
'DECIMAL' => 'N',
'DEC' => 'N',
'REAL' => 'N',
'DOUBLE' => 'N',
'DOUBLE PRECISION' => 'N',
'SMALLFLOAT' => 'N',
'FLOAT' => 'N',
'NUMBER' => 'N',
'NUM' => 'N',
'NUMERIC' => 'N',
'MONEY' => 'N',
## informix 9.2
'SQLINT' => 'I',
'SQLSERIAL' => 'I',
'SQLSMINT' => 'I',
'SQLSMFLOAT' => 'N',
'SQLFLOAT' => 'N',
'SQLMONEY' => 'N',
'SQLDECIMAL' => 'N',
'SQLDATE' => 'D',
'SQLVCHAR' => 'C',
'SQLCHAR' => 'C',
'SQLDTIME' => 'T',
'SQLINTERVAL' => 'N',
'SQLBYTES' => 'B',
'SQLTEXT' => 'X'
);
$tmap = false;
$t = strtoupper($t);
$tmap = (isset($typeMap[$t])) ? $typeMap[$t] : 'N';
switch ($tmap) {
case 'C':
// is the char field is too long, return as text field...
if ($this->blobSize >= 0) {
if ($len > $this->blobSize) return 'X';
} else if ($len > 250) {
return 'X';
}
return 'C';
case 'I':
if (!empty($fieldobj->primary_key)) return 'R';
return 'I';
case false:
return 'N';
case 'B':
if (isset($fieldobj->binary))
return ($fieldobj->binary) ? 'B' : 'X';
return 'B';
case 'D':
if (!empty($this->connection) && !empty($this->connection->datetime)) return 'T';
return 'D';
default:
if ($t == 'LONG' && $this->dataProvider == 'oci8') return 'B';
return $tmap;
}
}
function _close() {}
/**
* set/returns the current recordset page when paginating
*/
function AbsolutePage($page=-1)
{
if ($page != -1) $this->_currentPage = $page;
return $this->_currentPage;
}
/**
* set/returns the status of the atFirstPage flag when paginating
*/
function AtFirstPage($status=false)
{
if ($status != false) $this->_atFirstPage = $status;
return $this->_atFirstPage;
}
function LastPageNo($page = false)
{
if ($page != false) $this->_lastPageNo = $page;
return $this->_lastPageNo;
}
/**
* set/returns the status of the atLastPage flag when paginating
*/
function AtLastPage($status=false)
{
if ($status != false) $this->_atLastPage = $status;
return $this->_atLastPage;
}
} // end class ADORecordSet
//==============================================================================================
// CLASS ADORecordSet_array
//==============================================================================================
/**
* This class encapsulates the concept of a recordset created in memory
* as an array. This is useful for the creation of cached recordsets.
*
* Note that the constructor is different from the standard ADORecordSet
*/
class ADORecordSet_array extends ADORecordSet
{
var $databaseType = 'array';
 
var $_array; // holds the 2-dimensional data array
var $_types; // the array of types of each column (C B I L M)
var $_colnames; // names of each column in array
var $_skiprow1; // skip 1st row because it holds column names
var $_fieldarr; // holds array of field objects
var $canSeek = true;
var $affectedrows = false;
var $insertid = false;
var $sql = '';
var $compat = false;
/**
* Constructor
*
*/
function ADORecordSet_array($fakeid=1)
{
global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH;
// fetch() on EOF does not delete $this->fields
$this->compat = !empty($ADODB_COMPAT_FETCH);
$this->ADORecordSet($fakeid); // fake queryID
$this->fetchMode = $ADODB_FETCH_MODE;
}
/**
* Setup the array.
*
* @param array is a 2-dimensional array holding the data.
* The first row should hold the column names
* unless paramter $colnames is used.
* @param typearr holds an array of types. These are the same types
* used in MetaTypes (C,B,L,I,N).
* @param [colnames] array of column names. If set, then the first row of
* $array should not hold the column names.
*/
function InitArray($array,$typearr,$colnames=false)
{
$this->_array = $array;
$this->_types = $typearr;
if ($colnames) {
$this->_skiprow1 = false;
$this->_colnames = $colnames;
} else {
$this->_skiprow1 = true;
$this->_colnames = $array[0];
}
$this->Init();
}
/**
* Setup the Array and datatype file objects
*
* @param array is a 2-dimensional array holding the data.
* The first row should hold the column names
* unless paramter $colnames is used.
* @param fieldarr holds an array of ADOFieldObject's.
*/
function InitArrayFields(&$array,&$fieldarr)
{
$this->_array =& $array;
$this->_skiprow1= false;
if ($fieldarr) {
$this->_fieldobjects =& $fieldarr;
}
$this->Init();
}
function &GetArray($nRows=-1)
{
if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) {
return $this->_array;
} else {
$arr =& ADORecordSet::GetArray($nRows);
return $arr;
}
}
function _initrs()
{
$this->_numOfRows = sizeof($this->_array);
if ($this->_skiprow1) $this->_numOfRows -= 1;
$this->_numOfFields =(isset($this->_fieldobjects)) ?
sizeof($this->_fieldobjects):sizeof($this->_types);
}
/* Use associative array to get fields array */
function Fields($colname)
{
$mode = isset($this->adodbFetchMode) ? $this->adodbFetchMode : $this->fetchMode;
if ($mode & ADODB_FETCH_ASSOC) {
if (!isset($this->fields[$colname])) $colname = strtolower($colname);
return $this->fields[$colname];
}
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
function &FetchField($fieldOffset = -1)
{
if (isset($this->_fieldobjects)) {
return $this->_fieldobjects[$fieldOffset];
}
$o = new ADOFieldObject();
$o->name = $this->_colnames[$fieldOffset];
$o->type = $this->_types[$fieldOffset];
$o->max_length = -1; // length not known
return $o;
}
function _seek($row)
{
if (sizeof($this->_array) && 0 <= $row && $row < $this->_numOfRows) {
$this->_currentRow = $row;
if ($this->_skiprow1) $row += 1;
$this->fields = $this->_array[$row];
return true;
}
return false;
}
function MoveNext()
{
if (!$this->EOF) {
$this->_currentRow++;
$pos = $this->_currentRow;
if ($this->_numOfRows <= $pos) {
if (!$this->compat) $this->fields = false;
} else {
if ($this->_skiprow1) $pos += 1;
$this->fields = $this->_array[$pos];
return true;
}
$this->EOF = true;
}
return false;
}
function _fetch()
{
$pos = $this->_currentRow;
if ($this->_numOfRows <= $pos) {
if (!$this->compat) $this->fields = false;
return false;
}
if ($this->_skiprow1) $pos += 1;
$this->fields = $this->_array[$pos];
return true;
}
function _close()
{
return true;
}
} // ADORecordSet_array
 
//==============================================================================================
// HELPER FUNCTIONS
//==============================================================================================
/**
* Synonym for ADOLoadCode. Private function. Do not use.
*
* @deprecated
*/
function ADOLoadDB($dbType)
{
return ADOLoadCode($dbType);
}
/**
* Load the code for a specific database driver. Private function. Do not use.
*/
function ADOLoadCode($dbType)
{
global $ADODB_LASTDB;
if (!$dbType) return false;
$db = strtolower($dbType);
switch ($db) {
case 'ado':
if (PHP_VERSION >= 5) $db = 'ado5';
$class = 'ado';
break;
case 'ifx':
case 'maxsql': $class = $db = 'mysqlt'; break;
case 'postgres':
case 'postgres8':
case 'pgsql': $class = $db = 'postgres7'; break;
default:
$class = $db; break;
}
$file = ADODB_DIR."/drivers/adodb-".$db.".inc.php";
@include_once($file);
$ADODB_LASTDB = $class;
if (class_exists("ADODB_" . $class)) return $class;
//ADOConnection::outp(adodb_pr(get_declared_classes(),true));
if (!file_exists($file)) ADOConnection::outp("Missing file: $file");
else ADOConnection::outp("Syntax error in file: $file");
return false;
}
 
/**
* synonym for ADONewConnection for people like me who cannot remember the correct name
*/
function &NewADOConnection($db='')
{
$tmp =& ADONewConnection($db);
return $tmp;
}
/**
* Instantiate a new Connection class for a specific database driver.
*
* @param [db] is the database Connection object to create. If undefined,
* use the last database driver that was loaded by ADOLoadCode().
*
* @return the freshly created instance of the Connection class.
*/
function &ADONewConnection($db='')
{
GLOBAL $ADODB_NEWCONNECTION, $ADODB_LASTDB;
if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2);
$errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false;
$false = false;
if ($at = strpos($db,'://')) {
$origdsn = $db;
if (PHP_VERSION < 5) $dsna = @parse_url($db);
else {
$fakedsn = 'fake'.substr($db,$at);
$dsna = @parse_url($fakedsn);
$dsna['scheme'] = substr($db,0,$at);
if (strncmp($db,'pdo',3) == 0) {
$sch = explode('_',$dsna['scheme']);
if (sizeof($sch)>1) {
$dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : '';
$dsna['host'] = rawurlencode($sch[1].':host='.rawurldecode($dsna['host']));
$dsna['scheme'] = 'pdo';
}
}
}
if (!$dsna) {
// special handling of oracle, which might not have host
$db = str_replace('@/','@adodb-fakehost/',$db);
$dsna = parse_url($db);
if (!$dsna) return $false;
$dsna['host'] = '';
}
$db = @$dsna['scheme'];
if (!$db) return $false;
$dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : '';
$dsna['user'] = isset($dsna['user']) ? rawurldecode($dsna['user']) : '';
$dsna['pass'] = isset($dsna['pass']) ? rawurldecode($dsna['pass']) : '';
$dsna['path'] = isset($dsna['path']) ? rawurldecode(substr($dsna['path'],1)) : ''; # strip off initial /
if (isset($dsna['query'])) {
$opt1 = explode('&',$dsna['query']);
foreach($opt1 as $k => $v) {
$arr = explode('=',$v);
$opt[$arr[0]] = isset($arr[1]) ? rawurldecode($arr[1]) : 1;
}
} else $opt = array();
}
/*
* phptype: Database backend used in PHP (mysql, odbc etc.)
* dbsyntax: Database used with regards to SQL syntax etc.
* protocol: Communication protocol to use (tcp, unix etc.)
* hostspec: Host specification (hostname[:port])
* database: Database to use on the DBMS server
* username: User name for login
* password: Password for login
*/
if (!empty($ADODB_NEWCONNECTION)) {
$obj = $ADODB_NEWCONNECTION($db);
 
} else {
if (!isset($ADODB_LASTDB)) $ADODB_LASTDB = '';
if (empty($db)) $db = $ADODB_LASTDB;
if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db);
if (!$db) {
if (isset($origdsn)) $db = $origdsn;
if ($errorfn) {
// raise an error
$ignore = false;
$errorfn('ADONewConnection', 'ADONewConnection', -998,
"could not load the database driver for '$db'",
$db,false,$ignore);
} else
ADOConnection::outp( "<p>ADONewConnection: Unable to load database driver '$db'</p>",false);
return $false;
}
$cls = 'ADODB_'.$db;
if (!class_exists($cls)) {
adodb_backtrace();
return $false;
}
$obj = new $cls();
}
# constructor should not fail
if ($obj) {
if ($errorfn) $obj->raiseErrorFn = $errorfn;
if (isset($dsna)) {
if (isset($dsna['port'])) $obj->port = $dsna['port'];
foreach($opt as $k => $v) {
switch(strtolower($k)) {
case 'new':
$nconnect = true; $persist = true; break;
case 'persist':
case 'persistent': $persist = $v; break;
case 'debug': $obj->debug = (integer) $v; break;
#ibase
case 'role': $obj->role = $v; break;
case 'dialect': $obj->dialect = (integer) $v; break;
case 'charset': $obj->charset = $v; $obj->charSet=$v; break;
case 'buffers': $obj->buffers = $v; break;
case 'fetchmode': $obj->SetFetchMode($v); break;
#ado
case 'charpage': $obj->charPage = $v; break;
#mysql, mysqli
case 'clientflags': $obj->clientFlags = $v; break;
#mysql, mysqli, postgres
case 'port': $obj->port = $v; break;
#mysqli
case 'socket': $obj->socket = $v; break;
#oci8
case 'nls_date_format': $obj->NLS_DATE_FORMAT = $v; break;
}
}
if (empty($persist))
$ok = $obj->Connect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
else if (empty($nconnect))
$ok = $obj->PConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
else
$ok = $obj->NConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
if (!$ok) return $false;
}
}
return $obj;
}
// $perf == true means called by NewPerfMonitor(), otherwise for data dictionary
function _adodb_getdriver($provider,$drivername,$perf=false)
{
switch ($provider) {
case 'odbtp': if (strncmp('odbtp_',$drivername,6)==0) return substr($drivername,6);
case 'odbc' : if (strncmp('odbc_',$drivername,5)==0) return substr($drivername,5);
case 'ado' : if (strncmp('ado_',$drivername,4)==0) return substr($drivername,4);
case 'native': break;
default:
return $provider;
}
switch($drivername) {
case 'mysqlt':
case 'mysqli':
$drivername='mysql';
break;
case 'postgres7':
case 'postgres8':
$drivername = 'postgres';
break;
case 'firebird15': $drivername = 'firebird'; break;
case 'oracle': $drivername = 'oci8'; break;
case 'access': if ($perf) $drivername = ''; break;
case 'db2' : break;
case 'sapdb' : break;
default:
$drivername = 'generic';
break;
}
return $drivername;
}
function &NewPerfMonitor(&$conn)
{
$false = false;
$drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType,true);
if (!$drivername || $drivername == 'generic') return $false;
include_once(ADODB_DIR.'/adodb-perf.inc.php');
@include_once(ADODB_DIR."/perf/perf-$drivername.inc.php");
$class = "Perf_$drivername";
if (!class_exists($class)) return $false;
$perf = new $class($conn);
return $perf;
}
function &NewDataDictionary(&$conn,$drivername=false)
{
$false = false;
if (!$drivername) $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType);
 
include_once(ADODB_DIR.'/adodb-lib.inc.php');
include_once(ADODB_DIR.'/adodb-datadict.inc.php');
$path = ADODB_DIR."/datadict/datadict-$drivername.inc.php";
 
if (!file_exists($path)) {
ADOConnection::outp("Database driver '$path' not available");
return $false;
}
include_once($path);
$class = "ADODB2_$drivername";
$dict = new $class();
$dict->dataProvider = $conn->dataProvider;
$dict->connection = &$conn;
$dict->upperName = strtoupper($drivername);
$dict->quote = $conn->nameQuote;
if (!empty($conn->_connectionID))
$dict->serverInfo = $conn->ServerInfo();
return $dict;
}
 
 
/*
Perform a print_r, with pre tags for better formatting.
*/
function adodb_pr($var,$as_string=false)
{
if ($as_string) ob_start();
if (isset($_SERVER['HTTP_USER_AGENT'])) {
echo " <pre>\n";print_r($var);echo "</pre>\n";
} else
print_r($var);
if ($as_string) {
$s = ob_get_contents();
ob_end_clean();
return $s;
}
}
/*
Perform a stack-crawl and pretty print it.
@param printOrArr Pass in a boolean to indicate print, or an $exception->trace array (assumes that print is true then).
@param levels Number of levels to display
*/
function adodb_backtrace($printOrArr=true,$levels=9999)
{
global $ADODB_INCLUDED_LIB;
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_backtrace($printOrArr,$levels);
}
 
 
}
?>
/web/kaklik's_web/torrentflux/adodb/contrib/toxmlrpc.inc.php
0,0 → 1,183
<?php
/**
* Helper functions to convert between ADODB recordset objects and XMLRPC values.
* Uses John Lim's AdoDB and Edd Dumbill's phpxmlrpc libs
*
* @author Daniele Baroncelli
* @author Gaetano Giunta
* @copyright (c) 2003-2004 Giunta/Baroncelli. All rights reserved.
*
* @todo some more error checking here and there
* @todo document the xmlrpc-struct used to encode recordset info
* @todo verify if using xmlrpc_encode($rs->GetArray()) would work with:
* - ADODB_FETCH_BOTH
* - null values
*/
 
/**
* Include the main libraries
*/
require_once('xmlrpc.inc');
if (!defined('ADODB_DIR')) require_once('adodb.inc.php');
/**
* Builds an xmlrpc struct value out of an AdoDB recordset
*/
function rs2xmlrpcval(&$adodbrs) {
 
$header =& rs2xmlrpcval_header($adodbrs);
$body =& rs2xmlrpcval_body($adodbrs);
 
// put it all together and build final xmlrpc struct
$xmlrpcrs =& new xmlrpcval ( array(
"header" => $header,
"body" => $body,
), "struct");
 
return $xmlrpcrs;
 
}
 
/**
* Builds an xmlrpc struct value describing an AdoDB recordset
*/
function rs2xmlrpcval_header($adodbrs)
{
$numfields = $adodbrs->FieldCount();
$numrecords = $adodbrs->RecordCount();
 
// build structure holding recordset information
$fieldstruct = array();
for ($i = 0; $i < $numfields; $i++) {
$fld = $adodbrs->FetchField($i);
$fieldarray = array();
if (isset($fld->name))
$fieldarray["name"] =& new xmlrpcval ($fld->name);
if (isset($fld->type))
$fieldarray["type"] =& new xmlrpcval ($fld->type);
if (isset($fld->max_length))
$fieldarray["max_length"] =& new xmlrpcval ($fld->max_length, "int");
if (isset($fld->not_null))
$fieldarray["not_null"] =& new xmlrpcval ($fld->not_null, "boolean");
if (isset($fld->has_default))
$fieldarray["has_default"] =& new xmlrpcval ($fld->has_default, "boolean");
if (isset($fld->default_value))
$fieldarray["default_value"] =& new xmlrpcval ($fld->default_value);
$fieldstruct[$i] =& new xmlrpcval ($fieldarray, "struct");
}
$fieldcount =& new xmlrpcval ($numfields, "int");
$recordcount =& new xmlrpcval ($numrecords, "int");
$sql =& new xmlrpcval ($adodbrs->sql);
$fieldinfo =& new xmlrpcval ($fieldstruct, "array");
 
$header =& new xmlrpcval ( array(
"fieldcount" => $fieldcount,
"recordcount" => $recordcount,
"sql" => $sql,
"fieldinfo" => $fieldinfo
), "struct");
 
return $header;
}
 
/**
* Builds an xmlrpc struct value out of an AdoDB recordset
* (data values only, no data definition)
*/
function rs2xmlrpcval_body($adodbrs)
{
$numfields = $adodbrs->FieldCount();
 
// build structure containing recordset data
$adodbrs->MoveFirst();
$rows = array();
while (!$adodbrs->EOF) {
$columns = array();
// This should work on all cases of fetch mode: assoc, num, both or default
if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount())
for ($i = 0; $i < $numfields; $i++)
if ($adodbrs->fields[$i] === null)
$columns[$i] =& new xmlrpcval ('');
else
$columns[$i] =& xmlrpc_encode ($adodbrs->fields[$i]);
else
foreach ($adodbrs->fields as $val)
if ($val === null)
$columns[] =& new xmlrpcval ('');
else
$columns[] =& xmlrpc_encode ($val);
 
$rows[] =& new xmlrpcval ($columns, "array");
 
$adodbrs->MoveNext();
}
$body =& new xmlrpcval ($rows, "array");
 
return $body;
}
/**
* Returns an xmlrpc struct value as string out of an AdoDB recordset
*/
function rs2xmlrpcstring (&$adodbrs) {
$xmlrpc = rs2xmlrpcval ($adodbrs);
if ($xmlrpc)
return $xmlrpc->serialize();
else
return null;
}
 
/**
* Given a well-formed xmlrpc struct object returns an AdoDB object
*
* @todo add some error checking on the input value
*/
function xmlrpcval2rs (&$xmlrpcval) {
 
$fields_array = array();
$data_array = array();
// rebuild column information
$header =& $xmlrpcval->structmem('header');
$numfields = $header->structmem('fieldcount');
$numfields = $numfields->scalarval();
$numrecords = $header->structmem('recordcount');
$numrecords = $numrecords->scalarval();
$sqlstring = $header->structmem('sql');
$sqlstring = $sqlstring->scalarval();
$fieldinfo =& $header->structmem('fieldinfo');
for ($i = 0; $i < $numfields; $i++) {
$temp =& $fieldinfo->arraymem($i);
$fld =& new ADOFieldObject();
while (list($key,$value) = $temp->structeach()) {
if ($key == "name") $fld->name = $value->scalarval();
if ($key == "type") $fld->type = $value->scalarval();
if ($key == "max_length") $fld->max_length = $value->scalarval();
if ($key == "not_null") $fld->not_null = $value->scalarval();
if ($key == "has_default") $fld->has_default = $value->scalarval();
if ($key == "default_value") $fld->default_value = $value->scalarval();
} // while
$fields_array[] = $fld;
} // for
 
// fetch recordset information into php array
$body =& $xmlrpcval->structmem('body');
for ($i = 0; $i < $numrecords; $i++) {
$data_array[$i]= array();
$xmlrpcrs_row =& $body->arraymem($i);
for ($j = 0; $j < $numfields; $j++) {
$temp =& $xmlrpcrs_row->arraymem($j);
$data_array[$i][$j] = $temp->scalarval();
} // for j
} // for i
 
// finally build in-memory recordset object and return it
$rs =& new ADORecordSet_array();
$rs->InitArrayFields($data_array,$fields_array);
return $rs;
 
}
 
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-access.inc.php
0,0 → 1,95
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_access extends ADODB_DataDict {
var $databaseType = 'access';
var $seqField = false;
function ActualType($meta)
{
switch($meta) {
case 'C': return 'TEXT';
case 'XL':
case 'X': return 'MEMO';
case 'C2': return 'TEXT'; // up to 32K
case 'X2': return 'MEMO';
case 'B': return 'BINARY';
case 'D': return 'DATETIME';
case 'T': return 'DATETIME';
case 'L': return 'BYTE';
case 'I': return 'INTEGER';
case 'I1': return 'BYTE';
case 'I2': return 'SMALLINT';
case 'I4': return 'INTEGER';
case 'I8': return 'INTEGER';
case 'F': return 'DOUBLE';
case 'N': return 'NUMERIC';
default:
return $meta;
}
}
// return string must begin with space
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
{
if ($fautoinc) {
$ftype = 'COUNTER';
return '';
}
if (substr($ftype,0,7) == 'DECIMAL') $ftype = 'DECIMAL';
$suffix = '';
if (strlen($fdefault)) {
//$suffix .= " DEFAULT $fdefault";
if ($this->debug) ADOConnection::outp("Warning: Access does not supported DEFAULT values (field $fname)");
}
if ($fnotnull) $suffix .= ' NOT NULL';
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
function CreateDatabase($dbname,$options=false)
{
return array();
}
function SetSchema($schema)
{
}
 
function AlterColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
return array();
}
function DropColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
return array();
}
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-db2.inc.php
0,0 → 1,143
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_db2 extends ADODB_DataDict {
var $databaseType = 'db2';
var $seqField = false;
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';
case 'XL': return 'CLOB';
case 'X': return 'VARCHAR(3600)';
 
case 'C2': return 'VARCHAR'; // up to 32K
case 'X2': return 'VARCHAR(3600)'; // up to 32000, but default page size too small
 
case 'B': return 'BLOB';
 
case 'D': return 'DATE';
case 'T': return 'TIMESTAMP';
 
case 'L': return 'SMALLINT';
case 'I': return 'INTEGER';
case 'I1': return 'SMALLINT';
case 'I2': return 'SMALLINT';
case 'I4': return 'INTEGER';
case 'I8': return 'BIGINT';
 
case 'F': return 'DOUBLE';
case 'N': return 'DECIMAL';
default:
return $meta;
}
}
// return string must begin with space
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
{
$suffix = '';
if ($fautoinc) return ' GENERATED ALWAYS AS IDENTITY'; # as identity start with
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fnotnull) $suffix .= ' NOT NULL';
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
 
function AlterColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
return array();
}
function DropColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
return array();
}
function ChangeTableSQL($tablename, $flds, $tableoptions = false)
{
/**
Allow basic table changes to DB2 databases
DB2 will fatally reject changes to non character columns
 
*/
$validTypes = array("CHAR","VARC");
$invalidTypes = array("BIGI","BLOB","CLOB","DATE", "DECI","DOUB", "INTE", "REAL","SMAL", "TIME");
// check table exists
$cols = &$this->MetaColumns($tablename);
if ( empty($cols)) {
return $this->CreateTableSQL($tablename, $flds, $tableoptions);
}
// already exists, alter table instead
list($lines,$pkey) = $this->_GenFields($flds);
$alter = 'ALTER TABLE ' . $this->TableName($tablename);
$sql = array();
foreach ( $lines as $id => $v ) {
if ( isset($cols[$id]) && is_object($cols[$id]) ) {
/**
If the first field of $v is the fieldname, and
the second is the field type/size, we assume its an
attempt to modify the column size, so check that it is allowed
$v can have an indeterminate number of blanks between the
fields, so account for that too
*/
$vargs = explode(' ' , $v);
// assume that $vargs[0] is the field name.
$i=0;
// Find the next non-blank value;
for ($i=1;$i<sizeof($vargs);$i++)
if ($vargs[$i] != '')
break;
// if $vargs[$i] is one of the following, we are trying to change the
// size of the field, if not allowed, simply ignore the request.
if (in_array(substr($vargs[$i],0,4),$invalidTypes))
continue;
// insert the appropriate DB2 syntax
if (in_array(substr($vargs[$i],0,4),$validTypes)) {
array_splice($vargs,$i,0,array('SET','DATA','TYPE'));
}
 
// Now Look for the NOT NULL statement as this is not allowed in
// the ALTER table statement. If it is in there, remove it
if (in_array('NOT',$vargs) && in_array('NULL',$vargs)) {
for ($i=1;$i<sizeof($vargs);$i++)
if ($vargs[$i] == 'NOT')
break;
array_splice($vargs,$i,2,'');
}
$v = implode(' ',$vargs);
$sql[] = $alter . $this->alterCol . ' ' . $v;
} else {
$sql[] = $alter . $this->addCol . ' ' . $v;
}
}
return $sql;
}
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-firebird.inc.php
0,0 → 1,151
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
class ADODB2_firebird extends ADODB_DataDict {
var $databaseType = 'firebird';
var $seqField = false;
var $seqPrefix = 'gen_';
var $blobSize = 40000;
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';
case 'XL': return 'VARCHAR(32000)';
case 'X': return 'VARCHAR(4000)';
case 'C2': return 'VARCHAR'; // up to 32K
case 'X2': return 'VARCHAR(4000)';
case 'B': return 'BLOB';
case 'D': return 'DATE';
case 'T': return 'TIMESTAMP';
case 'L': return 'SMALLINT';
case 'I': return 'INTEGER';
case 'I1': return 'SMALLINT';
case 'I2': return 'SMALLINT';
case 'I4': return 'INTEGER';
case 'I8': return 'INTEGER';
case 'F': return 'DOUBLE PRECISION';
case 'N': return 'DECIMAL';
default:
return $meta;
}
}
function NameQuote($name = NULL)
{
if (!is_string($name)) {
return FALSE;
}
$name = trim($name);
if ( !is_object($this->connection) ) {
return $name;
}
$quote = $this->connection->nameQuote;
// if name is of the form `name`, quote it
if ( preg_match('/^`(.+)`$/', $name, $matches) ) {
return $quote . $matches[1] . $quote;
}
// if name contains special characters, quote it
if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) {
return $quote . $name . $quote;
}
return $quote . $name . $quote;
}
 
function CreateDatabase($dbname, $options=false)
{
$options = $this->_Options($options);
$sql = array();
$sql[] = "DECLARE EXTERNAL FUNCTION LOWER CSTRING(80) RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf'";
return $sql;
}
function _DropAutoIncrement($t)
{
if (strpos($t,'.') !== false) {
$tarr = explode('.',$t);
return 'DROP GENERATOR '.$tarr[0].'."gen_'.$tarr[1].'"';
}
return 'DROP GENERATOR "GEN_'.$t;
}
 
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
{
$suffix = '';
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fnotnull) $suffix .= ' NOT NULL';
if ($fautoinc) $this->seqField = $fname;
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
/*
CREATE or replace TRIGGER jaddress_insert
before insert on jaddress
for each row
begin
IF ( NEW."seqField" IS NULL OR NEW."seqField" = 0 ) THEN
NEW."seqField" = GEN_ID("GEN_tabname", 1);
end;
*/
function _Triggers($tabname,$tableoptions)
{
if (!$this->seqField) return array();
$tab1 = preg_replace( '/"/', '', $tabname );
if ($this->schema) {
$t = strpos($tab1,'.');
if ($t !== false) $tab = substr($tab1,$t+1);
else $tab = $tab1;
$seqField = $this->seqField;
$seqname = $this->schema.'.'.$this->seqPrefix.$tab;
$trigname = $this->schema.'.trig_'.$this->seqPrefix.$tab;
} else {
$seqField = $this->seqField;
$seqname = $this->seqPrefix.$tab1;
$trigname = 'trig_'.$seqname;
}
if (isset($tableoptions['REPLACE']))
{ $sql[] = "DROP GENERATOR \"$seqname\"";
$sql[] = "CREATE GENERATOR \"$seqname\"";
$sql[] = "ALTER TRIGGER \"$trigname\" BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END";
}
else
{ $sql[] = "CREATE GENERATOR \"$seqname\"";
$sql[] = "CREATE TRIGGER \"$trigname\" FOR $tabname BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END";
}
$this->seqField = false;
return $sql;
}
 
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-generic.inc.php
0,0 → 1,125
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_generic extends ADODB_DataDict {
var $databaseType = 'generic';
var $seqField = false;
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';
case 'XL':
case 'X': return 'VARCHAR(250)';
case 'C2': return 'VARCHAR';
case 'X2': return 'VARCHAR(250)';
case 'B': return 'VARCHAR';
case 'D': return 'DATE';
case 'T': return 'DATE';
case 'L': return 'DECIMAL(1)';
case 'I': return 'DECIMAL(10)';
case 'I1': return 'DECIMAL(3)';
case 'I2': return 'DECIMAL(5)';
case 'I4': return 'DECIMAL(10)';
case 'I8': return 'DECIMAL(20)';
case 'F': return 'DECIMAL(32,8)';
case 'N': return 'DECIMAL';
default:
return $meta;
}
}
 
function AlterColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
return array();
}
function DropColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
return array();
}
}
 
/*
//db2
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';
case 'X': return 'VARCHAR';
case 'C2': return 'VARCHAR'; // up to 32K
case 'X2': return 'VARCHAR';
case 'B': return 'BLOB';
case 'D': return 'DATE';
case 'T': return 'TIMESTAMP';
case 'L': return 'SMALLINT';
case 'I': return 'INTEGER';
case 'I1': return 'SMALLINT';
case 'I2': return 'SMALLINT';
case 'I4': return 'INTEGER';
case 'I8': return 'BIGINT';
case 'F': return 'DOUBLE';
case 'N': return 'DECIMAL';
default:
return $meta;
}
}
// ifx
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';// 255
case 'X': return 'TEXT';
case 'C2': return 'NVARCHAR';
case 'X2': return 'TEXT';
case 'B': return 'BLOB';
case 'D': return 'DATE';
case 'T': return 'DATETIME';
case 'L': return 'SMALLINT';
case 'I': return 'INTEGER';
case 'I1': return 'SMALLINT';
case 'I2': return 'SMALLINT';
case 'I4': return 'INTEGER';
case 'I8': return 'DECIMAL(20)';
case 'F': return 'FLOAT';
case 'N': return 'DECIMAL';
default:
return $meta;
}
}
*/
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-ibase.inc.php
0,0 → 1,67
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_ibase extends ADODB_DataDict {
var $databaseType = 'ibase';
var $seqField = false;
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';
case 'XL':
case 'X': return 'VARCHAR(4000)';
case 'C2': return 'VARCHAR'; // up to 32K
case 'X2': return 'VARCHAR(4000)';
case 'B': return 'BLOB';
case 'D': return 'DATE';
case 'T': return 'TIMESTAMP';
case 'L': return 'SMALLINT';
case 'I': return 'INTEGER';
case 'I1': return 'SMALLINT';
case 'I2': return 'SMALLINT';
case 'I4': return 'INTEGER';
case 'I8': return 'INTEGER';
case 'F': return 'DOUBLE PRECISION';
case 'N': return 'DECIMAL';
default:
return $meta;
}
}
 
function AlterColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
return array();
}
function DropColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
return array();
}
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-informix.inc.php
0,0 → 1,80
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_informix extends ADODB_DataDict {
var $databaseType = 'informix';
var $seqField = false;
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';// 255
case 'XL':
case 'X': return 'TEXT';
case 'C2': return 'NVARCHAR';
case 'X2': return 'TEXT';
case 'B': return 'BLOB';
case 'D': return 'DATE';
case 'T': return 'DATETIME';
case 'L': return 'SMALLINT';
case 'I': return 'INTEGER';
case 'I1': return 'SMALLINT';
case 'I2': return 'SMALLINT';
case 'I4': return 'INTEGER';
case 'I8': return 'DECIMAL(20)';
case 'F': return 'FLOAT';
case 'N': return 'DECIMAL';
default:
return $meta;
}
}
 
function AlterColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
return array();
}
function DropColumnSQL($tabname, $flds)
{
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
return array();
}
// return string must begin with space
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
{
if ($fautoinc) {
$ftype = 'SERIAL';
return '';
}
$suffix = '';
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fnotnull) $suffix .= ' NOT NULL';
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
}
 
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-mssql.inc.php
0,0 → 1,282
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
/*
In ADOdb, named quotes for MS SQL Server use ". From the MSSQL Docs:
 
Note Delimiters are for identifiers only. Delimiters cannot be used for keywords,
whether or not they are marked as reserved in SQL Server.
Quoted identifiers are delimited by double quotation marks ("):
SELECT * FROM "Blanks in Table Name"
Bracketed identifiers are delimited by brackets ([ ]):
SELECT * FROM [Blanks In Table Name]
Quoted identifiers are valid only when the QUOTED_IDENTIFIER option is set to ON. By default,
the Microsoft OLE DB Provider for SQL Server and SQL Server ODBC driver set QUOTED_IDENTIFIER ON
when they connect.
In Transact-SQL, the option can be set at various levels using SET QUOTED_IDENTIFIER,
the quoted identifier option of sp_dboption, or the user options option of sp_configure.
When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.
Syntax
SET QUOTED_IDENTIFIER { ON | OFF }
 
 
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_mssql extends ADODB_DataDict {
var $databaseType = 'mssql';
var $dropIndex = 'DROP INDEX %2$s.%1$s';
var $renameTable = "EXEC sp_rename '%s','%s'";
var $renameColumn = "EXEC sp_rename '%s.%s','%s'";
 
var $typeX = 'TEXT'; ## Alternatively, set it to VARCHAR(4000)
var $typeXL = 'TEXT';
//var $alterCol = ' ALTER COLUMN ';
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
$len = -1; // mysql max_length is not accurate
switch (strtoupper($t)) {
case 'R':
case 'INT':
case 'INTEGER': return 'I';
case 'BIT':
case 'TINYINT': return 'I1';
case 'SMALLINT': return 'I2';
case 'BIGINT': return 'I8';
case 'REAL':
case 'FLOAT': return 'F';
default: return parent::MetaType($t,$len,$fieldobj);
}
}
function ActualType($meta)
{
switch(strtoupper($meta)) {
 
case 'C': return 'VARCHAR';
case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT';
case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle
case 'C2': return 'NVARCHAR';
case 'X2': return 'NTEXT';
case 'B': return 'IMAGE';
case 'D': return 'DATETIME';
case 'T': return 'DATETIME';
case 'L': return 'BIT';
case 'R':
case 'I': return 'INT';
case 'I1': return 'TINYINT';
case 'I2': return 'SMALLINT';
case 'I4': return 'INT';
case 'I8': return 'BIGINT';
case 'F': return 'REAL';
case 'N': return 'NUMERIC';
default:
return $meta;
}
}
function AddColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
$f = array();
list($lines,$pkey) = $this->_GenFields($flds);
$s = "ALTER TABLE $tabname $this->addCol";
foreach($lines as $v) {
$f[] = "\n $v";
}
$s .= implode(', ',$f);
$sql[] = $s;
return $sql;
}
/*
function AlterColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
$sql = array();
list($lines,$pkey) = $this->_GenFields($flds);
foreach($lines as $v) {
$sql[] = "ALTER TABLE $tabname $this->alterCol $v";
}
 
return $sql;
}
*/
function DropColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
if (!is_array($flds))
$flds = explode(',',$flds);
$f = array();
$s = 'ALTER TABLE ' . $tabname;
foreach($flds as $v) {
$f[] = "\n$this->dropCol ".$this->NameQuote($v);
}
$s .= implode(', ',$f);
$sql[] = $s;
return $sql;
}
// return string must begin with space
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
{
$suffix = '';
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fautoinc) $suffix .= ' IDENTITY(1,1)';
if ($fnotnull) $suffix .= ' NOT NULL';
else if ($suffix == '') $suffix .= ' NULL';
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
/*
CREATE TABLE
[ database_name.[ owner ] . | owner. ] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
 
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
)
 
[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
 
< column_definition > ::= { column_name data_type }
[ COLLATE < collation_name > ]
[ [ DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL]
[ < column_constraint > ] [ ...n ]
 
< column_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}
 
< table_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ASC | DESC ] [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}
 
 
*/
/*
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[ WITH < index_option > [ ,...n] ]
[ ON filegroup ]
< index_option > :: =
{ PAD_INDEX |
FILLFACTOR = fillfactor |
IGNORE_DUP_KEY |
DROP_EXISTING |
STATISTICS_NORECOMPUTE |
SORT_IN_TEMPDB
}
*/
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
{
$sql = array();
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
if ( isset($idxoptions['DROP']) )
return $sql;
}
if ( empty ($flds) ) {
return $sql;
}
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
$clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
if ( is_array($flds) )
$flds = implode(', ',$flds);
$s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
if ( isset($idxoptions[$this->upperName]) )
$s .= $idxoptions[$this->upperName];
 
$sql[] = $s;
return $sql;
}
function _GetSize($ftype, $ty, $fsize, $fprec)
{
switch ($ftype) {
case 'INT':
case 'SMALLINT':
case 'TINYINT':
case 'BIGINT':
return $ftype;
}
if ($ty == 'T') return $ftype;
return parent::_GetSize($ftype, $ty, $fsize, $fprec);
 
}
}
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-mysql.inc.php
0,0 → 1,181
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_mysql extends ADODB_DataDict {
var $databaseType = 'mysql';
var $alterCol = ' MODIFY COLUMN';
var $alterTableAddIndex = true;
var $dropTable = 'DROP TABLE IF EXISTS %s'; // requires mysql 3.22 or later
var $dropIndex = 'DROP INDEX %s ON %s';
var $renameColumn = 'ALTER TABLE %s CHANGE COLUMN %s %s %s'; // needs column-definition!
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
$is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->auto_increment;
$len = -1; // mysql max_length is not accurate
switch (strtoupper($t)) {
case 'STRING':
case 'CHAR':
case 'VARCHAR':
case 'TINYBLOB':
case 'TINYTEXT':
case 'ENUM':
case 'SET':
if ($len <= $this->blobSize) return 'C';
case 'TEXT':
case 'LONGTEXT':
case 'MEDIUMTEXT':
return 'X';
// php_mysql extension always returns 'blob' even if 'text'
// so we have to check whether binary...
case 'IMAGE':
case 'LONGBLOB':
case 'BLOB':
case 'MEDIUMBLOB':
return !empty($fieldobj->binary) ? 'B' : 'X';
case 'YEAR':
case 'DATE': return 'D';
case 'TIME':
case 'DATETIME':
case 'TIMESTAMP': return 'T';
case 'FLOAT':
case 'DOUBLE':
return 'F';
case 'INT':
case 'INTEGER': return $is_serial ? 'R' : 'I';
case 'TINYINT': return $is_serial ? 'R' : 'I1';
case 'SMALLINT': return $is_serial ? 'R' : 'I2';
case 'MEDIUMINT': return $is_serial ? 'R' : 'I4';
case 'BIGINT': return $is_serial ? 'R' : 'I8';
default: return 'N';
}
}
 
function ActualType($meta)
{
switch(strtoupper($meta)) {
case 'C': return 'VARCHAR';
case 'XL':return 'LONGTEXT';
case 'X': return 'TEXT';
case 'C2': return 'VARCHAR';
case 'X2': return 'LONGTEXT';
case 'B': return 'LONGBLOB';
case 'D': return 'DATE';
case 'T': return 'DATETIME';
case 'L': return 'TINYINT';
case 'R':
case 'I4':
case 'I': return 'INTEGER';
case 'I1': return 'TINYINT';
case 'I2': return 'SMALLINT';
case 'I8': return 'BIGINT';
case 'F': return 'DOUBLE';
case 'N': return 'NUMERIC';
default:
return $meta;
}
}
// return string must begin with space
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
{
$suffix = '';
if ($funsigned) $suffix .= ' UNSIGNED';
if ($fnotnull) $suffix .= ' NOT NULL';
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fautoinc) $suffix .= ' AUTO_INCREMENT';
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
/*
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
[table_options] [select_statement]
create_definition:
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[PRIMARY KEY] [reference_definition]
or PRIMARY KEY (index_col_name,...)
or KEY [index_name] (index_col_name,...)
or INDEX [index_name] (index_col_name,...)
or UNIQUE [INDEX] [index_name] (index_col_name,...)
or FULLTEXT [INDEX] [index_name] (index_col_name,...)
or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
or CHECK (expr)
*/
/*
CREATE [UNIQUE|FULLTEXT] INDEX index_name
ON tbl_name (col_name[(length)],... )
*/
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
{
$sql = array();
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
if ($this->alterTableAddIndex) $sql[] = "ALTER TABLE $tabname DROP INDEX $idxname";
else $sql[] = sprintf($this->dropIndex, $idxname, $tabname);
 
if ( isset($idxoptions['DROP']) )
return $sql;
}
if ( empty ($flds) ) {
return $sql;
}
if (isset($idxoptions['FULLTEXT'])) {
$unique = ' FULLTEXT';
} elseif (isset($idxoptions['UNIQUE'])) {
$unique = ' UNIQUE';
} else {
$unique = '';
}
if ( is_array($flds) ) $flds = implode(', ',$flds);
if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname ";
else $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname;
$s .= ' (' . $flds . ')';
if ( isset($idxoptions[$this->upperName]) )
$s .= $idxoptions[$this->upperName];
$sql[] = $s;
return $sql;
}
}
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-oci8.inc.php
0,0 → 1,282
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_oci8 extends ADODB_DataDict {
var $databaseType = 'oci8';
var $seqField = false;
var $seqPrefix = 'SEQ_';
var $dropTable = "DROP TABLE %s CASCADE CONSTRAINTS";
var $trigPrefix = 'TRIG_';
var $alterCol = ' MODIFY ';
var $typeX = 'VARCHAR(4000)';
var $typeXL = 'CLOB';
function MetaType($t,$len=-1)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
switch (strtoupper($t)) {
case 'VARCHAR':
case 'VARCHAR2':
case 'CHAR':
case 'VARBINARY':
case 'BINARY':
if (isset($this) && $len <= $this->blobSize) return 'C';
return 'X';
case 'NCHAR':
case 'NVARCHAR2':
case 'NVARCHAR':
if (isset($this) && $len <= $this->blobSize) return 'C2';
return 'X2';
case 'NCLOB':
case 'CLOB':
return 'XL';
case 'LONG RAW':
case 'LONG VARBINARY':
case 'BLOB':
return 'B';
case 'DATE':
return 'T';
case 'INT':
case 'SMALLINT':
case 'INTEGER':
return 'I';
default:
return 'N';
}
}
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';
case 'X': return $this->typeX;
case 'XL': return $this->typeXL;
case 'C2': return 'NVARCHAR';
case 'X2': return 'NVARCHAR(2000)';
case 'B': return 'BLOB';
case 'D':
case 'T': return 'DATE';
case 'L': return 'DECIMAL(1)';
case 'I1': return 'DECIMAL(3)';
case 'I2': return 'DECIMAL(5)';
case 'I':
case 'I4': return 'DECIMAL(10)';
case 'I8': return 'DECIMAL(20)';
case 'F': return 'DECIMAL';
case 'N': return 'DECIMAL';
default:
return $meta;
}
}
function CreateDatabase($dbname, $options=false)
{
$options = $this->_Options($options);
$password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger';
$tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : '';
$sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace;
$sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname";
return $sql;
}
function AddColumnSQL($tabname, $flds)
{
$f = array();
list($lines,$pkey) = $this->_GenFields($flds);
$s = "ALTER TABLE $tabname ADD (";
foreach($lines as $v) {
$f[] = "\n $v";
}
$s .= implode(', ',$f).')';
$sql[] = $s;
return $sql;
}
function AlterColumnSQL($tabname, $flds)
{
$f = array();
list($lines,$pkey) = $this->_GenFields($flds);
$s = "ALTER TABLE $tabname MODIFY(";
foreach($lines as $v) {
$f[] = "\n $v";
}
$s .= implode(', ',$f).')';
$sql[] = $s;
return $sql;
}
function DropColumnSQL($tabname, $flds)
{
if (!is_array($flds)) $flds = explode(',',$flds);
foreach ($flds as $k => $v) $flds[$k] = $this->NameQuote($v);
$sql = array();
$s = "ALTER TABLE $tabname DROP(";
$s .= implode(', ',$flds).') CASCADE CONSTRAINTS';
$sql[] = $s;
return $sql;
}
function _DropAutoIncrement($t)
{
if (strpos($t,'.') !== false) {
$tarr = explode('.',$t);
return "drop sequence ".$tarr[0].".seq_".$tarr[1];
}
return "drop sequence seq_".$t;
}
// return string must begin with space
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
{
$suffix = '';
if ($fdefault == "''" && $fnotnull) {// this is null in oracle
$fnotnull = false;
if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle");
}
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fnotnull) $suffix .= ' NOT NULL';
if ($fautoinc) $this->seqField = $fname;
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
/*
CREATE or replace TRIGGER jaddress_insert
before insert on jaddress
for each row
begin
select seqaddress.nextval into :new.A_ID from dual;
end;
*/
function _Triggers($tabname,$tableoptions)
{
if (!$this->seqField) return array();
if ($this->schema) {
$t = strpos($tabname,'.');
if ($t !== false) $tab = substr($tabname,$t+1);
else $tab = $tabname;
$seqname = $this->schema.'.'.$this->seqPrefix.$tab;
$trigname = $this->schema.'.'.$this->trigPrefix.$this->seqPrefix.$tab;
} else {
$seqname = $this->seqPrefix.$tabname;
$trigname = $this->trigPrefix.$seqname;
}
if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname";
$seqCache = '';
if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];}
$seqIncr = '';
if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];}
$seqStart = '';
if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];}
$sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache";
$sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;";
$this->seqField = false;
return $sql;
}
/*
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
[table_options] [select_statement]
create_definition:
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[PRIMARY KEY] [reference_definition]
or PRIMARY KEY (index_col_name,...)
or KEY [index_name] (index_col_name,...)
or INDEX [index_name] (index_col_name,...)
or UNIQUE [INDEX] [index_name] (index_col_name,...)
or FULLTEXT [INDEX] [index_name] (index_col_name,...)
or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
or CHECK (expr)
*/
 
function _IndexSQL($idxname, $tabname, $flds,$idxoptions)
{
$sql = array();
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
if ( isset($idxoptions['DROP']) )
return $sql;
}
if ( empty ($flds) ) {
return $sql;
}
if (isset($idxoptions['BITMAP'])) {
$unique = ' BITMAP';
} elseif (isset($idxoptions['UNIQUE'])) {
$unique = ' UNIQUE';
} else {
$unique = '';
}
if ( is_array($flds) )
$flds = implode(', ',$flds);
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
if ( isset($idxoptions[$this->upperName]) )
$s .= $idxoptions[$this->upperName];
if (isset($idxoptions['oci8']))
$s .= $idxoptions['oci8'];
 
$sql[] = $s;
return $sql;
}
function GetCommentSQL($table,$col)
{
$table = $this->connection->qstr($table);
$col = $this->connection->qstr($col);
return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col";
}
function SetCommentSQL($table,$col,$cmt)
{
$cmt = $this->connection->qstr($cmt);
return "COMMENT ON COLUMN $table.$col IS $cmt";
}
}
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-postgres.inc.php
0,0 → 1,371
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_postgres extends ADODB_DataDict {
var $databaseType = 'postgres';
var $seqField = false;
var $seqPrefix = 'SEQ_';
var $addCol = ' ADD COLUMN';
var $quote = '"';
var $renameTable = 'ALTER TABLE %s RENAME TO %s'; // at least since 7.1
var $dropTable = 'DROP TABLE %s CASCADE';
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
$is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->unique &&
$fieldobj->has_default && substr($fieldobj->default_value,0,8) == 'nextval(';
switch (strtoupper($t)) {
case 'INTERVAL':
case 'CHAR':
case 'CHARACTER':
case 'VARCHAR':
case 'NAME':
case 'BPCHAR':
if ($len <= $this->blobSize) return 'C';
case 'TEXT':
return 'X';
case 'IMAGE': // user defined type
case 'BLOB': // user defined type
case 'BIT': // This is a bit string, not a single bit, so don't return 'L'
case 'VARBIT':
case 'BYTEA':
return 'B';
case 'BOOL':
case 'BOOLEAN':
return 'L';
case 'DATE':
return 'D';
case 'TIME':
case 'DATETIME':
case 'TIMESTAMP':
case 'TIMESTAMPTZ':
return 'T';
case 'INTEGER': return !$is_serial ? 'I' : 'R';
case 'SMALLINT':
case 'INT2': return !$is_serial ? 'I2' : 'R';
case 'INT4': return !$is_serial ? 'I4' : 'R';
case 'BIGINT':
case 'INT8': return !$is_serial ? 'I8' : 'R';
case 'OID':
case 'SERIAL':
return 'R';
case 'FLOAT4':
case 'FLOAT8':
case 'DOUBLE PRECISION':
case 'REAL':
return 'F';
default:
return 'N';
}
}
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';
case 'XL':
case 'X': return 'TEXT';
case 'C2': return 'VARCHAR';
case 'X2': return 'TEXT';
case 'B': return 'BYTEA';
case 'D': return 'DATE';
case 'T': return 'TIMESTAMP';
case 'L': return 'BOOLEAN';
case 'I': return 'INTEGER';
case 'I1': return 'SMALLINT';
case 'I2': return 'INT2';
case 'I4': return 'INT4';
case 'I8': return 'INT8';
case 'F': return 'FLOAT8';
case 'N': return 'NUMERIC';
default:
return $meta;
}
}
/**
* Adding a new Column
*
* reimplementation of the default function as postgres does NOT allow to set the default in the same statement
*
* @param string $tabname table-name
* @param string $flds column-names and types for the changed columns
* @return array with SQL strings
*/
function AddColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
$sql = array();
list($lines,$pkey) = $this->_GenFields($flds);
$alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' ';
foreach($lines as $v) {
if (($not_null = preg_match('/NOT NULL/i',$v))) {
$v = preg_replace('/NOT NULL/i','',$v);
}
if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) {
list(,$colname,$default) = $matches;
$sql[] = $alter . str_replace('DEFAULT '.$default,'',$v);
$sql[] = 'UPDATE '.$tabname.' SET '.$colname.'='.$default;
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default;
} else {
$sql[] = $alter . $v;
}
if ($not_null) {
list($colname) = explode(' ',$v);
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL';
}
}
return $sql;
}
/**
* Change the definition of one column
*
* Postgres can't do that on it's own, you need to supply the complete defintion of the new table,
* to allow, recreating the table and copying the content over to the new table
* @param string $tabname table-name
* @param string $flds column-name and type for the changed column
* @param string $tableflds complete defintion of the new table, eg. for postgres, default ''
* @param array/ $tableoptions options for the new table see CreateTableSQL, default ''
* @return array with SQL strings
*/
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
{
if (!$tableflds) {
if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL");
return array();
}
return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions);
}
/**
* Drop one column
*
* Postgres < 7.3 can't do that on it's own, you need to supply the complete defintion of the new table,
* to allow, recreating the table and copying the content over to the new table
* @param string $tabname table-name
* @param string $flds column-name and type for the changed column
* @param string $tableflds complete defintion of the new table, eg. for postgres, default ''
* @param array/ $tableoptions options for the new table see CreateTableSQL, default ''
* @return array with SQL strings
*/
function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
{
$has_drop_column = 7.3 <= (float) @$this->serverInfo['version'];
if (!$has_drop_column && !$tableflds) {
if ($this->debug) ADOConnection::outp("DropColumnSQL needs complete table-definiton for PostgreSQL < 7.3");
return array();
}
if ($has_drop_column) {
return ADODB_DataDict::DropColumnSQL($tabname, $flds);
}
return $this->_recreate_copy_table($tabname,$flds,$tableflds,$tableoptions);
}
/**
* Save the content into a temp. table, drop and recreate the original table and copy the content back in
*
* We also take care to set the values of the sequenz and recreate the indexes.
* All this is done in a transaction, to not loose the content of the table, if something went wrong!
* @internal
* @param string $tabname table-name
* @param string $dropflds column-names to drop
* @param string $tableflds complete defintion of the new table, eg. for postgres
* @param array/string $tableoptions options for the new table see CreateTableSQL, default ''
* @return array with SQL strings
*/
function _recreate_copy_table($tabname,$dropflds,$tableflds,$tableoptions='')
{
if ($dropflds && !is_array($dropflds)) $dropflds = explode(',',$dropflds);
$copyflds = array();
foreach($this->MetaColumns($tabname) as $fld) {
if (!$dropflds || !in_array($fld->name,$dropflds)) {
// we need to explicit convert varchar to a number to be able to do an AlterColumn of a char column to a nummeric one
if (preg_match('/'.$fld->name.' (I|I2|I4|I8|N|F)/i',$tableflds,$matches) &&
in_array($fld->type,array('varchar','char','text','bytea'))) {
$copyflds[] = "to_number($fld->name,'S9999999999999D99')";
} else {
$copyflds[] = $fld->name;
}
// identify the sequence name and the fld its on
if ($fld->primary_key && $fld->has_default &&
preg_match("/nextval\('([^']+)'::text\)/",$fld->default_value,$matches)) {
$seq_name = $matches[1];
$seq_fld = $fld->name;
}
}
}
$copyflds = implode(', ',$copyflds);
$tempname = $tabname.'_tmp';
$aSql[] = 'BEGIN'; // we use a transaction, to make sure not to loose the content of the table
$aSql[] = "SELECT * INTO TEMPORARY TABLE $tempname FROM $tabname";
$aSql = array_merge($aSql,$this->DropTableSQL($tabname));
$aSql = array_merge($aSql,$this->CreateTableSQL($tabname,$tableflds,$tableoptions));
$aSql[] = "INSERT INTO $tabname SELECT $copyflds FROM $tempname";
if ($seq_name && $seq_fld) { // if we have a sequence we need to set it again
$seq_name = $tabname.'_'.$seq_fld.'_seq'; // has to be the name of the new implicit sequence
$aSql[] = "SELECT setval('$seq_name',MAX($seq_fld)) FROM $tabname";
}
$aSql[] = "DROP TABLE $tempname";
// recreate the indexes, if they not contain one of the droped columns
foreach($this->MetaIndexes($tabname) as $idx_name => $idx_data)
{
if (substr($idx_name,-5) != '_pkey' && (!$dropflds || !count(array_intersect($dropflds,$idx_data['columns'])))) {
$aSql = array_merge($aSql,$this->CreateIndexSQL($idx_name,$tabname,$idx_data['columns'],
$idx_data['unique'] ? array('UNIQUE') : False));
}
}
$aSql[] = 'COMMIT';
return $aSql;
}
function DropTableSQL($tabname)
{
$sql = ADODB_DataDict::DropTableSQL($tabname);
$drop_seq = $this->_DropAutoIncrement($tabname);
if ($drop_seq) $sql[] = $drop_seq;
return $sql;
}
 
// return string must begin with space
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
{
if ($fautoinc) {
$ftype = 'SERIAL';
return '';
}
$suffix = '';
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fnotnull) $suffix .= ' NOT NULL';
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
// search for a sequece for the given table (asumes the seqence-name contains the table-name!)
// if yes return sql to drop it
// this is still necessary if postgres < 7.3 or the SERIAL was created on an earlier version!!!
function _DropAutoIncrement($tabname)
{
$tabname = $this->connection->quote('%'.$tabname.'%');
 
$seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'");
 
// check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly
if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.relfilenode=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) {
return False;
}
return "DROP SEQUENCE ".$seq;
}
/*
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
| table_constraint } [, ... ]
)
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
where column_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY |
CHECK (expression) |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ]
[ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
and table_constraint is:
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) |
PRIMARY KEY ( column_name [, ... ] ) |
CHECK ( expression ) |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
*/
/*
CREATE [ UNIQUE ] INDEX index_name ON table
[ USING acc_method ] ( column [ ops_name ] [, ...] )
[ WHERE predicate ]
CREATE [ UNIQUE ] INDEX index_name ON table
[ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] )
[ WHERE predicate ]
*/
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
{
$sql = array();
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
if ( isset($idxoptions['DROP']) )
return $sql;
}
if ( empty ($flds) ) {
return $sql;
}
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' ';
if (isset($idxoptions['HASH']))
$s .= 'USING HASH ';
if ( isset($idxoptions[$this->upperName]) )
$s .= $idxoptions[$this->upperName];
if ( is_array($flds) )
$flds = implode(', ',$flds);
$s .= '(' . $flds . ')';
$sql[] = $s;
return $sql;
}
function _GetSize($ftype, $ty, $fsize, $fprec)
{
if (strlen($fsize) && $ty != 'X' && $ty != 'B' && $ty != 'I' && strpos($ftype,'(') === false) {
$ftype .= "(".$fsize;
if (strlen($fprec)) $ftype .= ",".$fprec;
$ftype .= ')';
}
return $ftype;
}
}
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-sapdb.inc.php
0,0 → 1,121
<?php
 
/**
V4.50 6 July 2004 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Modified from datadict-generic.inc.php for sapdb by RalfBecker-AT-outdoor-training.de
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_sapdb extends ADODB_DataDict {
var $databaseType = 'sapdb';
var $seqField = false;
var $renameColumn = 'RENAME COLUMN %s.%s TO %s';
function ActualType($meta)
{
switch($meta) {
case 'C': return 'VARCHAR';
case 'XL':
case 'X': return 'LONG';
case 'C2': return 'VARCHAR UNICODE';
case 'X2': return 'LONG UNICODE';
case 'B': return 'LONG';
case 'D': return 'DATE';
case 'T': return 'TIMESTAMP';
case 'L': return 'BOOLEAN';
case 'I': return 'INTEGER';
case 'I1': return 'FIXED(3)';
case 'I2': return 'SMALLINT';
case 'I4': return 'INTEGER';
case 'I8': return 'FIXED(20)';
case 'F': return 'FLOAT(38)';
case 'N': return 'FIXED';
default:
return $meta;
}
}
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
static $maxdb_type2adodb = array(
'VARCHAR' => 'C',
'CHARACTER' => 'C',
'LONG' => 'X', // no way to differ between 'X' and 'B' :-(
'DATE' => 'D',
'TIMESTAMP' => 'T',
'BOOLEAN' => 'L',
'INTEGER' => 'I4',
'SMALLINT' => 'I2',
'FLOAT' => 'F',
'FIXED' => 'N',
);
$type = isset($maxdb_type2adodb[$t]) ? $maxdb_type2adodb[$t] : 'C';
 
// convert integer-types simulated with fixed back to integer
if ($t == 'FIXED' && !$fieldobj->scale && ($len == 20 || $len == 3)) {
$type = $len == 20 ? 'I8' : 'I1';
}
if ($fieldobj->auto_increment) $type = 'R';
 
return $type;
}
// return string must begin with space
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
{
$suffix = '';
if ($funsigned) $suffix .= ' UNSIGNED';
if ($fnotnull) $suffix .= ' NOT NULL';
if ($fautoinc) $suffix .= ' DEFAULT SERIAL';
elseif (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
 
function AddColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
$sql = array();
list($lines,$pkey) = $this->_GenFields($flds);
return array( 'ALTER TABLE ' . $tabname . ' ADD (' . implode(', ',$lines) . ')' );
}
function AlterColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
$sql = array();
list($lines,$pkey) = $this->_GenFields($flds);
return array( 'ALTER TABLE ' . $tabname . ' MODIFY (' . implode(', ',$lines) . ')' );
}
 
function DropColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
if (!is_array($flds)) $flds = explode(',',$flds);
foreach($flds as $k => $v) {
$flds[$k] = $this->NameQuote($v);
}
return array( 'ALTER TABLE ' . $tabname . ' DROP (' . implode(', ',$flds) . ')' );
}
}
 
?>
/web/kaklik's_web/torrentflux/adodb/datadict/datadict-sybase.inc.php
0,0 → 1,228
<?php
 
/**
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB2_sybase extends ADODB_DataDict {
var $databaseType = 'sybase';
var $dropIndex = 'DROP INDEX %2$s.%1$s';
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
$len = -1; // mysql max_length is not accurate
switch (strtoupper($t)) {
 
case 'INT':
case 'INTEGER': return 'I';
case 'BIT':
case 'TINYINT': return 'I1';
case 'SMALLINT': return 'I2';
case 'BIGINT': return 'I8';
case 'REAL':
case 'FLOAT': return 'F';
default: return parent::MetaType($t,$len,$fieldobj);
}
}
function ActualType($meta)
{
switch(strtoupper($meta)) {
case 'C': return 'VARCHAR';
case 'XL':
case 'X': return 'TEXT';
case 'C2': return 'NVARCHAR';
case 'X2': return 'NTEXT';
case 'B': return 'IMAGE';
case 'D': return 'DATETIME';
case 'T': return 'DATETIME';
case 'L': return 'BIT';
case 'I': return 'INT';
case 'I1': return 'TINYINT';
case 'I2': return 'SMALLINT';
case 'I4': return 'INT';
case 'I8': return 'BIGINT';
case 'F': return 'REAL';
case 'N': return 'NUMERIC';
default:
return $meta;
}
}
function AddColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
$f = array();
list($lines,$pkey) = $this->_GenFields($flds);
$s = "ALTER TABLE $tabname $this->addCol";
foreach($lines as $v) {
$f[] = "\n $v";
}
$s .= implode(', ',$f);
$sql[] = $s;
return $sql;
}
function AlterColumnSQL($tabname, $flds)
{
$tabname = $this->TableName ($tabname);
$sql = array();
list($lines,$pkey) = $this->_GenFields($flds);
foreach($lines as $v) {
$sql[] = "ALTER TABLE $tabname $this->alterCol $v";
}
 
return $sql;
}
function DropColumnSQL($tabname, $flds)
{
$tabname = $this->TableName($tabname);
if (!is_array($flds)) $flds = explode(',',$flds);
$f = array();
$s = "ALTER TABLE $tabname";
foreach($flds as $v) {
$f[] = "\n$this->dropCol ".$this->NameQuote($v);
}
$s .= implode(', ',$f);
$sql[] = $s;
return $sql;
}
// return string must begin with space
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
{
$suffix = '';
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
if ($fautoinc) $suffix .= ' DEFAULT AUTOINCREMENT';
if ($fnotnull) $suffix .= ' NOT NULL';
else if ($suffix == '') $suffix .= ' NULL';
if ($fconstraint) $suffix .= ' '.$fconstraint;
return $suffix;
}
/*
CREATE TABLE
[ database_name.[ owner ] . | owner. ] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
 
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
)
 
[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
 
< column_definition > ::= { column_name data_type }
[ COLLATE < collation_name > ]
[ [ DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL]
[ < column_constraint > ] [ ...n ]
 
< column_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}
 
< table_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ASC | DESC ] [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}
 
 
*/
/*
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[ WITH < index_option > [ ,...n] ]
[ ON filegroup ]
< index_option > :: =
{ PAD_INDEX |
FILLFACTOR = fillfactor |
IGNORE_DUP_KEY |
DROP_EXISTING |
STATISTICS_NORECOMPUTE |
SORT_IN_TEMPDB
}
*/
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
{
$sql = array();
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
if ( isset($idxoptions['DROP']) )
return $sql;
}
if ( empty ($flds) ) {
return $sql;
}
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
$clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
if ( is_array($flds) )
$flds = implode(', ',$flds);
$s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
if ( isset($idxoptions[$this->upperName]) )
$s .= $idxoptions[$this->upperName];
 
$sql[] = $s;
return $sql;
}
}
?>
/web/kaklik's_web/torrentflux/adodb/docs/docs-active-record.htm
0,0 → 1,467
<html>
<style>
pre {
background-color: #eee;
padding: 0.75em 1.5em;
font-size: 12px;
border: 1px solid #ddd;
}
 
li,p {
font-family: Arial, Helvetica, sans-serif ;
}
</style>
<title>ADOdb Active Record</title>
<body>
<h1>ADOdb Active Record</h1>
<p> (c) 2000-2006 John Lim (jlim#natsoft.com)</p>
<p><font size="1">This software is dual licensed using BSD-Style and LGPL. This
means you can use it in compiled proprietary and commercial products.</font></p>
<p><hr>
<ol>
 
<h3><li>Introduction</h3>
<p>
ADOdb_Active_Record is an Object Relation Mapping (ORM) implementation using PHP. In an ORM system, the tables and rows of the database are abstracted into native PHP objects. This allows the programmer to focus more on manipulating the data and less on writing SQL queries.
<p>
This implementation differs from Zend Framework's implementation in the following ways:
<ul>
<li>Works with PHP4 and PHP5 and provides equivalent functionality in both versions of PHP.<p>
<li>ADOdb_Active_Record works when you are connected to multiple databases. Zend's only works when connected to a default database.<p>
<li>Support for $ADODB_ASSOC_CASE. The field names are upper-cased, lower-cased or left in natural case depending on this setting.<p>
<li>No field name conversion to camel-caps style, unlike Zend's implementation which will convert field names such as 'first_name' to 'firstName'.<p>
<li>New ADOConnection::GetActiveRecords() and ADOConnection::GetActiveRecordsClass() functions in adodb.inc.php.<p>
<li>Caching of table metadata so it is only queried once per table, no matter how many Active Records are created.<p>
<li>The additional functionality is described <a href=#additional>below</a>.
</ul>
<P>
ADOdb_Active_Record is designed upon the principles of the "ActiveRecord" design pattern, which was first described by Martin Fowler. The ActiveRecord pattern has been implemented in many forms across the spectrum of programming languages. ADOdb_Active_Record attempts to represent the database as closely to native PHP objects as possible.
<p>
ADOdb_Active_Record maps a database table to a PHP class, and each instance of that class represents a table row. Relations between tables can also be defined, allowing the ADOdb_Active_Record objects to be nested.
<p>
 
<h3><li>Setting the Database Connection</h3>
<p>
The first step to using ADOdb_Active_Record is to set the default connection that an ADOdb_Active_Record objects will use to connect to a database.
 
<pre>
require_once('adodb/adodb-active-record.php');
 
$db = new ADOConnection('mysql://root:pwd@localhost/dbname');
ADOdb_Active_Record::SetDatabaseAdapter($db);
</pre>
 
<h3><li>Table Rows as Objects</h3>
<p>
First, let's create a temporary table in our MySQL database that we can use for demonstrative purposes throughout the rest of this tutorial. We can do this by sending a CREATE query:
 
<pre>
$db->Execute("CREATE TEMPORARY TABLE `persons` (
`id` int(10) unsigned NOT NULL auto_increment,
`name_first` varchar(100) NOT NULL default '',
`name_last` varchar(100) NOT NULL default '',
`favorite_color` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
");
</pre>
<p>
ADOdb_Active_Record's are object representations of table rows. Each table in the database is represented by a class in PHP. To begin working with a table as a ADOdb_Active_Record, a class that extends ADOdb_Active_Records needs to be created for it.
 
<pre>
class Person extends ADOdb_Active_Record{}
$person = new Person();
</pre>
 
<p>
In the above example, a new ADOdb_Active_Record object $person was created to access the "persons" table. Zend_Db_DataObject takes the name of the class, pluralizes it (according to American English rules), and assumes that this is the name of the table in the database.
<p>
This kind of behavior is typical of ADOdb_Active_Record. It will assume as much as possible by convention rather than explicit configuration. In situations where it isn't possible to use the conventions that ADOdb_Active_Record expects, options can be overridden as we'll see later.
 
<h3><li>Table Columns as Object Properties</h3>
<p>
When the $person object was instantiated, ADOdb_Active_Record read the table metadata from the database itself, and then exposed the table's columns (fields) as object properties.
<p>
Our "persons" table has three fields: "name_first", "name_last", and "favorite_color". Each of these fields is now a property of the $person object. To see all these properties, use the ADOdb_Active_Record::getAttributeNames() method:
<pre>
var_dump($person->getAttributeNames());
 
/**
* Outputs the following:
* array(4) {
* [0]=>
* string(2) "id"
* [1]=>
* string(9) "name_first"
* [2]=>
* string(8) "name_last"
* [3]=>
* string(13) "favorite_color"
* }
*/
</pre>
<p>
One big difference between ADOdb and Zend's implementation is we do not automatically convert to camelCaps style.
<p>
<h3><li>Inserting and Updating a Record</h3><p>
 
An ADOdb_Active_Record object is a representation of a single table row. However, when our $person object is instantiated, it does not reference any particular row. It is a blank record that does not yet exist in the database. An ADOdb_Active_Record object is considered blank when its primary key is NULL. The primary key in our persons table is "id".
<p>
To insert a new record into the database, change the object's properties and then call the ADOdb_Active_Record::save() method:
<pre>
$person = new Person();
$person->nameFirst = 'Andi';
$person->nameLast = 'Gutmans';
$person->save();
</pre>
<p>
Oh, no! The above code snippet does not insert a new record into the database. Instead, outputs an error:
<pre>
1048: Column 'name_first' cannot be null
</pre>
<p>
This error occurred because MySQL rejected the INSERT query that was generated by ADOdb_Active_Record. If exceptions are enabled in ADOdb and you are using PHP5, an error will be thrown. In the definition of our table, we specified all of the fields as NOT NULL; i.e., they must contain a value.
<p>
ADOdb_Active_Records are bound by the same contraints as the database tables they represent. If the field in the database cannot be NULL, the corresponding property in the ADOdb_Active_Record also cannot be NULL. In the example above, we failed to set the property $person->favoriteColor, which caused the INSERT to be rejected by MySQL.
<p>
To insert a new ADOdb_Active_Record in the database, populate all of ADOdb_Active_Record's properties so that they satisfy the constraints of the database table, and then call the save() method:
<pre>
/**
* Calling the save() method will successfully INSERT
* this $person into the database table.
*/
$person = new Person();
$person->name_first = 'Andi';
$person->name_last = 'Gutmans';
$person->favorite_color = 'blue';
$person->save();
</pre>
<p>
Once this $person has been INSERTed into the database by calling save(), the primary key can now be read as a property. Since this is the first row inserted into our temporary table, its "id" will be 1:
<pre>
var_dump($person->id);
 
/**
* Outputs the following:
* string(1)
*/
</pre>
<p>
From this point on, updating it is simply a matter of changing the object's properties and calling the save() method again:
 
<pre>
$person->favorite_color = 'red';
$person->save();
</pre>
<p>
The code snippet above will change the favorite color to red, and then UPDATE the record in the database.
 
<a name=additional>
<h2>ADOdb Specific Functionality</h2>
<h3><li>Setting the Table Name</h3>
<p>The default behaviour on creating an ADOdb_Active_Record is to "pluralize" the class name and use that as the table name. Often, this is not the case. For example, the Person class could be reading from the "People" table. We provide a constructor parameter to override the default table naming behaviour.
<pre>
class Person extends ADOdb_Active_Record{}
$person = new Person('People');
</pre>
<h3><li>$ADODB_ASSOC_CASE</h3>
<p>This allows you to control the case of field names and properties. For example, all field names in Oracle are upper-case by default. So you
can force field names to be lowercase using $ADODB_ASSOC_CASE. Legal values are as follows:
<pre>
0: lower-case
1: upper-case
2: native-case
</pre>
<p>So to force all Oracle field names to lower-case, use
<pre>
$ADODB_ASSOC_CASE = 0;
$person = new Person('People');
$person->name = 'Lily';
$ADODB_ASSOC_CASE = 2;
$person2 = new Person('People');
$person2->NAME = 'Lily';
</pre>
 
<p>Also see <a href=http://phplens.com/adodb/reference.constants.adodb_assoc_case.html>$ADODB_ASSOC_CASE</a>.
 
<h3><li>ADOdb_Active_Record::Replace</h3>
<p>
ADOdb supports replace functionality, whereby the record is inserted if it does not exists, or updated otherwise.
<pre>
$rec = new ADOdb_Active_Record("product");
$rec->name = 'John';
$rec->tel_no = '34111145';
$ok = $rec->replace(); // 0=failure, 1=update, 2=insert
</pre>
 
 
<h3><li>ADOdb_Active_Record::Load()</h3>
<p>Sometimes, we want to load a single record into an Active Record. We can do so using:
<pre>
$person->load("id=3");
 
// or using bind parameters
 
$person->load("id=?", array(3));
</pre>
<p>Returns false if an error occurs.
 
<h3><li>Error Handling and Debugging</h3>
<p>
In PHP5, if adodb-exceptions.inc.php is included, then errors are thrown. Otherwise errors are handled by returning a value. False by default means an error has occurred. You can get the last error message using the ErrorMsg() function.
<p>
To check for errors in ADOdb_Active_Record, do not poll ErrorMsg() as the last error message will always be returned, even if it occurred several operations ago. Do this instead:
<pre>
# right!
$ok = $rec->Save();
if (!$ok) $err = $rec->ErrorMsg();
 
# wrong :(
$rec->Save();
if ($rec->ErrorMsg()) echo "Wrong way to detect error";
</pre>
<p>The ADOConnection::Debug property is obeyed. So
if $db->debug is enabled, then ADOdb_Active_Record errors are also outputted to standard output and written to the browser.
 
<h3><li>ADOdb_Active_Record::Set()</h3>
<p>You can convert an array to an ADOdb_Active_Record using Set(). The array must be numerically indexed, and have all fields of the table defined in the array. The elements of the array must be in the table's natural order too.
<pre>
$row = $db->GetRow("select * from tablex where id=$id");
 
# PHP4 or PHP5 without enabling exceptions
$obj =& new ADOdb_Active_Record('Products');
if ($obj->ErrorMsg()){
echo $obj->ErrorMsg();
} else {
$obj->Set($row);
}
 
# in PHP5, with exceptions enabled:
 
include('adodb-exceptions.inc.php');
try {
$obj =& new ADOdb_Active_Record('Products');
$obj->Set($row);
} catch(exceptions $e) {
echo $e->getMessage();
}
</pre>
<p>
<h3><li>Primary Keys</h3>
<p>
ADOdb_Active_Record does not require the table to have a primary key. You can insert records for such a table, but you will not be able to update nor delete.
<p>Sometimes you are retrieving data from a view or table that has no primary key, but has a unique index. You can dynamically set the primary key of a table through the constructor, or using ADOdb_Active_Record::SetPrimaryKeys():
<pre>
$pkeys = array('category','prodcode');
// set primary key using constructor
$rec = new ADOdb_Active_Record('Products', $pkeys);
// or use method
$rec->SetPrimaryKeys($pkeys);
</pre>
<h3><li>Retrieval of Auto-incrementing ID</h3>
When creating a new record, the retrieval of the last auto-incrementing ID is not reliable for databases that do not support the Insert_ID() function call (check $connection->hasInsertID). In this case we perform a <b>SELECT MAX($primarykey) FROM $table</b>, which will not work reliably in a multi-user environment. You can override the ADOdb_Active_Record::LastInsertID() function in this case.
 
<h3><li>Dealing with Multiple Databases</h3>
<p>
Sometimes we want to load data from one database and insert it into another using ActiveRecords. This can be done using the optional parameter of the ADOdb_Active_Record constructor. In the following example, we read data from db.table1 and store it in db2.table2:
<pre>
$db = NewADOConnection(...);
$db2 = NewADOConnection(...);
 
ADOdb_Active_Record::SetDatabaseAdapter($db2);
 
$activeRecs = $db->GetActiveRecords('table1');
 
foreach($activeRecs as $rec) {
$rec2 = new ADOdb_Active_Record('table2',$db2);
$rec2->id = $rec->id;
$rec2->name = $rec->name;
$rec2->Save();
}
</pre>
<p>
If you have to pass in a primary key called "id" and the 2nd db connection in the constructor, you can do so too:
<pre>
$rec = new ADOdb_Active_Record("table1",array("id"),$db2);
</pre>
 
<h3><li>Active Record Considered Bad?</h3>
<p>Although the Active Record concept is useful, you have to be aware of some pitfalls when using Active Record. The level of granularity of Active Record is individual records. It encourages code like the following, used to increase the price of all furniture products by 10%:
<pre>
$recs = $db->GetActiveRecords("Products","category='Furniture'");
foreach($recs as $rec) {
$rec->price *= 1.1; // increase price by 10% for all Furniture products
$rec->save();
}
</pre>
Of course a SELECT statement is superior because it's simpler and much more efficient (probably by a factor of x10 or more):
<pre>
$db->Execute("update Products set price = price * 1.1 where category='Furniture'");
</pre>
<p>Another issue is performance. For performance sensitive code, using direct SQL will always be faster than using Active Records due to overhead and the fact that all fields in a row are retrieved (rather than only the subset you need) whenever an Active Record is loaded.
 
 
<h2>ADOConnection Supplement</h2>
 
<h3><li>ADOConnection::GetActiveRecords()</h3>
<p>
This allows you to retrieve an array of ADOdb_Active_Records. Returns false if an error occurs.
<pre>
$table = 'products';
$whereOrderBy = "name LIKE 'A%' ORDER BY Name";
$activeRecArr = $db->GetActiveRecords($table, $whereOrderBy);
foreach($activeRecArr as $rec) {
$rec->id = rand();
$rec->save();
}
</pre>
<p>
And to retrieve all records ordered by specific fields:
<pre>
$whereOrderBy = "1=1 ORDER BY Name";
$activeRecArr = $db->ADOdb_Active_Records($table);
</pre>
<p>
To use bind variables (assuming ? is the place-holder for your database):
<pre>
$activeRecArr = $db->GetActiveRecords($tableName, 'name LIKE ?',
array('A%'));
</pre>
<p>You can also define the primary keys of the table by passing an array of field names:
<pre>
$activeRecArr = $db->GetActiveRecords($tableName, 'name LIKE ?',
array('A%'), array('id'));
</pre>
 
<h3><li>ADOConnection::GetActiveRecordsClass()</h3>
<p>
This allows you to retrieve an array of objects derived from ADOdb_Active_Records. Returns false if an error occurs.
<pre>
class Product extends ADOdb_Active_Records{};
$table = 'products';
$whereOrderBy = "name LIKE 'A%' ORDER BY Name";
$activeRecArr = $db->GetActiveRecordsClass('Product',$table, $whereOrderBy);
 
# the objects in $activeRecArr are of class 'Product'
foreach($activeRecArr as $rec) {
$rec->id = rand();
$rec->save();
}
</pre>
<p>
To use bind variables (assuming ? is the place-holder for your database):
<pre>
$activeRecArr = $db->GetActiveRecordsClass($className,$tableName, 'name LIKE ?',
array('A%'));
</pre>
<p>You can also define the primary keys of the table by passing an array of field names:
<pre>
$activeRecArr = $db->GetActiveRecordsClass($className,$tableName, 'name LIKE ?',
array('A%'), array('id'));
</pre>
 
</ol>
 
<h2>Code Sample</h2>
<p>The following works with PHP4 and PHP5
<pre>
include('../adodb.inc.php');
include('../adodb-active-record.inc.php');
 
// uncomment the following if you want to test exceptions
#if (PHP_VERSION >= 5) include('../adodb-exceptions.inc.php');
 
$db = NewADOConnection('mysql://root@localhost/northwind');
$db->debug=1;
ADOdb_Active_Record::SetDatabaseAdapter($db);
 
$db->Execute("CREATE TEMPORARY TABLE `persons` (
`id` int(10) unsigned NOT NULL auto_increment,
`name_first` varchar(100) NOT NULL default '',
`name_last` varchar(100) NOT NULL default '',
`favorite_color` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
");
class Person extends ADOdb_Active_Record{}
$person = new Person();
 
echo "&lt;p>Output of getAttributeNames: ";
var_dump($person->getAttributeNames());
 
/**
* Outputs the following:
* array(4) {
* [0]=>
* string(2) "id"
* [1]=>
* string(9) "name_first"
* [2]=>
* string(8) "name_last"
* [3]=>
* string(13) "favorite_color"
* }
*/
 
$person = new Person();
$person->nameFirst = 'Andi';
$person->nameLast = 'Gutmans';
$person->save(); // this save() will fail on INSERT as favorite_color is a must fill...
 
 
$person = new Person();
$person->name_first = 'Andi';
$person->name_last = 'Gutmans';
$person->favorite_color = 'blue';
$person->save(); // this save will perform an INSERT successfully
 
echo "&lt;p>The Insert ID generated:"; print_r($person->id);
 
$person->favorite_color = 'red';
$person->save(); // this save() will perform an UPDATE
 
$person = new Person();
$person->name_first = 'John';
$person->name_last = 'Lim';
$person->favorite_color = 'lavender';
$person->save(); // this save will perform an INSERT successfully
 
// load record where id=2 into a new ADOdb_Active_Record
$person2 = new Person();
$person2->Load('id=2');
var_dump($person2);
 
// retrieve an array of records
$activeArr = $db->GetActiveRecordsClass($class = "Person",$table = "persons","id=".$db->Param(0),array(2));
$person2 =& $activeArr[0];
echo "&lt;p>Name first (should be John): ",$person->name_first, "&lt;br>Class = ",get_class($person2);
</pre>
 
<h3>Todo (Code Contributions welcome)</h3>
<p>Check _original and current field values before update, only update changes. Also if the primary key value is changed, then on update, we should save and use the original primary key values in the WHERE clause!
<p>Handle 1-to-many relationships.
<p>PHP5 specific: Make GetActiveRecords*() return an Iterator.
<p>PHP5 specific: Change PHP5 implementation of Active Record to use __get() and __set() for better performance.
 
<h3> Change Log</h3>
<p>0.02 <br>
- Much better error handling. ErrorMsg() implemented. Throw implemented if adodb-exceptions.inc.php detected.<br>
- You can now define the primary keys of the view or table you are accessing manually.<br>
- The Active Record allows you to create an object which does not have a primary key. You can INSERT but not UPDATE in this case.
- Set() documented.<br>
- Fixed _pluralize bug with y suffix.
 
<p>
0.01 6 Mar 2006<br>
- Fixed handling of nulls when saving (it didn't save nulls, saved them as '').<br>
- Better error handling messages.<br>
- Factored out a new method GetPrimaryKeys().<br>
<p>
0.00 5 Mar 2006<br>
1st release
</body>
</html>
/web/kaklik's_web/torrentflux/adodb/docs/docs-adodb.htm
0,0 → 1,3362
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>ADODB Manual</title>
 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 
<style>
pre {
background-color: #eee;
padding: 0.75em 1.5em;
font-size: 12px;
border: 1px solid #ddd;
}
</style></head>
<body bgcolor="#ffffff" text="black">
 
<h2>ADOdb Library for PHP</h2>
<p>V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com)</p>
<p><font size="1">This software is dual licensed using BSD-Style and LGPL. This
means you can use it in compiled proprietary and commercial products.</font></p>
 
<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a> &nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a>
 
</p><p><a href="#intro"><b>Introduction</b></a><b><br>
<a href="#features">Unique Features</a><br>
<a href="#users">How People are using ADOdb</a><br>
<a href="#bugs">Feature Requests and Bug Reports</a><br>
</b><b><a href="#install">Installation</a><br>
<a href="#mininstall">Minimum Install</a><br>
<a href="#coding">Initializing Code and Connectioning to Databases</a><br>
</b><font size="2"> &nbsp; <a href="#dsnsupport">Data Source Name (DSN) Support</a></font> &nbsp; <a href="#connect_ex">Connection Examples</a> <br>
<b><a href="#speed">High Speed ADOdb - tuning tips</a></b><br>
<b><a href="#hack">Hacking and Modifying ADOdb Safely</a><br>
<a href="#php5">PHP5 Features</a></b><br>
<font size="2"><a href="#php5iterators">foreach iterators</a> <a href="#php5exceptions">exceptions</a></font><br>
<b> <a href="#drivers">Supported Databases</a></b><br>
<b> <a href="#quickstart">Tutorials</a></b><br>
<a href="#ex1">Example 1: Select</a><br>
<a href="#ex2">Example 2: Advanced Select</a><br>
<a href="#ex3">Example 3: Insert</a><br>
<a href="#ex4">Example 4: Debugging</a> &nbsp;<a href="#exrs2html">rs2html
example</a><br>
<a href="#ex5">Example 5: MySQL and Menus</a><br>
<a href="#ex6">Example 6: Connecting to Multiple Databases at once</a> <br>
<a href="#ex7">Example 7: Generating Update and Insert SQL</a> <br>
<a href="#ex8">Example 8: Implementing Scrolling with Next and Previous</a><br>
<a href="#ex9">Example 9: Exporting in CSV or Tab-Delimited Format</a> <br>
<a href="#ex10">Example 10: Custom filters</a><br>
<a href="#ex11">Example 11: Smart Transactions</a><br>
<br>
<b> <a href="#errorhandling">Using Custom Error Handlers and PEAR_Error</a><br>
<a href="#DSN">Data Source Names</a><br>
<a href="#caching">Caching</a><br>
<a href="#pivot">Pivot Tables</a></b>
</p><p><a href="#ref"><b>REFERENCE</b></a>
</p><p> <font size="2">Variables: <a href="#adodb_countrecs">$ADODB_COUNTRECS</a>
<a href="#adodb_ansi_padding_off">$ADODB_ANSI_PADDING_OFF</a>
<a href="#adodb_cache_dir">$ADODB_CACHE_DIR</a> <br>
&nbsp; &nbsp; &nbsp; &nbsp; <a href="#force_type">$ADODB_FORCE_TYPE</a>
<a href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a>
<a href="#adodb_lang">$ADODB_LANG</a> <br>
Constants: </font><font size="2"><a href="#adodb_assoc_case">ADODB_ASSOC_CASE</a>
</font><br>
<a href="#ADOConnection"><b> ADOConnection</b></a><br>
<font size="2">Connections: <a href="#connect">Connect</a> <a href="#pconnect">PConnect</a>
<a href="#nconnect">NConnect</a> <a href="#isconnected">IsConnected</a><br>
Executing SQL: <a href="#execute">Execute</a> <a href="#cacheexecute"><i>CacheExecute</i></a>
<a href="#selectlimit">SelectLimit</a> <a href="#cacheSelectLimit"><i>CacheSelectLimit</i></a>
<a href="#param">Param</a> <a href="#prepare">Prepare</a> <a href="#preparesp">PrepareSP</a>
<a href="#inparameter">InParameter</a> <a href="#outparameter">OutParameter</a> <a href="#autoexecute">AutoExecute</a>
<br>
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="#getone">GetOne</a>
<a href="#cachegetone"><i>CacheGetOne</i></a> <a href="#getrow">GetRow</a> <a href="#cachegetrow"><i>CacheGetRow</i></a>
<a href="#getall">GetAll</a> <a href="#cachegetall"><i>CacheGetAll</i></a> <a href="#getcol">GetCol</a>
<a href="#cachegetcol"><i>CacheGetCol</i></a> <a href="#getassoc1">GetAssoc</a> <a href="#cachegetassoc"><i>CacheGetAssoc</i></a> <a href="#replace">Replace</a>
<br>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="#executecursor">ExecuteCursor</a>
(oci8 only)<br>
Generates SQL strings: <a href="#getupdatesql">GetUpdateSQL</a> <a href="#getinsertsql">GetInsertSQL</a>
<a href="#concat">Concat</a> <a href="#ifnull">IfNull</a> <a href="#length">length</a> <a href="#random">random</a> <a href="#substr">substr</a>
<a href="#qstr">qstr</a> <a href="#param">Param</a> <a href="#OffsetDate">OffsetDate</a> <a href="#SQLDate">SQLDate</a>
<a href="#dbdate">DBDate</a> <a href="#dbtimestamp">DBTimeStamp</a>
<br>
Blobs: <a href="#updateblob">UpdateBlob</a> <a href="#updateclob">UpdateClob</a>
<a href="#updateblobfile">UpdateBlobFile</a> <a href="#blobencode">BlobEncode</a>
<a href="#blobdecode">BlobDecode</a><br>
Paging/Scrolling: <a href="#pageexecute">PageExecute</a> <a href="#cachepageexecute">CachePageExecute</a><br>
Cleanup: <a href="#cacheflush">CacheFlush</a> <a href="#Close">Close</a><br>
Transactions: <a href="#starttrans">StartTrans</a> <a href="#completetrans">CompleteTrans</a>
<a href="#failtrans">FailTrans</a> <a href="#hasfailedtrans">HasFailedTrans</a>
<a href="#begintrans">BeginTrans</a> <a href="#committrans">CommitTrans</a>
<a href="#rollbacktrans">RollbackTrans</a> <br>
Fetching Data: </font> <font size="2"><a href="#setfetchmode">SetFetchMode</a><br>
Strings: <a href="#concat">concat</a> <a href="#length">length</a> <a href="#qstr">qstr</a> <a href="#quote">quote</a> <a href="#substr">substr</a><br>
Dates: <a href="#dbdate">DBDate</a> <a href="#dbtimestamp">DBTimeStamp</a> <a href="#unixdate">UnixDate</a>
<a href="#unixtimestamp">UnixTimeStamp</a> <a href="#OffsetDate">OffsetDate</a>
<a href="#SQLDate">SQLDate</a> <br>
Row Management: <a href="#affected_rows">Affected_Rows</a> <a href="#inserted_id">Insert_ID</a> <a href="#rowlock">RowLock</a>
<a href="#genid">GenID</a> <a href="#createseq">CreateSequence</a> <a href="#dropseq">DropSequence</a>
<br>
Error Handling: <a href="#errormsg">ErrorMsg</a> <a href="#errorno">ErrorNo</a>
<a href="#metaerror">MetaError</a> <a href="#metaerrormsg">MetaErrorMsg</a><br>
Data Dictionary (metadata): <a href="#metadatabases">MetaDatabases</a> <a href="#metatables">MetaTables</a>
<a href="#metacolumns">MetaColumns</a> <a href="#metacolumnames">MetaColumnNames</a>
<a href="#metaprimarykeys">MetaPrimaryKeys</a> <a href="#metaforeignkeys">MetaForeignKeys</a>
<a href="#serverinfo">ServerInfo</a> <br>
Statistics and Query-Rewriting: <a href="#logsql">LogSQL</a> <a href="#fnexecute">fnExecute
and fnCacheExecute</a><br>
</font><font size="2">Deprecated: <a href="#bind">Bind</a> <a href="#blankrecordset">BlankRecordSet</a>
<a href="#parameter">Parameter</a></font>
<a href="#adorecordSet"><b><br>
ADORecordSet</b></a><br>
<font size="2">
Returns one field: <a href="#fields">Fields</a><br>
Returns one row:<a href="#fetchrow">FetchRow</a> <a href="#fetchinto">FetchInto</a>
<a href="#fetchobject">FetchObject</a> <a href="#fetchnextobject">FetchNextObject</a>
<a href="#fetchobj">FetchObj</a> <a href="#fetchnextobj">FetchNextObj</a>
<a href="#getrowassoc">GetRowAssoc</a> <br>
Returns all rows:<a href="#getarray">GetArray</a> <a href="#getrows">GetRows</a>
<a href="#getassoc">GetAssoc</a><br>
Scrolling:<a href="#move">Move</a> <a href="#movenext">MoveNext</a> <a href="#movefirst">MoveFirst</a>
<a href="#movelast">MoveLast</a> <a href="#abspos">AbsolutePosition</a> <a href="#currentrow">CurrentRow</a>
<a href="#atfirstpage">AtFirstPage</a> <a href="#atlastpage">AtLastPage</a>
<a href="#absolutepage">AbsolutePage</a> </font> <font size="2"><br>
Menu generation:<a href="#getmenu">GetMenu</a> <a href="#getmenu2">GetMenu2</a><br>
Dates:<a href="#userdate">UserDate</a> <a href="#usertimestamp">UserTimeStamp</a>
<a href="#unixdate">UnixDate</a> <a href="#unixtimestamp">UnixTimeStamp<br>
</a>Recordset Info:<a href="#recordcount">RecordCount</a> <a href="#po_recordcount">PO_RecordSet</a>
<a href="#nextrecordset">NextRecordSet</a><br>
Field Info:<a href="#fieldcount">FieldCount</a> <a href="#fetchfield">FetchField</a>
<a href="#metatype">MetaType</a><br>
Cleanup: <a href="#rsclose">Close</a></font>
</p>
<p><font size="2"><a href="#rs2html"><b>rs2html</b></a>&nbsp; <a href="#exrs2html">example</a></font><br>
<a href="#adodiff">Differences between ADOdb and ADO</a><br>
<a href="#driverguide"><b>Database Driver Guide<br>
</b></a><b><a href="#changes">Change Log</a></b><br>
</p>
<h2>Introduction<a name="intro"></a></h2>
<p>PHP's database access functions are not standardised. This creates a need for
a database class library to hide the differences between the different database
API's (encapsulate the differences) so we can easily switch databases. PHP 4.0.5 or later
is now required (because we use array-based str_replace).</p>
<p>We currently support MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, Informix,
PostgreSQL, FrontBase, SQLite, Interbase (Firebird and Borland variants), Foxpro, Access, ADO, DB2, SAP DB and ODBC.
We have had successful reports of connecting to Progress and CacheLite via ODBC. We hope more people
will contribute drivers to support other databases.</p>
<p>PHP4 supports session variables. You can store your session information using
ADOdb for true portability and scalability. See adodb-session.php for more information.</p>
<p>Also read <a href="http://phplens.com/lens/adodb/tips_portable_sql.htm">tips_portable_sql.htm</a>
for tips on writing
portable SQL.</p>
<h2>Unique Features of ADOdb<a name="features"></a></h2>
<ul>
<li><b>Easy for Windows programmers</b> to adapt to because many of the conventions
are similar to Microsoft's ADO.</li>
<li>Unlike other PHP database classes which focus only on select statements,
<b>we provide support code to handle inserts and updates which can be adapted
to multiple databases quickly.</b> Methods are provided for date handling,
string concatenation and string quoting characters for differing databases.</li>
<li>A<b> metatype system </b>is built in so that we can figure out that types
such as CHAR, TEXT and STRING are equivalent in different databases.</li>
<li><b>Easy to port</b> because all the database dependant code are stored in
stub functions. You do not need to port the core logic of the classes.</li>
<li><b>Portable table and index creation</b> with the <a href="docs-datadict.htm">datadict</a> classes.
</li><li><b>Database performance monitoring and SQL tuning</b> with the <a href="docs-perf.htm">performance monitoring</a> classes.
</li><li><b>Database-backed sessions</b> with the <a href="docs-session.htm">session management</a> classes. Supports session expiry notification.
<li><b>Object-Relational Mapping</b> using <a href="docs-active-record.htm">ADOdb_Active_Record</a> classes.
</li></ul>
<h2>How People are using ADOdb<a name="users"></a></h2>
Here are some examples of how people are using ADOdb (for a much longer list,
visit <a href="http://phplens.com/phpeverywhere/adodb-cool-apps">adodb-cool-apps</a>):
<ul>
<li><a href="http://phplens.com/">PhpLens</a> is a commercial data grid
component that allows both cool Web designers and serious unshaved
programmers to develop and maintain databases on the Web easily.
Developed by the author of ADOdb.<p>
 
</p></li><li><a href="http://www.interakt.ro/phakt/">PHAkt: PHP Extension for DreamWeaver Ultradev</a> allows you to script PHP in the popular Web page editor. Database handling provided by ADOdb.<p>
 
</p></li><li><a href="http://www.andrew.cmu.edu/%7Erdanyliw/snort/snortacid.html">Analysis Console for Intrusion Databases</a>
(ACID): PHP-based analysis engine to search and process a database of
security incidents generated by security-related software such as IDSes
and firewalls (e.g. Snort, ipchains). By Roman Danyliw.<p>
 
</p></li><li><a href="http://www.postnuke.com/">PostNuke</a> is a very
popular free content management system and weblog system. It offers
full CSS support, HTML 4.01 transitional compliance throughout, an
advanced blocks system, and is fully multi-lingual enabled. <p>
 
</p></li><li><a href="http://www.auto-net.no/easypublish.php?page=index&amp;lang_id=2">EasyPublish CMS</a>
is another free content management system for managing information and
integrated modules on your internet, intranet- and extranet-sites. From
Norway.<p>
 
</p></li><li><a href="http://nola.noguska.com/">NOLA</a> is a full featured accounting, inventory, and job tracking application. It is licensed under the GPL, and developed by Noguska.
</li></ul><p>
 
</p><h2>Feature Requests and Bug Reports<a name="bugs"></a></h2>
<p>Feature requests and bug reports can be emailed to <a href="mailto:jlim#natsoft.com.my">jlim#natsoft.com.my</a>
or posted to the ADOdb Help forums at <a href="http://phplens.com/lens/lensforum/topics.php?id=4">http://phplens.com/lens/lensforum/topics.php?id=4</a>.</p>
<h2>Installation Guide<a name="install"></a></h2>
<p>Make sure you are running PHP 4.0.5 or later.
Unpack all the files into a directory accessible by your webserver.</p>
<p>To test, try modifying some of the tutorial examples. Make sure you customize
the connection settings correctly. You can debug using <i>$db-&gt;debug = true</i> as shown below:</p>
<pre>&lt;?php<br> include('adodb/adodb.inc.php');<br> $db = <a href="#adonewconnection">ADONewConnection</a>($dbdriver); # eg 'mysql' or 'postgres'<br> $db-&gt;debug = true;<br> $db-&gt;<a href="#connect">Connect</a>($server, $user, $password, $database);<br> $rs = $db-&gt;<a href="#execute">Execute</a>('select * from some_small_table');<br> print "&lt;pre&gt;";<br> print_r($rs-&gt;<a href="#getrows">GetRows</a>());<br> print "&lt;/pre&gt;";<br>?&gt;</pre>
 
<h3>Minimum Install<a name="mininstall"></a></h3>
<p>For developers who want to release a minimal install of ADOdb, you will need:
</p><ul>
<li>adodb.inc.php
</li><li>adodb-lib.inc.php
</li><li>adodb-time.inc.php
</li><li>drivers/adodb-$database.inc.php
</li><li>license.txt (for legal reasons)
</li><li>adodb-php4.inc.php
</li><li>adodb-iterator.inc.php (php5 functionality)
</li></ul>
Optional:
<ul>
<li>adodb-error.inc.php and lang/adodb-$lang.inc.php (if you use MetaError())
</li><li>adodb-csvlib.inc.php (if you use cached recordsets - CacheExecute(), etc)
</li><li>adodb-exceptions.inc.php and adodb-errorhandler.inc.php (if you use adodb error handler or php5 exceptions).
<li>adodb-active-record.inc.php if you use <a href=docs-active-record.htm>Active Records</a>.
</li></ul>
 
<h3>Code Initialization Examples<a name="coding"></a></h3>
<p>When running ADOdb, at least two files are loaded. First is adodb/adodb.inc.php,
which contains all functions used by all database classes. The code specific
to a particular database is in the adodb/driver/adodb-????.inc.php file.</p>
<a name="adonewconnection"></a>
<p>For example, to connect to a mysql database:</p>
<pre>include('/path/to/set/here/adodb.inc.php');<br>$conn = &amp;ADONewConnection('mysql');<br></pre>
<p>Whenever you need to connect to a database, you create a Connection object
using the <b>ADONewConnection</b>($driver) function.
<b>NewADOConnection</b>($driver) is an alternative name for the same function.</p>
 
<p>At this point, you are not connected to the database (no longer true if you pass in a <a href="#dsnsupport">dsn</a>). You will first need to decide
whether to use <i>persistent</i> or <i>non-persistent</i> connections. The advantage of <i>persistent</i>
connections is that they are faster, as the database connection is never closed (even
when you call Close()). <i>Non-persistent </i>connections take up much fewer resources though,
reducing the risk of your database and your web-server becoming overloaded.
</p><p>For persistent connections,
use $conn-&gt;<a href="#pconnect">PConnect()</a>,
or $conn-&gt;<a href="#connect">Connect()</a> for non-persistent connections.
Some database drivers also support <a href="#nconnect">NConnect()</a>, which forces
the creation of a new connection.
 
<a name="connection_gotcha"></a>
</p><p><b>Connection Gotcha</b>: If you create two connections, but both use the same userid and password,
PHP will share the same connection. This can cause problems if the connections are meant to
different databases. The solution is to always use different userid's for different databases,
or use NConnect().
 
<a name="dsnsupport"></a>
</p><h3>Data Source Name (DSN) Support</h3>
<p> Since ADOdb 4.51, you can connect to a database by passing a dsn to NewADOConnection() (or ADONewConnection, which is
the same function). The dsn format is:
</p><pre> $driver://$username:$password@hostname/$database?options[=value]<br></pre><p>
NewADOConnection() calls Connect() or PConnect() internally for you. If the connection fails, false is returned.
</p><pre> <font color="#008000"># non-persistent connection</font>
$dsn = 'mysql://root:pwd@localhost/mydb';
$db = NewADOConnection($dsn);
if (!$db) die("Connection failed");
<font color="#008000"># no need to call connect/pconnect!</font>
$arr = $db-&gt;GetArray("select * from table");
<font color="#008000"># persistent connection</font>
$dsn2 = 'mysql://root:pwd@localhost/mydb?persist';
</pre>
<p>
If you have special characters such as /:? in your dsn, then you need to rawurlencode them first:
</p><pre> $pwd = rawurlencode($pwd);<br> $dsn = "mysql://root:$pwd@localhost/mydb";<br></pre>
<p>
Legal options are:
</p><p>
<table align="center" border="1"><tbody><tr><td>For all drivers</td><td>
'persist', 'persistent', 'debug', 'fetchmode', 'new'
</td></tr><tr><td>Interbase/Firebird
</td><td>
'dialect','charset','buffers','role'
</td></tr><tr><td>M'soft ADO</td><td>
'charpage'
</td></tr><tr><td>MySQL</td><td>
'clientflags'
</td></tr><tr><td>MySQLi</td><td>
'port', 'socket', 'clientflags'
</td></tr><tr><td>Oci8</td><td>
'nls_date_format','charset'
</td></tr></tbody></table>
</p><p>
For all drivers, when the options <i>persist</i> or <i>persistent</i> are set, a persistent connection is forced; similarly, when <i>new</i> is set, then
a new connection will be created using NConnect if the underlying driver supports it.
The <i>debug</i> option enables debugging. The <i>fetchmode</i> calls <a href="#setfetchmode">SetFetchMode()</a>.
If no value is defined for an option, then the value is set to 1.
</p><p>
ADOdb DSN's are compatible with version 1.0 of PEAR DB's DSN format.
<a name="connect_ex">
</a></p><h3><a name="connect_ex">Examples of Connecting to Databases</a></h3>
<h4><a name="connect_ex">MySQL and Most Other Database Drivers</a></h4>
<p><a name="connect_ex">MySQL connections are very straightforward, and the parameters are identical
to mysql_connect:</a></p>
<pre><a name="connect_ex"> $conn = &amp;ADONewConnection('mysql'); <br> $conn-&gt;PConnect('localhost','userid','password','database');<br> <br> <font color="#008000"># or dsn </font>
$dsn = 'mysql://user:pwd@localhost/mydb';
$conn = ADONewConnection($dsn); # no need for Connect()
<font color="#008000"># or persistent dsn</font>
$dsn = 'mysql://user:pwd@localhost/mydb?persist';
$conn = ADONewConnection($dsn); # no need for PConnect()
<font color="#008000"># a more complex example:</font>
$pwd = urlencode($pwd);
$flags = MYSQL_CLIENT_COMPRESS;
$dsn = "mysql://user:$pwd@localhost/mydb?persist&amp;clientflags=$flags";
$conn = ADONewConnection($dsn); # no need for PConnect()
</a></pre>
<p><a name="connect_ex"> For most drivers, you can use the standard function: Connect($server, $user, $password, $database), or
a </a><a href="dsnsupport">DSN</a> since ADOdb 4.51. Exceptions to this are listed below.
</p>
<a name=pdo>
<h4>PDO</h4>
<p>PDO, which only works with PHP5, accepts a driver specific connection string:
<pre>
$conn =& NewADConnection('pdo');
$conn->Connect('mysql:host=localhost',$user,$pwd,$mydb);
$conn->Connect('mysql:host=localhost;dbname=mydb',$user,$pwd);
$conn->Connect("mysql:host=localhost;dbname=mydb;username=$user;password=$pwd");
</pre>
<p>The DSN mechanism is also supported:
<pre>
$conn =& NewADConnection("pdo_mysql://user:pwd@localhost/mydb?persist"); # persist is optional
</pre>
<h4>PostgreSQL</h4>
<p>PostgreSQL 7 and 8 accepts connections using: </p>
<p>a. the standard connection string:</p>
<pre> $conn = &amp;ADONewConnection('postgres'); <br> $conn-&gt;PConnect('host=localhost port=5432 dbname=mary');</pre>
<p> b. the classical 4 parameters:</p>
<pre> $conn-&gt;PConnect('localhost','userid','password','database');<br> </pre>
<p>c. dsn:
</p><pre> $dsn = 'postgres://user:pwd@localhost/mydb?persist'; # persist is optional
$conn = ADONewConnection($dsn); # no need for Connect/PConnect<br></pre>
<a name="ldap"></a>
 
<h4>LDAP</h4>
<p>Here is an example of querying a LDAP server. Thanks to Josh Eldridge for the driver and this example:
</p><pre>
require('/path/to/adodb.inc.php');
 
/* Make sure to set this BEFORE calling Connect() */
$LDAP_CONNECT_OPTIONS = Array(
Array ("OPTION_NAME"=>LDAP_OPT_DEREF, "OPTION_VALUE"=>2),
Array ("OPTION_NAME"=>LDAP_OPT_SIZELIMIT,"OPTION_VALUE"=>100),
Array ("OPTION_NAME"=>LDAP_OPT_TIMELIMIT,"OPTION_VALUE"=>30),
Array ("OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION,"OPTION_VALUE"=>3),
Array ("OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER,"OPTION_VALUE"=>13),
Array ("OPTION_NAME"=>LDAP_OPT_REFERRALS,"OPTION_VALUE"=>FALSE),
Array ("OPTION_NAME"=>LDAP_OPT_RESTART,"OPTION_VALUE"=>FALSE)
);
$host = 'ldap.baylor.edu';
$ldapbase = 'ou=People,o=Baylor University,c=US';
 
$ldap = NewADOConnection( 'ldap' );
$ldap->Connect( $host, $user_name='', $password='', $ldapbase );
 
echo "&lt;pre>";
 
print_r( $ldap->ServerInfo() );
$ldap->SetFetchMode(ADODB_FETCH_ASSOC);
$userName = 'eldridge';
$filter="(|(CN=$userName*)(sn=$userName*)(givenname=$userName*)(uid=$userName*))";
 
$rs = $ldap->Execute( $filter );
if ($rs)
while ($arr = $rs->FetchRow()) {
print_r($arr);
}
 
$rs = $ldap->Execute( $filter );
if ($rs)
while (!$rs->EOF) {
print_r($rs->fields);
$rs->MoveNext();
}
print_r( $ldap->GetArray( $filter ) );
print_r( $ldap->GetRow( $filter ) );
 
$ldap->Close();
echo "&lt;/pre>";
</pre>
<p>Using DSN:
<pre>
$dsn = "ldap://ldap.baylor.edu/ou=People,o=Baylor University,c=US";
$db = NewADOConnection($dsn);
</pre>
<h4>Interbase/Firebird</h4>
You define the database in the $host parameter:
<pre> $conn = &amp;ADONewConnection('ibase'); <br> $conn-&gt;PConnect('localhost:c:\ibase\employee.gdb','sysdba','masterkey');<br></pre>
<p>Or dsn:
</p><pre> $dsn = 'firebird://user:pwd@localhost/mydb?persist&amp;dialect=3'; # persist is optional<br> $conn = ADONewConnection($dsn); # no need for Connect/PConnect<br></pre>
<h4>SQLite</h4>
Sqlite will create the database file if it does not exist.
<pre> $conn = &amp;ADONewConnection('sqlite');
$conn-&gt;PConnect('c:\path\to\sqlite.db'); # sqlite will create if does not exist<br></pre>
<p>Or dsn:
</p><pre> $path = urlencode('c:\path\to\sqlite.db');
$dsn = "sqlite://$path/?persist"; # persist is optional
$conn = ADONewConnection($dsn); # no need for Connect/PConnect<br></pre>
<h4>Oracle (oci8)</h4>
<p>With oci8, you can connect in multiple ways. Note that oci8 works fine with
newer versions of the Oracle, eg. 9i and 10g.</p>
<p>a. PHP and Oracle reside on the same machine, use default SID.</p>
<pre> $conn-&gt;Connect(false, 'scott', 'tiger');</pre>
<p>b. TNS Name defined in tnsnames.ora (or ONAMES or HOSTNAMES), eg. 'myTNS'</p>
<pre> $conn-&gt;PConnect(false, 'scott', 'tiger', 'myTNS');</pre>
<p>or</p>
<pre> $conn-&gt;PConnect('myTNS', 'scott', 'tiger');</pre>
<p>c. Host Address and SID</p>
<pre>
$conn->connectSID = true;
$conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', 'SID');</pre>
<p>d. Host Address and Service Name</p>
<pre> $conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', 'servicename');</pre>
<p>e. Oracle connection string:
</p><pre> $cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$host)(PORT=$port))<br> (CONNECT_DATA=(SID=$sid)))";<br> $conn-&gt;Connect($cstr, 'scott', 'tiger');<br></pre>
<p>f. ADOdb dsn:
</p><pre> $dsn = 'oci8://user:pwd@tnsname/?persist'; # persist is optional<br> $conn = ADONewConnection($dsn); # no need for Connect/PConnect<br> <br> $dsn = 'oci8://user:pwd@host/sid';<br> $conn = ADONewConnection($dsn);<br> <br> $dsn = 'oci8://user:pwd@/'; # oracle on local machine<br> $conn = ADONewConnection($dsn);<br></pre>
<p>You can also set the charSet for Oracle 9.2 and later, supported since PHP 4.3.2, ADOdb 4.54:
</p><pre> $conn-&gt;charSet = 'we8iso8859p1';<br> $conn-&gt;Connect(...);<br> <br> # or<br> $dsn = 'oci8://user:pwd@tnsname/?charset=WE8MSWIN1252';<br> $db = ADONewConnection($dsn);<br></pre>
<a name="dsnless"></a>
<h4>DSN-less ODBC ( Access, MSSQL and DB2 examples)</h4>
<p>ODBC DSN's can be created in the ODBC control panel, or you can use a DSN-less
connection.To use DSN-less connections with ODBC you need PHP 4.3 or later.
</p>
<p>For Microsoft Access:</p>
<pre> $db =&amp; ADONewConnection('access');<br> $dsn = <strong>"Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\\northwind.mdb;Uid=Admin;Pwd=;";</strong>
$db-&gt;Connect($dsn);
</pre>
For Microsoft SQL Server:
<pre> $db =&amp; ADONewConnection('odbc_mssql');<br> $dsn = <strong>"Driver={SQL Server};Server=localhost;Database=northwind;"</strong>;<br> $db-&gt;Connect($dsn,'userid','password');<br></pre>
or if you prefer to use the mssql extension (which is limited to mssql 6.5 functionality):
<pre> $db =&amp; ADONewConnection('mssql');<br> $db-&gt;Execute('localhost', 'userid', 'password', 'northwind');<br></pre>
For DB2:
<pre>
$dbms = 'db2'; # or 'odbc_db2' if db2 extension not available
$db =&amp; ADONewConnection($dbms);
$dsn = "driver={IBM db2 odbc DRIVER};Database=sample;hostname=localhost;port=50000;protocol=TCPIP;".
"uid=root; pwd=secret";<br> $db-&gt;Connect($dsn);
</pre>
<b>DSN-less Connections with ADO</b><br>
If you are using versions of PHP earlier than PHP 4.3.0, DSN-less connections
only work with Microsoft's ADO, which is Microsoft's COM based API. An example
using the ADOdb library and Microsoft's ADO:
<pre>&lt;?php<br> include('adodb.inc.php'); <br> $db = &amp;ADONewConnection("ado_mssql");<br> print "&lt;h1&gt;Connecting DSN-less $db-&gt;databaseType...&lt;/h1&gt;";<br> <br> <b>$myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};"<br> . "SERVER=flipper;DATABASE=ai;UID=sa;PWD=;" ;</b>
$db-&gt;Connect($myDSN);
$rs = $db-&gt;Execute("select * from table");
$arr = $rs-&gt;GetArray();
print_r($arr);
?&gt;
</pre><a name="speed"></a>
<h2>High Speed ADOdb - tuning tips</h2>
<p>ADOdb is a big class library, yet it <a href="http://phplens.com/lens/adodb/">consistently beats</a> all other PHP class
libraries in performance. This is because it is designed in a layered fashion,
like an onion, with the fastest functions in the innermost layer. Stick to the
following functions for best performance:</p>
<table align="center" border="1" width="40%">
<tbody><tr>
<td><div align="center"><b>Innermost Layer</b></div></td>
</tr>
<tr>
<td><p align="center">Connect, PConnect, NConnect<br>
Execute, CacheExecute<br>
SelectLimit, CacheSelectLimit<br>
MoveNext, Close <br>
qstr, Affected_Rows, Insert_ID</p></td>
</tr>
</tbody></table>
<p>The fastest way to access the field data is by accessing the array $recordset-&gt;fields
directly. Also set the global variables <a href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a>
= ADODB_FETCH_NUM, and (for oci8, ibase/firebird and odbc) <a href="#adodb_countrecs">$ADODB_COUNTRECS</a> = false
before you connect to your database.</p>
<p>Consider using bind parameters if your database supports it, as it improves
query plan reuse. Use ADOdb's performance tuning system to identify bottlenecks
quickly. At the time of writing (Dec 2003), this means oci8 and odbc drivers.</p>
<p>Lastly make sure you have a PHP accelerator cache installed such as APC, Turck
MMCache, Zend Accelerator or ionCube.</p>
<p>Some examples:</p>
<table align="center" border="1"><tbody><tr><td><b>Fastest data retrieval using PHP</b></td><td><b>Fastest data retrieval using ADOdb extension</b></td></tr>
<tr><td>
<pre>$rs =&amp; $rs-&gt;Execute($sql);<br>while (!$rs-&gt;EOF) {<br> var_dump($rs-&gt;fields);<br> $rs-&gt;MoveNext();<br>}</pre></td><td>
<pre>$rs =&amp; $rs-&gt;Execute($sql);<br>$array = adodb_getall($rs);<br>var_dump($array);<br><br><br></pre></td></tr></tbody></table>
<p><b>Advanced Tips</b>
</p><p>If you have the <a href="http://adodb.sourceforge.net/#extension">ADOdb C extension</a> installed,
you can replace your calls to $rs-&gt;MoveNext() with adodb_movenext($rs).
This doubles the speed of this operation. For retrieving entire recordsets at once,
use GetArray(), which uses the high speed extension function adodb_getall($rs) internally.
</p><p>Execute() is the default way to run queries. You can use the low-level functions _Execute() and _query()
to reduce query overhead. Both these functions share the same parameters as Execute().
</p><p>If you do not have any bind parameters or your database supports
binding (without emulation),
then you can call _Execute() directly. Calling this function bypasses
bind emulation. Debugging is still supported in _Execute().
</p><p>If you do not require debugging facilities nor emulated
binding, and do not require a recordset to be returned, then you can
call _query. This is great for inserts, updates and deletes. Calling
this function
bypasses emulated binding, debugging, and recordset handling. Either
the resultid, true or false are returned by _query(). </p><p>For Informix, you can disable scrollable cursors with $db-&gt;cursorType = 0.
</p><p><a name="hack"></a> </p>
<h2>Hacking ADOdb Safely</h2>
<p>You might want to modify ADOdb for your own purposes. Luckily you can
still maintain backward compatibility by sub-classing ADOdb and using the $ADODB_NEWCONNECTION
variable. $ADODB_NEWCONNECTION allows you to override the behaviour of ADONewConnection().
ADOConnection() checks for this variable and will call
the function-name stored in this variable if it is defined.
</p><p>In the following example, new functionality for the connection object
is placed in the <i>hack_mysql</i> and <i>hack_postgres7</i> classes. The recordset class naming convention
can be controlled using $rsPrefix. Here we set it to 'hack_rs_', which will make ADOdb use
<i>hack_rs_mysql</i> and <i>hack_rs_postgres7</i> as the recordset classes.
 
 
</p><pre>class hack_mysql extends adodb_mysql {<br>var $rsPrefix = 'hack_rs_';<br> /* Your mods here */<br>}<br><br>class hack_rs_mysql extends ADORecordSet_mysql {<br> /* Your mods here */<br>}<br><br>class hack_postgres7 extends adodb_postgres7 {<br>var $rsPrefix = 'hack_rs_';<br> /* Your mods here */<br>}<br><br>class hack_rs_postgres7 extends ADORecordSet_postgres7 {<br> /* Your mods here */<br>}<br><br>$ADODB_NEWCONNECTION = 'hack_factory';<br><br>function&amp; hack_factory($driver)<br>{<br> if ($driver !== 'mysql' &amp;&amp; $driver !== 'postgres7') return false;<br> <br> $driver = 'hack_'.$driver;<br> $obj = new $driver();<br> return $obj;<br>}<br><br>include_once('adodb.inc.php');<br></pre>
<p></p><p>Don't forget to call the constructor of the parent class in
your constructor. If you want to use the default ADOdb drivers return
false in the above hack_factory() function.
<a name="php5"></a>
</p><h2>PHP5 Features</h2>
ADOdb 4.02 or later will transparently determine which version of PHP you are using.
If PHP5 is detected, the following features become available:
<ul>
 
<li><b>PDO</b>: PDO drivers are available. See the <a href=#pdo>connection examples</a>. Currently PDO drivers are
not as powerful as native drivers, and should be treated as experimental.<br><br>
<a name="php5iterators"></a>
<li><b>Foreach iterators</b>: This is a very natural way of going through a recordset:
<pre> $ADODB_FETCH_MODE = ADODB_FETCH_NUM;<br> $rs = $db-&gt;Execute($sql);<br> foreach($rs as $k =&gt; $row) {<br> echo "r1=".$row[0]." r2=".$row[1]."&lt;br&gt;";<br> }<br></pre>
<p>
<a name="php5exceptions"></a>
</p></li><li><b>Exceptions</b>: Just include <i>adodb-exceptions.inc.php</i> and you can now
catch exceptions on errors as they occur.
<pre> <b>include("../adodb-exceptions.inc.php");</b> <br> include("../adodb.inc.php"); <br> try { <br> $db = NewADOConnection("oci8"); <br> $db-&gt;Connect('','scott','bad-password'); <br> } catch (exception $e) { <br> var_dump($e); <br> adodb_backtrace($e-&gt;gettrace());<br> } <br></pre>
<p>Note that reaching EOF is <b>not</b> considered an error nor an exception.
</p></li></ul>
<h3><a name="drivers"></a>Databases Supported</h3>
The <i>name</i> below is the value you pass to NewADOConnection($name) to create a connection object for that database.
<p>
</p><p>
</p><table border="1" width="100%">
<tbody><tr valign="top">
<td><b>Name</b></td>
<td><b>Tested</b></td>
<td><b>Database</b></td>
<td><b><font size="2">RecordCount() usable</font></b></td>
<td><b>Prerequisites</b></td>
<td><b>Operating Systems</b></td>
</tr>
<tr valign="top">
<td><b><font size="2">access</font></b></td>
<td><font size="2">B</font></td>
<td><font size="2">Microsoft Access/Jet. You need to create an ODBC DSN.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">ODBC </font></td>
<td><font size="2">Windows only</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">ado</font></b></td>
<td><font size="2">B</font></td>
<td><p><font size="2">Generic ADO, not tuned for specific databases. Allows
DSN-less connections. For best performance, use an OLEDB provider. This
is the base class for all ado drivers.</font></p>
<p><font size="2">You can set $db-&gt;codePage before connecting.</font></p></td>
<td><font size="2">? depends on database</font></td>
<td><font size="2">ADO or OLEDB provider</font></td>
<td><font size="2">Windows only</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">ado_access</font></b></td>
<td><font size="2">B</font></td>
<td><font size="2">Microsoft Access/Jet using ADO. Allows DSN-less connections.
For best performance, use an OLEDB provider.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">ADO or OLEDB provider</font></td>
<td><font size="2">Windows only</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">ado_mssql</font></b></td>
<td><font size="2">B</font></td>
<td><font size="2">Microsoft SQL Server using ADO. Allows DSN-less connections.
For best performance, use an OLEDB provider.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">ADO or OLEDB provider</font></td>
<td><font size="2">Windows only</font></td>
</tr>
<tr valign="top">
<td height="54"><b><font size="2">db2</font></b></td>
<td height="54"><font size="2">C</font></td>
<td height="54"><font size="2">Uses PHP's db2-specific extension for better performance.</font></td>
<td height="54"><font size="2">Y/N</font></td>
<td height="54"><font size="2">DB2 CLI/ODBC interface</font></td>
<td height="54"> <p><font size="2">Unix and Windows. Requires IBM DB2 Universal Database client.</font></p></td>
</tr>
<tr valign="top">
<td height="54"><b><font size="2">odbc_db2</font></b></td>
<td height="54"><font size="2">C</font></td>
<td height="54"><font size="2">Connects to DB2 using generic ODBC extension.</font></td>
<td height="54"><font size="2">Y/N</font></td>
<td height="54"><font size="2">DB2 CLI/ODBC interface</font></td>
<td height="54"> <p><font size="2">Unix and Windows. <a href="http://www.faqts.com/knowledge_base/view.phtml/aid/6283/fid/14">Unix
install hints</a>. I have had reports that the $host and $database params have to be reversed in Connect() when using the CLI interface.</font></p></td>
</tr>
<tr valign="top">
<td><b><font size="2">vfp</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">Microsoft Visual FoxPro. You need to create an ODBC DSN.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">ODBC</font></td>
<td><font size="2">Windows only</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">fbsql</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">FrontBase. </font></td>
<td><font size="2">Y</font></td>
<td><font size="2">?</font></td>
<td> <p><font size="2">Unix and Windows</font></p></td>
</tr>
<tr valign="top">
<td><b><font size="2">ibase</font></b></td>
<td><font size="2">B</font></td>
<td><font size="2">Interbase 6 or earlier. Some users report you might need
to use this<br>
$db-&gt;PConnect('localhost:c:/ibase/employee.gdb', "sysdba", "masterkey")
to connect. Lacks Affected_Rows currently.<br>
<br>
You can set $db-&gt;role, $db-&gt;dialect, $db-&gt;buffers and $db-&gt;charSet before connecting.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Interbase client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><i><font size="2">firebird</font></i></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Firebird version of interbase.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Interbase client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><i><font size="2">borland_ibase</font></i></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Borland version of Interbase 6.5 or later. Very sad that
the forks differ.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Interbase client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
 
<tr valign="top">
<td><b><font size="2">informix</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Generic informix driver. Use this if you are using Informix 7.3 or later.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Informix client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">informix72</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2"> Informix databases before Informix 7.3 that do no support
SELECT FIRST.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Informix client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">ldap</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">LDAP driver. See this example for usage information.</font></td>
<td>&nbsp;</td>
<td><font size="2">LDAP extension</font></td>
<td><font size="2">?</font></td>
</tr>
<tr valign="top">
<td height="73"><b><font size="2">mssql</font></b></td>
<td height="73"><font size="2">A</font></td>
<td height="73"> <p><font size="2">Microsoft SQL Server 7 and later. Works
with Microsoft SQL Server 2000 also. Note that date formating is problematic
with this driver. For example, the PHP mssql extension does not return
the seconds for datetime!</font></p></td>
<td height="73"><font size="2">Y/N</font></td>
<td height="73"><font size="2">Mssql client</font></td>
<td height="73"> <p><font size="2">Unix and Windows. <br>
<a href="http://phpbuilder.com/columns/alberto20000919.php3">Unix install
howto</a> and <a href="http://linuxjournal.com/article.php?sid=6636&amp;mode=thread&amp;order=0">another
one</a>. </font></p></td>
</tr>
<tr valign="top">
<td height="73"><b><font size="2">mssqlpo</font></b></td>
<td height="73"><font size="2">A</font></td>
<td height="73"> <p><font size="2">Portable mssql driver. Identical to above
mssql driver, except that '||', the concatenation operator, is converted
to '+'. Useful for porting scripts from most other sql variants that use
||.</font></p></td>
<td height="73"><font size="2">Y/N</font></td>
<td height="73"><font size="2">Mssql client</font></td>
<td height="73"> <p><font size="2">Unix and Windows. <a href="http://phpbuilder.com/columns/alberto20000919.php3"><br>
Unix install howto</a>.</font></p></td>
</tr>
<tr valign="top">
<td><b><font size="2">mysql</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">MySQL without transaction support. You can also set $db-&gt;clientFlags
before connecting.</font></td>
<td><font size="2">Y</font></td>
<td><font size="2">MySQL client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><font size="2"><b>mysqlt</b> or <b>maxsql</b></font></td>
<td><font size="2">A</font></td>
<td> <p><font size="2">MySQL with transaction support. We recommend using
|| as the concat operator for best portability. This can be done by running
MySQL using: <br>
<i>mysqld --ansi</i> or <i>mysqld --sql-mode=PIPES_AS_CONCAT</i></font></p></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">MySQL client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">oci8</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">Oracle 8/9. Has more functionality than <i>oracle</i> driver
(eg. Affected_Rows). You might have to putenv('ORACLE_HOME=...') before
Connect/PConnect. </font> <p><font size="2"> There are 2 ways of connecting
- with server IP and service name: <br>
<i>PConnect('serverip:1521','scott','tiger','service'</i>)<br>
or using an entry in TNSNAMES.ORA or ONAMES or HOSTNAMES: <br>
<i>PConnect(false, 'scott', 'tiger', $oraname)</i>. </font>
</p><p><font size="2">Since 2.31, we support Oracle REF cursor variables directly
(see <a href="#executecursor">ExecuteCursor</a>).</font> </p></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Oracle client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">oci805</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Supports reduced Oracle functionality for Oracle 8.0.5.
SelectLimit is not as efficient as in the oci8 or oci8po drivers.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Oracle client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">oci8po</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">Oracle 8/9 portable driver. This is nearly identical with
the oci8 driver except (a) bind variables in Prepare() use the ? convention,
instead of :bindvar, (b) field names use the more common PHP convention
of lowercase names. </font> <p><font size="2">Use this driver if porting
from other databases is important. Otherwise the oci8 driver offers better
performance. </font> </p></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Oracle client</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">odbc</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">Generic ODBC, not tuned for specific databases. To connect,
use <br>
PConnect('DSN','user','pwd'). This is the base class for all odbc derived
drivers.</font></td>
<td><font size="2">? depends on database</font></td>
<td><font size="2">ODBC</font></td>
<td><font size="2">Unix and Windows. <a href="http://phpbuilder.com/columns/alberto20000919.php3?page=4">Unix
hints.</a></font></td>
</tr>
<tr valign="top">
<td><b><font size="2">odbc_mssql</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Uses ODBC to connect to MSSQL</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">ODBC</font></td>
<td><font size="2">Unix and Windows. </font></td>
</tr>
<tr valign="top">
<td><b><font size="2">odbc_oracle</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Uses ODBC to connect to Oracle</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">ODBC</font></td>
<td><font size="2">Unix and Windows. </font></td>
</tr>
<tr valign="top">
<td><b><font size="2">odbtp</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Generic odbtp driver. <a href="http://odbtp.sourceforge.net/">Odbtp</a> is a software for
accessing Windows ODBC data sources from other operating systems.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">odbtp</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">odbtp_unicode</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Odtbp with unicode support</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">odbtp</font></td>
<td><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td height="34"><b><font size="2">oracle</font></b></td>
<td height="34"><font size="2">C</font></td>
<td height="34"><font size="2">Implements old Oracle 7 client API. Use oci8
driver if possible for better performance.</font></td>
<td height="34"><font size="2">Y/N</font></td>
<td height="34"><font size="2">Oracle client</font></td>
<td height="34"><font size="2">Unix and Windows</font></td>
</tr>
<tr valign="top">
<td height="34"><b><font size="2">netezza</font></b></td>
<td height="34"><font size="2">C</font></td>
<td height="34"><font size="2">Netezza driver. Netezza is based on postgres code-base.</font></td>
<td height="34"><font size="2">Y</font></td>
<td height="34"><font size="2">?</font></td>
<td height="34"><font size="2">?</font></td>
</tr>
<tr valign="top">
<td><b><font size="2">pdo</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Generic PDO driver for PHP5. </font></td>
<td><font size="2">Y</font></td>
<td><font size="2">PDO extension and database specific drivers</font></td>
<td><font size="2">Unix and Windows. </font></td>
</tr>
<tr valign="top">
<td><b><font size="2">postgres</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">Generic PostgreSQL driver. Currently identical to postgres7
driver.</font></td>
<td><font size="2">Y</font></td>
<td><font size="2">PostgreSQL client</font></td>
<td><font size="2">Unix and Windows. </font></td>
</tr>
<tr valign="top">
<td><b><font size="2">postgres64</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">For PostgreSQL 6.4 and earlier which does not support LIMIT
internally.</font></td>
<td><font size="2">Y</font></td>
<td><font size="2">PostgreSQL client</font></td>
<td><font size="2">Unix and Windows. </font></td>
</tr>
<tr valign="top">
<td><b><font size="2">postgres7</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">PostgreSQL which supports LIMIT and other version 7 functionality.</font></td>
<td><font size="2">Y</font></td>
<td><font size="2">PostgreSQL client</font></td>
<td><font size="2">Unix and Windows. </font></td>
</tr>
<tr valign="top">
<td><b><font size="2">postgres8</font></b></td>
<td><font size="2">A</font></td>
<td><font size="2">PostgreSQL which supports version 8 functionality.</font></td>
<td><font size="2">Y</font></td>
<td><font size="2">PostgreSQL client</font></td>
<td><font size="2">Unix and Windows. </font></td>
</tr>
<tr valign="top">
<td><b><font size="2">sapdb</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">SAP DB. Should work reliably as based on ODBC driver.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">SAP ODBC client</font></td>
<td> <p><font size="2">?</font></p></td>
</tr>
<tr valign="top">
<td><b><font size="2">sqlanywhere</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Sybase SQL Anywhere. Should work reliably as based on ODBC
driver.</font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">SQL Anywhere ODBC client</font></td>
<td> <p><font size="2">?</font></p></td>
</tr>
<tr valign="top">
<td height="54"><b><font size="2">sqlite</font></b></td>
<td height="54"><font size="2">B</font></td>
<td height="54"><font size="2">SQLite.</font></td>
<td height="54"><font size="2">Y</font></td>
<td height="54"><font size="2">-</font></td>
<td height="54"> <p><font size="2">Unix and Windows.</font></p></td>
</tr>
<tr valign="top">
<td height="54"><b><font size="2">sqlitepo</font></b></td>
<td height="54"><font size="2">B</font></td>
<td height="54"><font size="2">Portable SQLite driver. This is because assoc mode does not work like other drivers in sqlite.
Namely, when selecting (joining) multiple tables, the table
names are included in the assoc keys in the "sqlite" driver.</font><p>
<font size="2"> In "sqlitepo" driver, the table names are stripped from the returned column names.
When this results in a conflict, the first field get preference.
</font></p></td>
<td height="54"><font size="2">Y</font></td>
<td height="54"><font size="2">-</font></td>
<td height="54"> <p><font size="2">Unix and Windows.</font></p></td>
</tr>
<tr valign="top">
<td><b><font size="2">sybase</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Sybase. </font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Sybase client</font></td>
<td> <p><font size="2">Unix and Windows.</font></p></td>
</tr>
<tr valign="top">
<td><b><font size="2">sybase_ase</font></b></td>
<td><font size="2">C</font></td>
<td><font size="2">Sybase ASE. </font></td>
<td><font size="2">Y/N</font></td>
<td><font size="2">Sybase client</font></td>
<td> <p><font size="2">Unix and Windows.</font></p></td>
</tr>
</tbody></table>
 
<p></p><p>The "Tested" column indicates how extensively the code has been tested
and used. <br>
A = well tested and used by many people<br>
B = tested and usable, but some features might not be implemented<br>
C = user contributed or experimental driver. Might not fully support all of
the latest features of ADOdb. </p>
<p>The column "RecordCount() usable" indicates whether RecordCount()
return the number of rows, or returns -1 when a SELECT statement is executed.
If this column displays Y/N then the RecordCount() is emulated when the global
variable $ADODB_COUNTRECS=true (this is the default). Note that for large recordsets,
it might be better to disable RecordCount() emulation because substantial amounts
of memory are required to cache the recordset for counting. Also there is a
speed penalty of 40-50% if emulation is required. This is emulated in most databases
except for PostgreSQL and MySQL. This variable is checked every time a query
is executed, so you can selectively choose which recordsets to count.</p>
<p>
</p><hr />
<h1>Tutorials<a name="quickstart"></a></h1>
<h3>Example 1: Select Statement<a name="ex1"></a></h3>
<p>Task: Connect to the Access Northwind DSN, display the first 2 columns of each
row.</p>
<p>In this example, we create a ADOConnection object, which represents the connection
to the database. The connection is initiated with <a href="#pconnect"><font face="Courier New, Courier, mono">PConnect</font></a>,
which is a persistent connection. Whenever we want to query the database, we
call the <font face="Courier New, Courier, mono">ADOConnection.<a href="#execute">Execute</a>()</font>
function. This returns an ADORecordSet object which is actually a cursor that
holds the current row in the array <font face="Courier New, Courier, mono">fields[]</font>.
We use <font face="Courier New, Courier, mono"><a href="#movenext">MoveNext</a>()</font>
to move from row to row.</p>
<p>NB: A useful function that is not used in this example is <font face="Courier New, Courier, mono"><a href="#selectlimit">SelectLimit</a></font>,
which allows us to limit the number of rows shown.
</p><pre>&lt;?<br><font face="Courier New, Courier, mono"><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>$<font color="#660000">conn</font> = &amp;ADONewConnection('access'); # create a connection<br>$<font color="#660000">conn</font>-&gt;PConnect('northwind'); # connect to MS-Access, northwind DSN<br>$<font color="#660000">recordSet</font> = &amp;$<font color="#660000">conn</font>-&gt;Execute('select * from products');<br>if (!$<font color="#660000">recordSet</font>) <br> print $<font color="#660000">conn</font>-&gt;ErrorMsg();<br>else<br><b>while</b> (!$<font color="#660000">recordSet</font>-&gt;EOF) {<br> <b>print</b> $<font color="#660000">recordSet</font>-&gt;fields[0].' '.$<font color="#660000">recordSet</font>-&gt;fields[1].'&lt;BR&gt;';<br> $<font color="#660000">recordSet</font>-&gt;MoveNext();<br>}</font><font face="Courier New, Courier, mono">
 
$<font color="#660000">recordSet</font>-&gt;Close(); # optional<br>$<font color="#660000">conn</font>-&gt;Close(); # optional<br></font>
?&gt;
</pre>
<p>The $<font face="Courier New, Courier, mono">recordSet</font> returned stores
the current row in the <font face="Courier New, Courier, mono">$recordSet-&gt;fields</font>
array, indexed by column number (starting from zero). We use the <font face="Courier New, Courier, mono"><a href="#movenext">MoveNext</a>()</font>
function to move to the next row. The <font face="Courier New, Courier, mono">EOF</font>
property is set to true when end-of-file is reached. If an error occurs in Execute(),
we return false instead of a recordset.</p>
<p>The <code>$recordSet-&gt;fields[]</code> array is generated by the PHP database
extension. Some database extensions only index by number and do not index the
array by field name. To force indexing by name - that is associative arrays
- use the SetFetchMode function. Each recordset saves and uses whatever fetch
mode was set when the recordset was created in Execute() or SelectLimit().
</p><pre> $db-&gt;SetFetchMode(ADODB_FETCH_NUM);<br> $rs1 = $db-&gt;Execute('select * from table');<br> $db-&gt;SetFetchMode(ADODB_FETCH_ASSOC);<br> $rs2 = $db-&gt;Execute('select * from table');<br> print_r($rs1-&gt;fields); # shows <i>array([0]=&gt;'v0',[1] =&gt;'v1')</i>
print_r($rs2-&gt;fields); # shows <i>array(['col1']=&gt;'v0',['col2'] =&gt;'v1')</i>
</pre>
<p> </p>
<p>To get the number of rows in the select statement, you can use <font face="Courier New, Courier, mono">$recordSet-&gt;<a href="#recordcount">RecordCount</a>()</font>.
Note that it can return -1 if the number of rows returned cannot be determined.</p>
<h3>Example 2: Advanced Select with Field Objects<a name="ex2"></a></h3>
<p>Select a table, display the first two columns. If the second column is a date
or timestamp, reformat the date to US format.</p>
<pre>&lt;?<br><font face="Courier New, Courier, mono"><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>$<font color="#660000">conn</font> = &amp;ADONewConnection('access'); # create a connection<br>$<font color="#660000">conn</font>-&gt;PConnect('northwind'); # connect to MS-Access, northwind dsn<br>$<font color="#660000">recordSet</font> = &amp;$<font color="#660000">conn</font>-&gt;Execute('select CustomerID,OrderDate from Orders');<br>if (!$<font color="#660000">recordSet</font>) <br> print $<font color="#660000">conn</font>-&gt;ErrorMsg();<br>else<br><b>while</b> (!$<font color="#660000">recordSet</font>-&gt;EOF) {<br> $<font color="#660000">fld</font> = <font color="#336600"><b>$</b><font color="#660000">recordSet</font><b>-&gt;FetchField</b></font><font color="#006600">(</font>1<font color="#006600">);</font>
$<font color="#660000">type</font> = <font color="#336600"><b>$</b><font color="#660000">recordSet</font><b>-&gt;MetaType</b></font>($fld-&gt;type);<br><br> <b>if</b> ( $<font color="#660000">type</font> == 'D' || $<font color="#660000">type</font> == 'T') <br> <b>print</b> $<font color="#660000">recordSet</font>-&gt;fields[0].' '.<br> <b><font color="#336600">$</font></b><font color="#660000">recordSet</font><b><font color="#336600">-&gt;UserDate</font></b>($<font color="#660000">recordSet</font>-&gt;fields[1],'<b>m/d/Y</b>').'&lt;BR&gt;';<br> <b>else </b>
<b>print</b> $<font color="#660000">recordSet</font>-&gt;fields[0].' '.$<font color="#660000">recordSet</font>-&gt;fields[1].'&lt;BR&gt;';<br><br> $<font color="#660000">recordSet</font>-&gt;MoveNext();<br>}</font><font face="Courier New, Courier, mono">
$<font color="#660000">recordSet</font>-&gt;Close(); # optional<br>$<font color="#660000">conn</font>-&gt;Close(); # optional<br></font>
?&gt;
</pre>
<p>In this example, we check the field type of the second column using <font face="Courier New, Courier, mono"><a href="#fetchfield">FetchField</a>().</font>
This returns an object with at least 3 fields.</p>
<ul>
<li><b>name</b>: name of column</li>
<li> <b>type</b>: native field type of column</li>
<li> <b>max_length</b>: maximum length of field. Some databases such as MySQL
do not return the maximum length of the field correctly. In these cases max_length
will be set to -1.</li>
</ul>
<p>We then use <font face="Courier New, Courier, mono"><a href="#metatype">MetaType</a>()</font>
to translate the native type to a <i>generic</i> type. Currently the following
<i>generic</i> types are defined:</p>
<ul>
<li><b>C</b>: character fields that should be shown in a &lt;input type="text"&gt;
tag.</li>
<li><b>X</b>: TeXt, large text fields that should be shown in a &lt;textarea&gt;</li>
<li><b>B</b>: Blobs, or Binary Large Objects. Typically images.
</li><li><b>D</b>: Date field</li>
<li><b>T</b>: Timestamp field</li>
<li><b>L</b>: Logical field (boolean or bit-field)</li>
<li><b>I</b>:&nbsp; Integer field</li>
<li><b>N</b>: Numeric field. Includes autoincrement, numeric, floating point,
real and integer. </li>
<li><b>R</b>: Serial field. Includes serial, autoincrement integers. This works
for selected databases. </li>
</ul>
<p>If the metatype is of type date or timestamp, then we print it using the user
defined date format with <font face="Courier New, Courier, mono"><a href="#userdate">UserDate</a>(),</font>
which converts the PHP SQL date string format to a user defined one. Another
use for <font face="Courier New, Courier, mono"><a href="#metatype">MetaType</a>()</font>
is data validation before doing an SQL insert or update.</p>
<h3>Example 3: Inserting<a name="ex3"></a></h3>
<p>Insert a row to the Orders table containing dates and strings that need to
be quoted before they can be accepted by the database, eg: the single-quote
in the word <i>John's</i>.</p>
<pre>&lt;?<br><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>$<font color="#660000">conn</font> = &amp;ADONewConnection('access'); # create a connection<br><br>$<font color="#660000">conn</font>-&gt;PConnect('northwind'); # connect to MS-Access, northwind dsn<br>$<font color="#660000">shipto</font> = <font color="#006600"><b>$conn-&gt;qstr</b></font>("<i>John's Old Shoppe</i>");<br><br>$<font color="#660000">sql</font> = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";<br>$<font color="#660000">sql</font> .= "values ('ANATR',2,".<b><font color="#006600">$conn-&gt;DBDate(</font>time()<font color="#006600">)</font></b><font color="#006600">.</font>",$<font color="#660000">shipto</font>)";<br><br><b>if</b> ($<font color="#660000">conn</font>-&gt;Execute($<font color="#660000">sql</font>) <font color="#336600"><b>=== false</b></font>) {<br> <b>print</b> 'error inserting: '.<font color="#336600"><b>$conn-&gt;ErrorMsg()</b></font>.'&lt;BR&gt;';<br>}<br>?&gt;<br></pre>
<p>In this example, we see the advanced date and quote handling facilities of
ADOdb. The unix timestamp (which is a long integer) is appropriately formated
for Access with <font face="Courier New, Courier, mono"><a href="#dbdate">DBDate</a>()</font>,
and the right escape character is used for quoting the <i>John's Old Shoppe</i>,
which is<b> </b><i>John'<b>'</b>s Old Shoppe</i> and not PHP's default <i>John<b>'</b>s
Old Shoppe</i> with <font face="Courier New, Courier, mono"><a href="#qstr">qstr</a>()</font>.
</p>
<p>Observe the error-handling of the Execute statement. False is returned by<font face="Courier New, Courier, mono">
<a href="#execute">Execute</a>() </font>if an error occured. The error message
for the last error that occurred is displayed in <font face="Courier New, Courier, mono"><a href="#errormsg">ErrorMsg</a>()</font>.
Note: <i>php_track_errors</i> might have to be enabled for error messages to
be saved.</p>
<h3> Example 4: Debugging<a name="ex4"></a></h3>
<pre>&lt;?<br><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>$<font color="#663300">conn</font> = &amp;ADONewConnection('access'); # create a connection<br>$<font color="#663300">conn</font>-&gt;PConnect('northwind'); # connect to MS-Access, northwind dsn<br><font>$<font color="#663300">shipto</font> = <b>$conn-&gt;qstr</b>("John's Old Shoppe");<br>$<font color="#663300">sql</font> = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";<br>$<font color="#663300">sql</font> .= "values ('ANATR',2,".$<font color="#663300">conn</font>-&gt;FormatDate(time()).",$shipto)";<br><b><font color="#336600">$<font color="#663300">conn</font>-&gt;debug = true;</font></b>
<b>if</b> ($<font color="#663300">conn</font>-&gt;Execute($sql) <b>=== false</b>) <b>print</b> 'error inserting';</font>
?&gt;
</pre>
<p>In the above example, we have turned on debugging by setting <b>debug = true</b>.
This will display the SQL statement before execution, and also show any error
messages. There is no need to call <font face="Courier New, Courier, mono"><a href="#errormsg">ErrorMsg</a>()</font>
in this case. For displaying the recordset, see the <font face="Courier New, Courier, mono"><a href="#exrs2html">rs2html</a>()
</font>example.</p>
<p>Also see the section on <a href="#errorhandling">Custom Error Handlers</a>.</p>
<h3>Example 5: MySQL and Menus<a name="ex5"></a></h3>
<p>Connect to MySQL database <i>agora</i>, and generate a &lt;select&gt; menu
from an SQL statement where the &lt;option&gt; captions are in the 1st column,
and the value to send back to the server is in the 2nd column.</p>
<pre>&lt;?<br><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>$<font color="#663300">conn</font> = &amp;ADONewConnection('mysql'); # create a connection<br>$<font color="#663300">conn</font>-&gt;PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br><font>$<font color="#663300">sql</font> = 'select CustomerName, CustomerID from customers';<br>$<font color="#663300">rs</font> = $<font color="#663300">conn</font>-&gt;Execute($sql);<br><b>print</b> <b><font color="#336600">$<font color="#663300">rs</font>-&gt;GetMenu('GetCust','Mary Rosli');<br>?&gt;</font></b></font></pre>
<p>Here we define a menu named GetCust, with the menu option 'Mary Rosli' selected.
See <a href="#getmenu"><font face="Courier New, Courier, mono">GetMenu</font></a><font face="Courier New, Courier, mono">()</font>.
We also have functions that return the recordset as an array: <font face="Courier New, Courier, mono"><a href="#getarray">GetArray</a>()</font>,
and as an associative array with the key being the first column: <a href="#getassoc1">GetAssoc</a>().</p>
<h3>Example 6: Connecting to 2 Databases At Once<a name="ex6"></a></h3>
<pre>&lt;?<br><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>$<font color="#663300">conn1</font> = &amp;ADONewConnection('mysql'); # create a mysql connection<br>$<font color="#663300">conn2</font> = &amp;ADONewConnection('oracle'); # create a oracle connection<br><br>$conn1-&gt;PConnect($server, $userid, $password, $database);<br>$conn2-&gt;PConnect(false, $ora_userid, $ora_pwd, $oraname);<br><br>$conn1-&gt;Execute('insert ...');<br>$conn2-&gt;Execute('update ...');<br>?&gt;</pre>
<p>
</p><h3>Example 7: Generating Update and Insert SQL<a name="ex7"></a></h3>
<p>Since ADOdb 4.56, we support <a href="reference.functions.getupdatesql.html#autoexecute">AutoExecute()</a>,
which simplifies things by providing an advanced wrapper for GetInsertSQL() and GetUpdateSQL(). For example,
an INSERT can be carried out with:
 
<pre>
$record["firstname"] = "Bob";
$record["lastname"] = "Smith";
$record["created"] = time();
$insertSQL = $conn->AutoExecute($rs, $record, 'INSERT');
</pre>
 
and an UPDATE with:
<pre>
$record["firstname"] = "Caroline";
$record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith
$insertSQL = $conn->AutoExecute($rs, $record, 'UPDATE', 'id = 1');
</pre>
<p>
The rest of this section is out-of-date:
<p>ADOdb 1.31 and later supports two new recordset functions: GetUpdateSQL( ) and
GetInsertSQL( ). This allow you to perform a "SELECT * FROM table query WHERE...",
make a copy of the $rs-&gt;fields, modify the fields, and then generate the SQL to
update or insert into the table automatically.
<p> We show how the functions can be used when accessing a table with the following
fields: (ID, FirstName, LastName, Created).
</p><p> Before these functions can be called, you need to initialize the recordset
by performing a select on the table. Idea and code by Jonathan Younger jyounger#unilab.com.
Since ADOdb 2.42, you can pass a table name instead of a recordset into
GetInsertSQL (in $rs), and it will generate an insert statement for that table.
</p><p>
</p><pre>&lt;?<br>#==============================================<br># SAMPLE GetUpdateSQL() and GetInsertSQL() code<br>#==============================================<br>include('adodb.inc.php');<br>include('tohtml.inc.php');<br><br>#==========================<br># This code tests an insert<br><br>$sql = "SELECT * FROM ADOXYZ WHERE id = -1"; <br># Select an empty record from the database<br><br>$conn = &amp;ADONewConnection("mysql"); # create a connection<br>$conn-&gt;debug=1;<br>$conn-&gt;PConnect("localhost", "admin", "", "test"); # connect to MySQL, testdb<br>$rs = $conn-&gt;Execute($sql); # Execute the query and get the empty recordset<br><br>$record = array(); # Initialize an array to hold the record data to insert<br><br># Set the values for the fields in the record<br># Note that field names are case-insensitive<br>$record["firstname"] = "Bob";<br>$record["lastNamE"] = "Smith";<br>$record["creaTed"] = time();<br><br># Pass the empty recordset and the array containing the data to insert<br># into the GetInsertSQL function. The function will process the data and return<br># a fully formatted insert sql statement.<br>$insertSQL = $conn-&gt;GetInsertSQL($rs, $record);<br><br>$conn-&gt;Execute($insertSQL); # Insert the record into the database<br><br>#==========================<br># This code tests an update<br><br>$sql = "SELECT * FROM ADOXYZ WHERE id = 1"; <br># Select a record to update<br><br>$rs = $conn-&gt;Execute($sql); # Execute the query and get the existing record to update<br><br>$record = array(); # Initialize an array to hold the record data to update<br><br># Set the values for the fields in the record<br># Note that field names are case-insensitive<br>$record["firstname"] = "Caroline";<br>$record["LasTnAme"] = "Smith"; # Update Caroline's lastname from Miranda to Smith<br><br># Pass the single record recordset and the array containing the data to update<br># into the GetUpdateSQL function. The function will process the data and return<br># a fully formatted update sql statement with the correct WHERE clause.<br># If the data has not changed, no recordset is returned<br>$updateSQL = $conn-&gt;GetUpdateSQL($rs, $record);<br><br>$conn-&gt;Execute($updateSQL); # Update the record in the database<br>$conn-&gt;Close();<br>?&gt;<br></pre>
<a name="ADODB_FORCE_TYPE"></a>
<b>$ADODB_FORCE_TYPE</b><p>
The behaviour of AutoExecute(), GetUpdateSQL() and GetInsertSQL()
when converting empty or null PHP variables to SQL is controlled by the
global $ADODB_FORCE_TYPE variable. Set it to one of the values below. Default
is ADODB_FORCE_VALUE (3):
</p><pre>0 = ignore empty fields. All empty fields in array are ignored.<br>1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values.<br>2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values.<br>3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and <br> empty fields '' are set to empty '' sql values.<br><br>define('ADODB_FORCE_IGNORE',0);<br>define('ADODB_FORCE_NULL',1);<br>define('ADODB_FORCE_EMPTY',2);<br>define('ADODB_FORCE_VALUE',3);<br></pre>
<p>
Thanks to Niko (nuko#mbnet.fi) for the $ADODB_FORCE_TYPE code.
</p><p>
Note: the constant ADODB_FORCE_NULLS is obsolete since 4.52 and is ignored. Set $ADODB_FORCE_TYPE = ADODB_FORCE_NULL
for equivalent behaviour.
<p>Since 4.62, the table name to be used can be overridden by setting $rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is called.
</p><h3>Example 8: Implementing Scrolling with Next and Previous<a name="ex8"></a></h3>
<p> The following code creates a very simple recordset pager, where you can scroll
from page to page of a recordset.</p>
<pre>include_once('../adodb.inc.php');<br>include_once('../adodb-pager.inc.php');<br>session_start();<br><br>$db = NewADOConnection('mysql');<br><br>$db-&gt;Connect('localhost','root','','xphplens');<br><br>$sql = "select * from adoxyz ";<br><br>$pager = new ADODB_Pager($db,$sql);<br>$pager-&gt;Render($rows_per_page=5);</pre>
<p>This will create a basic record pager that looks like this: <a name="scr"></a>
</p><p>
<table bgcolor="beige" border="1">
<tbody><tr>
<td> <a href="#scr"><code>|&lt;</code></a> &nbsp; <a href="#scr"><code>&lt;&lt;</code></a>
&nbsp; <a href="#scr"><code>&gt;&gt;</code></a> &nbsp; <a href="#scr"><code>&gt;|</code></a>
&nbsp; </td>
</tr>
<tr>
<td><table bgcolor="white" border="1" cols="4" width="100%">
<tbody><tr><th>ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Date Created</th>
</tr><tr>
<td align="right">36&nbsp;</td>
<td>Alan&nbsp;</td>
<td>Turing&nbsp;</td>
<td>Sat 06, Oct 2001&nbsp;</td>
</tr>
<tr>
<td align="right">37&nbsp;</td>
<td>Serena&nbsp;</td>
<td>Williams&nbsp;</td>
<td>Sat 06, Oct 2001&nbsp;</td>
</tr>
<tr>
<td align="right">38&nbsp;</td>
<td>Yat Sun&nbsp;</td>
<td>Sun&nbsp;</td>
<td>Sat 06, Oct 2001&nbsp;</td>
</tr>
<tr>
<td align="right">39&nbsp;</td>
<td>Wai Hun&nbsp;</td>
<td>See&nbsp;</td>
<td>Sat 06, Oct 2001&nbsp;</td>
</tr>
<tr>
<td align="right">40&nbsp;</td>
<td>Steven&nbsp;</td>
<td>Oey&nbsp;</td>
<td>Sat 06, Oct 2001&nbsp;</td>
</tr>
</tbody></table></td>
</tr>
<tr>
<td><font size="-1">Page 8/10</font></td>
</tr>
</tbody></table>
</p><p>The number of rows to display at one time is controled by the Render($rows)
method. If you do not pass any value to Render(), ADODB_Pager will default to
10 records per page.
</p><p>You can control the column titles by modifying your SQL (supported by most
databases):
</p><pre>$sql = 'select id as "ID", firstname as "First Name", <br> lastname as "Last Name", created as "Date Created" <br> from adoxyz';</pre>
<p>The above code can be found in the <i>adodb/tests/testpaging.php</i> example
included with this release, and the class ADODB_Pager in <i>adodb/adodb-pager.inc.php</i>.
The ADODB_Pager code can be adapted by a programmer so that the text links can
be replaced by images, and the dull white background be replaced with more interesting
colors.
</p><p>You can also allow display of html by setting $pager-&gt;htmlSpecialChars = false.
</p><p>Some of the code used here was contributed by Iv&aacute;n Oliva and Cornel
G. </p>
<h3><a name="ex9"></a>Example 9: Exporting in CSV or Tab-Delimited Format</h3>
<p>We provide some helper functions to export in comma-separated-value (CSV) and
tab-delimited formats:</p>
<pre><b>include_once('/path/to/adodb/toexport.inc.php');</b><br>include_once('/path/to/adodb/adodb.inc.php');<br>
$db = &amp;NewADOConnection('mysql');<br>$db-&gt;Connect($server, $userid, $password, $database);<br><br>$rs = $db-&gt;Execute('select fname as "First Name", surname as "Surname" from table');<br><br>print "&lt;pre&gt;";<br>print <b>rs2csv</b>($rs); # return a string, CSV format<p>print '&lt;hr&gt;';<br><br>$rs-&gt;MoveFirst(); # note, some databases do not support MoveFirst<br>print <b>rs2tab</b>($rs,<i>false</i>); # return a string, tab-delimited<br> # false == suppress field names in first line</p>print '&lt;hr&gt;';<br>$rs-&gt;MoveFirst();<br><b>rs2tabout</b>($rs); # send to stdout directly (there is also an rs2csvout function)<br>print "&lt;/pre&gt;";<br><br>$rs-&gt;MoveFirst();<br>$fp = fopen($path, "w");<br>if ($fp) {<br> <b>rs2csvfile</b>($rs, $fp); # write to file (there is also an rs2tabfile function)<br> fclose($fp);<br>}<br></pre>
<p> Carriage-returns or newlines are converted to spaces. Field names are returned
in the first line of text. Strings containing the delimiter character are quoted
with double-quotes. Double-quotes are double-quoted again. This conforms to
Excel import and export guide-lines.
</p><p>All the above functions take as an optional last parameter, $addtitles which
defaults to <i>true</i>. When set to <i>false</i> field names in the first line
are suppressed. <br>
</p><h3>Example 10: Recordset Filters<a name="ex10"></a></h3>
<p>Sometimes we want to pre-process all rows in a recordset before we use it.
For example, we want to ucwords all text in recordset.
</p><pre>include_once('adodb/rsfilter.inc.php');<br>include_once('adodb/adodb.inc.php');<br><br>// ucwords() every element in the recordset<br>function do_ucwords(&amp;$arr,$rs)<br>{<br> foreach($arr as $k =&gt; $v) {<br> $arr[$k] = ucwords($v);<br> }<br>}<br><br>$db = NewADOConnection('mysql');<br>$db-&gt;PConnect('server','user','pwd','db');<br><br>$rs = $db-&gt;Execute('select ... from table');<br>$rs = <b>RSFilter</b>($rs,'do_ucwords');<br></pre>
<p>The <i>RSFilter</i> function takes 2 parameters, the recordset, and the name
of the <i>filter</i> function. It returns the processed recordset scrolled to
the first record. The <i>filter</i> function takes two parameters, the current
row as an array, and the recordset object. For future compatibility, you should
not use the original recordset object. </p>
<h3>Example 11:<a name="ex11"></a> Smart Transactions</h3>
The old way of doing transactions required you to use
<pre>$conn-&gt;<b>BeginTrans</b>();<br>$ok = $conn-&gt;Execute($sql);<br>if ($ok) $ok = $conn-&gt;Execute($sql2);<br>if (!$ok) $conn-&gt;<b>RollbackTrans</b>();<br>else $conn-&gt;<b>CommitTrans</b>();<br></pre>
This is very complicated for large projects because you have to track the error
status. Smart Transactions is much simpler. You start a smart transaction by calling
StartTrans():
<pre>$conn-&gt;<b>StartTrans</b>();<br>$conn-&gt;Execute($sql);<br>$conn-&gt;Execute($Sql2);<br>$conn-&gt;<b>CompleteTrans</b>();<br></pre>
CompleteTrans() detects when an SQL error occurs, and will Rollback/Commit as
appropriate. To specificly force a rollback even if no error occured, use FailTrans().
Note that the rollback is done in CompleteTrans(), and not in FailTrans().
<pre>$conn-&gt;<b>StartTrans</b>();<br>$conn-&gt;Execute($sql);<br>if (!CheckRecords()) $conn-&gt;<strong>FailTrans</strong>();<br>$conn-&gt;Execute($Sql2);<br>$conn-&gt;<b>CompleteTrans</b>();<br></pre>
<p>You can also check if a transaction has failed, using HasFailedTrans(), which
returns true if FailTrans() was called, or there was an error in the SQL execution.
Make sure you call HasFailedTrans() before you call CompleteTrans(), as it is
only works between StartTrans/CompleteTrans.
</p><p>Lastly, StartTrans/CompleteTrans is nestable, and only the outermost block
is executed. In contrast, BeginTrans/CommitTrans/RollbackTrans is NOT nestable.
</p><pre>$conn-&gt;<strong>StartTrans</strong>();<br>$conn-&gt;Execute($sql);<br> $conn-&gt;<strong>StartTrans</strong>(); <font color="#006600"># ignored</font>
if (!CheckRecords()) $conn-&gt;FailTrans();
$conn-&gt;<strong>CompleteTrans</strong>(); <font color="#006600"># ignored</font>
$conn-&gt;Execute($Sql2);
$conn-&gt;<strong>CompleteTrans</strong>();<br></pre>
<p>Note: Savepoints are currently not supported.
</p><h2><a name="errorhandling"></a>Using Custom Error Handlers and PEAR_Error</h2>
<p>ADOdb supports PHP5 exceptions. Just include <i>adodb-exceptions.inc.php</i> and you can now
catch exceptions on errors as they occur.
</p><pre> <b>include("../adodb-exceptions.inc.php");</b> <br> include("../adodb.inc.php"); <br> try { <br> $db = NewADOConnection("oci8://scott:bad-password@mytns/"); <br> } catch (exception $e) { <br> var_dump($e); <br> adodb_backtrace($e-&gt;gettrace());<br> } <br></pre>
<p> ADOdb also provides two custom handlers which you can modify for your needs. The
first one is in the <b>adodb-errorhandler.inc.php</b> file. This makes use of
the standard PHP functions <a href="http://php.net/error_reporting">error_reporting</a>
to control what error messages types to display, and <a href="http://php.net/trigger_error">trigger_error</a>
which invokes the default PHP error handler.
</p><p> Including the above file will cause <i>trigger_error($errorstring,E_USER_ERROR)</i>
to be called when<br>
(a) Connect() or PConnect() fails, or <br>
(b) a function that executes SQL statements such as Execute() or SelectLimit()
has an error.<br>
(c) GenID() appears to go into an infinite loop.
</p><p> The $errorstring is generated by ADOdb and will contain useful debugging information
similar to the error.log data generated below. This file adodb-errorhandler.inc.php
should be included before you create any ADOConnection objects.
</p><p> If you define error_reporting(0), no errors will be passed to the error handler.
If you set error_reporting(E_ALL), all errors will be passed to the error handler.
You still need to use <b>ini_set("display_errors", "0" or "1")</b> to control
the display of errors.
</p><pre>&lt;?php<br><b>error_reporting(E_ALL); # pass any error messages triggered to error handler<br>include('adodb-errorhandler.inc.php');</b>
include('adodb.inc.php');
include('tohtml.inc.php');
$c = NewADOConnection('mysql');
$c-&gt;PConnect('localhost','root','','northwind');
$rs=$c-&gt;Execute('select * from productsz'); #invalid table productsz');
if ($rs) rs2html($rs);
?&gt;
</pre>
<p> If you want to log the error message, you can do so by defining the following
optional constants ADODB_ERROR_LOG_TYPE and ADODB_ERROR_LOG_DEST. ADODB_ERROR_LOG_TYPE
is the error log message type (see <a href="http://php.net/error_log">error_log</a>
in the PHP manual). In this case we set it to 3, which means log to the file
defined by the constant ADODB_ERROR_LOG_DEST.
</p><pre>&lt;?php<br><b>error_reporting(E_ALL); # report all errors<br>ini_set("display_errors", "0"); # but do not echo the errors<br>define('ADODB_ERROR_LOG_TYPE',3);<br>define('ADODB_ERROR_LOG_DEST','C:/errors.log');<br>include('adodb-errorhandler.inc.php');</b>
include('adodb.inc.php');
include('tohtml.inc.php');
 
$c = NewADOConnection('mysql');
$c-&gt;PConnect('localhost','root','','northwind');
$rs=$c-&gt;Execute('select * from productsz'); ## invalid table productsz
if ($rs) rs2html($rs);
?&gt;
</pre>
The following message will be logged in the error.log file:
<pre>(2001-10-28 14:20:38) mysql error: [1146: Table 'northwind.productsz' doesn't exist] in<br> EXECUTE("select * from productsz")<br></pre>
<h3>PEAR_ERROR</h3>
The second error handler is <b>adodb-errorpear.inc.php</b>. This will create a
PEAR_Error derived object whenever an error occurs. The last PEAR_Error object
created can be retrieved using ADODB_Pear_Error().
<pre>&lt;?php<br><b>include('adodb-errorpear.inc.php');</b>
include('adodb.inc.php');
include('tohtml.inc.php');
$c = NewADOConnection('mysql');
$c-&gt;PConnect('localhost','root','','northwind');
$rs=$c-&gt;Execute('select * from productsz'); #invalid table productsz');
if ($rs) rs2html($rs);
else {
<b>$e = ADODB_Pear_Error();<br> echo '&lt;p&gt;',$e-&gt;message,'&lt;/p&gt;';</b>
}
?&gt;
</pre>
<p> You can use a PEAR_Error derived class by defining the constant ADODB_PEAR_ERROR_CLASS
before the adodb-errorpear.inc.php file is included. For easy debugging, you
can set the default error handler in the beginning of the PHP script to PEAR_ERROR_DIE,
which will cause an error message to be printed, then halt script execution:
</p><pre>include('PEAR.php');<br>PEAR::setErrorHandling('PEAR_ERROR_DIE');<br></pre>
<p> Note that we do not explicitly return a PEAR_Error object to you when an error
occurs. We return false instead. You have to call ADODB_Pear_Error() to get
the last error or use the PEAR_ERROR_DIE technique.
</p>
<h3>MetaError and MetaErrMsg</h3>
<p>If you need error messages that work across multiple databases, then use <a href="#metaerror">MetaError()</a>, which returns a virtualized error number, based on PEAR DB's error number system, and <a href=<a href="#metaerrmsg">MetaErrMsg()</a>.
 
<h4>Error Messages</h4>
<p>Error messages are outputted using the static method ADOConnnection::outp($msg,$newline=true).
By default, it sends the messages to the client. You can override this to perform
error-logging.
</p><h2><a name="dsn"></a> Data Source Names</h2>
<p>We now support connecting using PEAR style DSN's. A DSN is a connection string
of the form:</p>
<p>$dsn = <i>"$driver://$username:$password@$hostname/$databasename"</i>;</p>
<p>An example:</p>
<pre> $username = 'root';<br> $password = '';<br> $hostname = 'localhost';<br> $databasename = 'xphplens';<br> $driver = 'mysql';<br> $dsn = "$driver://$username:$password@$hostname/$databasename"<br> $db = NewADOConnection(); <br> # DB::Connect($dsn) also works if you include 'adodb/adodb-pear.inc.php' at the top<br> $rs = $db-&gt;query('select firstname,lastname from adoxyz');<br> $cnt = 0;<br> while ($arr = $rs-&gt;fetchRow()) {<br> print_r($arr); print "&lt;br&gt;";<br> }</pre>
<p></p>
<p> <a href="#dsnsupport">More info and connection examples</a> on the DSN format.
 
</p><h2><a name="pear"></a>PEAR Compatibility</h2>
We support DSN's (see above), and the following functions:
<pre><b> DB_Common</b>
query - returns PEAR_Error on error
limitQuery - return PEAR_Error on error
prepare - does not return PEAR_Error on error
execute - does not return PEAR_Error on error
setFetchMode - supports ASSOC and ORDERED
errorNative
quote
nextID
disconnect
getOne
getAssoc
getRow
getCol
<b> DB_Result</b>
numRows - returns -1 if not supported
numCols
fetchInto - does not support passing of fetchmode
fetchRows - does not support passing of fetchmode
free
</pre>
<h2><a name="caching"></a>Caching of Recordsets</h2>
<p>ADOdb now supports caching of recordsets using the CacheExecute( ), CachePageExecute(
) and CacheSelectLimit( ) functions. There are similar to the non-cache functions,
except that they take a new first parameter, $secs2cache.
</p><p> An example:
</p><pre><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>$ADODB_CACHE_DIR = '/usr/ADODB_cache';<br>$<font color="#663300">conn</font> = &amp;ADONewConnection('mysql'); # create a connection<br>$<font color="#663300">conn</font>-&gt;PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br><font>$<font color="#663300">sql</font> = 'select CustomerName, CustomerID from customers';<br>$<font color="#663300">rs</font> = $<font color="#663300">conn</font>-&gt;CacheExecute(15,$sql);</font></pre>
<p><font> The first parameter is the number of seconds to cache
the query. Subsequent calls to that query will used the cached version stored
in $ADODB_CACHE_DIR. To force a query to execute and flush the cache, call CacheExecute()
with the first parameter set to zero. Alternatively, use the CacheFlush($sql)
call. </font></p>
<p><font>For the sake of security, we recommend you set <i>register_globals=off</i>
in php.ini if you are using $ADODB_CACHE_DIR.</font></p>
<p>In ADOdb 1.80 onwards, the secs2cache parameter is optional in CacheSelectLimit()
and CacheExecute(). If you leave it out, it will use the $connection-&gt;cacheSecs
parameter, which defaults to 60 minutes.
</p><pre> $conn-&gt;Connect(...);<br> $conn-&gt;cacheSecs = 3600*24; # cache 24 hours<br> $rs = $conn-&gt;CacheExecute('select * from table');<br></pre>
<p>Please note that magic_quotes_runtime should be turned off. <a href="http://phplens.com/lens/lensforum/msgs.php?LeNs#LensBM_forummsg">More
info</a>, and do not change $ADODB_FETCH_MODE (or SetFetchMode)
as the cached recordset will use the $ADODB_FETCH_MODE set when the query was executed. <font>
<h2><a name="pivot"></a>Pivot Tables</h2>
</font> </p><p><font>Since ADOdb 2.30, we support the generation of
SQL to create pivot tables, also known as cross-tabulations. For further explanation
read this DevShed <a href="http://www.devshed.com/Server_Side/MySQL/MySQLWiz/">Cross-Tabulation
tutorial</a>. We assume that your database supports the SQL case-when expression. </font></p>
<font>
<p>In this example, we will use the Northwind database from Microsoft. In the
database, we have a products table, and we want to analyze this table by <i>suppliers
versus product categories</i>. We will place the suppliers on each row, and
pivot on categories. So from the table on the left, we generate the pivot-table
on the right:</p>
</font>
<table align="center" border="0" cellpadding="2" cellspacing="2">
<tbody><tr>
<td>
<table align="center" border="1" cellpadding="2" cellspacing="2" width="142">
<tbody><tr>
<td><i>Supplier</i></td>
<td><i>Category</i></td>
</tr>
<tr>
<td>supplier1</td>
<td>category1</td>
</tr>
<tr>
<td>supplier2</td>
<td>category1</td>
</tr>
<tr>
<td>supplier2</td>
<td>category2</td>
</tr>
</tbody></table>
</td>
<td> <font face="Courier New, Courier, mono">--&gt;</font></td>
<td>
<table align="center" border="1" cellpadding="2" cellspacing="2">
<tbody><tr>
<td>&nbsp;</td>
<td><i>category1</i></td>
<td><i>category2</i></td>
<td><i>total</i></td>
</tr>
<tr>
<td><i>supplier1</i></td>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">1</td>
</tr>
<tr>
<td><i>supplier2</i></td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">2</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
<font>
</font><p><font>The following code will generate the SQL for a cross-tabulation:
</font></p><pre><font># Query the main "product" table<br># Set the rows to SupplierName<br># and the columns to the values of Categories<br># and define the joins to link to lookup tables <br># "categories" and "suppliers"<br>#<br> include "adodb/pivottable.inc.php";<br> $sql = PivotTableSQL(<br> $gDB, # adodb connection<br> 'products p ,categories c ,suppliers s', # tables<br> 'SupplierName', # rows (multiple fields allowed)<br> 'CategoryName', # column to pivot on <br> 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where<br>);<br></font></pre>
<p><font> This will generate the following SQL:</font></p>
<p><code><font size="2">SELECT SupplierName, <br>
SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
<br>
SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
<br>
SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
<br>
SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy
Products", <br>
SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals",
<br>
SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry",
<br>
SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
<br>
SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
<br>
SUM(1) as Total <br>
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID
and s.SupplierID= p.SupplierID <br>
GROUP BY SupplierName</font></code></p>
<p> You can also pivot on <i>numerical columns</i> and <i>generate totals</i>
by using ranges. <font>This code was revised in ADODB 2.41
and is not backward compatible.</font> The second example shows this:</p>
<pre> $sql = PivotTableSQL(<br> $gDB, # adodb connection<br> 'products p ,categories c ,suppliers s', # tables<br> 'SupplierName', #<font> rows (multiple fields allowed)</font>
array( # column ranges
' 0 ' =&gt; 'UnitsInStock &lt;= 0',
"1 to 5" =&gt; '0 &lt; UnitsInStock and UnitsInStock &lt;= 5',
"6 to 10" =&gt; '5 &lt; UnitsInStock and UnitsInStock &lt;= 10',
"11 to 15" =&gt; '10 &lt; UnitsInStock and UnitsInStock &lt;= 15',
"16+" =&gt; '15 &lt; UnitsInStock'
),
' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
'UnitsInStock', # sum this field
'Sum ' # sum label prefix
);
</pre>
<p>Which generates: </p>
<p> <code> <font size="2">SELECT SupplierName, <br>
SUM(CASE WHEN UnitsInStock &lt;= 0 THEN UnitsInStock ELSE 0 END) AS "Sum
0 ", <br>
SUM(CASE WHEN 0 &lt; UnitsInStock and UnitsInStock &lt;= 5 THEN UnitsInStock
ELSE 0 END) AS "Sum 1 to 5",<br>
SUM(CASE WHEN 5 &lt; UnitsInStock and UnitsInStock &lt;= 10 THEN UnitsInStock
ELSE 0 END) AS "Sum 6 to 10",<br>
SUM(CASE WHEN 10 &lt; UnitsInStock and UnitsInStock &lt;= 15 THEN UnitsInStock
ELSE 0 END) AS "Sum 11 to 15", <br>
SUM(CASE WHEN 15 &lt; UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum
16+", <br>
SUM(UnitsInStock) AS "Sum UnitsInStock", <br>
SUM(1) as Total,<br>
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID
and s.SupplierID= p.SupplierID <br>
GROUP BY SupplierName</font></code><font size="2"><br>
</font> </p>
<font><hr />
<h1>Class Reference<a name="ref"></a></h1>
<p>Function parameters with [ ] around them are optional.</p>
</font>
<h2>Global Variables</h2>
<h3><font><a name="adodb_countrecs"></a></font>$ADODB_COUNTRECS</h3>
<p>If the database driver API does not support counting the number of records
returned in a SELECT statement, the function RecordCount() is emulated when
the global variable $ADODB_COUNTRECS is set to true, which is the default.
We emulate this by buffering the records, which can take up large amounts
of memory for big recordsets. Set this variable to false for the best performance.
This variable is checked every time a query is executed, so you can selectively
choose which recordsets to count.</p>
<h3><font><a name="adodb_cache_dir"></a>$ADODB_CACHE_DIR</font></h3>
<font>
<p>If you are using recordset caching, this is the directory to save your recordsets
in. Define this before you call any caching functions such as CacheExecute(
). We recommend setting <i>register_globals=off</i> in php.ini if you use this
feature for security reasons.</p>
<p>If you are using Unix and apache, you might need to set your cache directory
permissions to something similar to the following:</p>
</font>
<p>chown -R apache /path/to/adodb/cache<br>
chgrp -R apache /path/to/adodb/cache </p>
<h3><font><a name="adodb_ansi_padding_off"></a>$ADODB_ANSI_PADDING_OFF</font></h3>
<p><font>Determines whether to right trim CHAR fields (and also VARCHAR for ibase/firebird).
Set to true to trim. Default is false. Currently works for oci8po, ibase and firebird
drivers. Added in ADOdb 4.01.
</font></p><h3><font><a name="adodb_lang"></a>$ADODB_LANG</font></h3>
<p><font>Determines the language used in MetaErrorMsg(). The default is 'en', for English.
To find out what languages are supported, see the files
in adodb/lang/adodb-$lang.inc.php, where $lang is the supported langauge.
</font></p><h3><font><a name="adodb_fetch_mode"></a>$ADODB_FETCH_MODE</font></h3>
<p><font>This is a global variable that determines how arrays are retrieved by recordsets.
The recordset saves this value on creation (eg. in Execute( ) or SelectLimit(
)), and any subsequent changes to $ADODB_FETCH_MODE have no affect on existing
recordsets, only on recordsets created in the future.</font></p>
<p><font>The following constants are defined:</font></p>
<p><font>define('ADODB_FETCH_DEFAULT',0);<br>
define('ADODB_FETCH_NUM',1);<br>
define('ADODB_FETCH_ASSOC',2);<br>
define('ADODB_FETCH_BOTH',3); </font></p>
<font>
</font><p><font> An example:
</font></p><pre><font> $ADODB_<b>FETCH_MODE</b> = ADODB_FETCH_NUM;<br> $rs1 = $db-&gt;Execute('select * from table');<br> $ADODB_<b>FETCH_MODE</b> = ADODB_FETCH_ASSOC;<br> $rs2 = $db-&gt;Execute('select * from table');<br> print_r($rs1-&gt;fields); # shows <i>array([0]=&gt;'v0',[1] =&gt;'v1')</i>
print_r($rs2-&gt;fields); # shows <i>array(['col1']=&gt;'v0',['col2'] =&gt;'v1')</i>
</font></pre>
<p><font> As you can see in the above example, both recordsets store and use different
fetch modes based on the $ADODB_FETCH_MODE setting when the recordset was
created by Execute().</font></p>
<p><font>If no fetch mode is predefined, the fetch mode defaults to ADODB_FETCH_DEFAULT.
The behaviour of this default mode varies from driver to driver, so do not
rely on ADODB_FETCH_DEFAULT. For portability, we recommend sticking to ADODB_FETCH_NUM
or ADODB_FETCH_ASSOC. Many drivers do not support ADODB_FETCH_BOTH.</font></p>
<p><font><strong>SetFetchMode Function</strong></font></p>
<p><font>If you have multiple connection objects, and want to have different fetch modes for each
connection, then use <a href="#setfetchmode">SetFetchMode</a>.
Once this function is called for a connection object, that connection object
will ignore the global variable $ADODB_FETCH_MODE and will use the internal
fetchMode property exclusively.</font></p>
<pre><font> $db-&gt;SetFetchMode(ADODB_FETCH_NUM);<br> $rs1 = $db-&gt;Execute('select * from table');<br> $db-&gt;SetFetchMode(ADODB_FETCH_ASSOC);<br> $rs2 = $db-&gt;Execute('select * from table');<br> print_r($rs1-&gt;fields); # shows <i>array([0]=&gt;'v0',[1] =&gt;'v1')</i>
print_r($rs2-&gt;fields); # shows <i>array(['col1']=&gt;'v0',['col2'] =&gt;'v1')</i></font></pre>
<p><font>To retrieve the previous fetch mode, you can use check the $db-&gt;fetchMode
property, or use the return value of SetFetchMode( ).
</font></p><p><font><strong><a name="adodb_assoc_case"></a>ADODB_ASSOC_CASE</strong></font></p>
<p><font>You can control the associative fetch case for certain drivers which behave
differently. For the sybase, oci8po, mssql, odbc and ibase drivers and all
drivers derived from them, ADODB_ASSOC_CASE will by default generate recordsets
where the field name keys are lower-cased. Use the constant ADODB_ASSOC_CASE
to change the case of the keys. There are 3 possible values:</font></p>
<p><font>0 = assoc lowercase field names. $rs-&gt;fields['orderid']<br>
1 = assoc uppercase field names. $rs-&gt;fields['ORDERID']<br>
2 = use native-case field names. $rs-&gt;fields['OrderID'] -- this is the
default since ADOdb 2.90</font></p>
<p><font>To use it, declare it before you incldue adodb.inc.php.</font></p>
<p><font>define('ADODB_ASSOC_CASE', 2); # use native-case for ADODB_FETCH_ASSOC<br>
include('adodb.inc.php'); </font></p>
<h3><font><a name="force_type"></a>$ADODB_FORCE_TYPE</font></h3>
<p><font>See the <a href="#ADODB_FORCE_TYPE">GetUpdateSQL tutorial</a>.
</font></p><hr />
<h2><font>ADOConnection<a name="adoconnection"></a></font></h2>
<p><font>Object that performs the connection to the database, executes SQL statements
and has a set of utility functions for standardising the format of SQL statements
for issues such as concatenation and date formats.</font></p>
<h3><font>ADOConnection Fields</font></h3>
<p><font><b>databaseType</b>: Name of the database system we are connecting to. Eg.
<b>odbc</b> or <b>mssql</b> or <b>mysql</b>.</font></p>
<p><font><b>dataProvider</b>: The underlying mechanism used to connect to the database.
Normally set to <b>native</b>, unless using <b>odbc</b> or <b>ado</b>.</font></p>
<p><font><b>host: </b>Name of server or data source name (DSN) to connect to.</font></p>
<p><font><b>database</b>: Name of the database or to connect to. If ado is used, it
will hold the ado data provider.</font></p>
<p><font><b>user</b>: Login id to connect to database. Password is not saved for security
reasons.</font></p>
<p><font><b>raiseErrorFn</b>: Allows you to define an error handling function. See adodb-errorhandler.inc.php
for an example.</font></p>
<p><font><b>debug</b>: Set to <i>true</i> to make debug statements to appear.</font></p>
<p><font><b>concat_operator</b>: Set to '+' or '||' normally. The operator used to concatenate
strings in SQL. Used by the <b><a href="#concat">Concat</a></b> function.</font></p>
<p><font><b>fmtDate</b>: The format used by the <b><a href="#dbdate">DBDate</a></b>
function to send dates to the database. is '#Y-m-d#' for Microsoft Access,
and ''Y-m-d'' for MySQL.</font></p>
<p><font><b>fmtTimeStamp: </b>The format used by the <b><a href="#dbtimestamp">DBTimeStamp</a></b>
function to send timestamps to the database. </font></p>
<p><font><b>true</b>: The value used to represent true.Eg. '.T.'. for Foxpro, '1' for
Microsoft SQL.</font></p>
<p><font><b>false: </b> The value used to represent false. Eg. '.F.'. for Foxpro, '0'
for Microsoft SQL.</font></p>
<p><font><b>replaceQuote</b>: The string used to escape quotes. Eg. double single-quotes
for Microsoft SQL, and backslash-quote for MySQL. Used by <a href="#qstr">qstr</a>.</font></p>
<p><font><b>autoCommit</b>: indicates whether automatic commit is enabled. Default is
true.</font></p>
<p><font><b>charSet</b>: set the default charset to use. Currently only interbase/firebird supports
this.</font></p>
<p><font><b>dialect</b>: set the default sql dialect to use. Currently only interbase/firebird
supports this.</font></p>
<p><font><b>role</b>: set the role. Currently only interbase/firebird
supports this.</font></p>
<p><font><b>metaTablesSQL</b>: SQL statement to return a list of available tables. Eg.
<i>SHOW TABLES</i> in MySQL.</font></p>
<p><font><b>genID</b>: The latest id generated by GenID() if supported by the database.</font></p>
<p><font><b>cacheSecs</b>: The number of seconds to cache recordsets if CacheExecute()
or CacheSelectLimit() omit the $secs2cache parameter. Defaults to 60 minutes.</font></p>
<p><font><b>sysDate</b>: String that holds the name of the database function to call
to get the current date. Useful for inserts and updates.</font></p>
<p><font><b>sysTimeStamp</b>: String that holds the name of the database function to
call to get the current timestamp/datetime value.</font></p>
<p><font><b>leftOuter</b>: String that holds operator for left outer join, if known.
Otherwise set to false.</font></p>
<p><font><b>rightOuter</b>: String that holds operator for left outer join, if known.
Otherwise set to false.</font></p>
<p><font><b>ansiOuter</b>: Boolean that if true indicates that ANSI style outer joins
are permitted. Eg. <i>select * from table1 left join table2 on p1=p2.</i></font></p>
<p><font><b>connectSID</b>: Boolean that indicates whether to treat the $database parameter
in connects as the SID for the oci8 driver. Defaults to false. Useful for
Oracle 8.0.5 and earlier.</font></p>
<p><font><b>autoRollback</b>: Persistent connections are auto-rollbacked in PConnect(
) if this is set to true. Default is false.</font></p>
<hr />
<h3><font>ADOConnection Main Functions</font></h3>
<p><font><b>ADOConnection( )</b></font></p>
<p><font>Constructor function. Do not call this directly. Use ADONewConnection( ) instead.</font></p>
<p><font><b>Connect<a name="connect"></a>($host,[$user],[$password],[$database])</b></font></p>
<p><font>Non-persistent connect to data source or server $<b>host</b>, using userid
$<b>user </b>and password $<b>password</b>. If the server supports multiple
databases, connect to database $<b>database</b>. </font></p>
<p><font>Returns true/false depending on connection success. Since 4.23, null is returned if the extension is not loaded.</font></p>
<p><font>ADO Note: If you are using a Microsoft ADO and not OLEDB, you can set the $database
parameter to the OLEDB data provider you are using.</font></p>
<p><font>PostgreSQL: An alternative way of connecting to the database is to pass the
standard PostgreSQL connection string in the first parameter $host, and the
other parameters will be ignored.</font></p>
<p><font>For Oracle and Oci8, there are two ways to connect. First is to use the TNS
name defined in your local tnsnames.ora (or ONAMES or HOSTNAMES). Place the
name in the $database field, and set the $host field to false. Alternatively,
set $host to the server, and $database to the database SID, this bypassed
tnsnames.ora.
</font></p><p><font>Examples:
</font></p><pre><font> # $oraname in tnsnames.ora/ONAMES/HOSTNAMES<br> $conn-&gt;Connect(false, 'scott', 'tiger', $oraname); <br> $conn-&gt;Connect('server:1521', 'scott', 'tiger', 'ServiceName'); # bypass tnsnames.ora</font></pre>
<p><font>There are many examples of connecting to a database.
See <a href="#connect_ex">Connection Examples</a> for many examples.
 
</font></p><p><font><b>PConnect<a name="pconnect"></a>($host,[$user],[$password],[$database])</b></font></p>
<p><font>Persistent connect to data source or server $<b>host</b>, using userid $<b>user</b>
and password $<b>password</b>. If the server supports multiple databases,
connect to database $<b>database</b>.</font></p>
<p><font>We now perform a rollback on persistent connection for selected databases since
2.21, as advised in the PHP manual. See change log or source code for which
databases are affected.
</font></p><p><font>Returns true/false depending on connection. Since 4.23, null is returned if the extension is not loaded.
See Connect( ) above for more info.</font></p>
<p><font>Since ADOdb 2.21, we also support autoRollback. If you set:</font></p>
<pre> $conn = &amp;NewADOConnection('mysql');<br> $conn-&gt;autoRollback = true; # default is false<br> $conn-&gt;PConnect(...); # rollback here</pre>
<p> Then when doing a persistent connection with PConnect( ), ADOdb will
perform a rollback first. This is because it is documented that PHP is
not guaranteed to rollback existing failed transactions when
persistent connections are used. This is implemented in Oracle,
MySQL, PgSQL, MSSQL, ODBC currently.
</p><p>Since ADOdb 3.11, you can force non-persistent
connections even if PConnect is called by defining the constant
ADODB_NEVER_PERSIST before you call PConnect.
</p><p>
Since 4.23, null is returned if the extension is not loaded.
</p><p><b>NConnect<a name="nconnect"></a>($host,[$user],[$password],[$database])</b></p>
<p>Always force a new connection. In contrast, PHP sometimes reuses connections
when you use Connect() or PConnect(). Currently works only on mysql (PHP 4.3.0
or later), postgresql and oci8-derived drivers. For other drivers, NConnect() works like
Connect().</p>
<p><font><b>IsConnected( )<a name="isconnected"></a></b></font></p>
<p>
<font>Returns true if connected to database. Added in 4.53.
 
</font></p><p><font><b>Execute<a name="execute"></a>($sql,$inputarr=false)</b></font></p>
<p><font>Execute SQL statement $<b>sql</b> and return derived class of ADORecordSet
if successful. Note that a record set is always returned on success, even
if we are executing an insert or update statement. You can also pass in $sql a statement prepared
in <a href="#prepare">Prepare()</a>.</font></p>
<p><font>Returns derived class of ADORecordSet. Eg. if connecting via mysql, then ADORecordSet_mysql
would be returned. False is returned if there was an error in executing the
sql.</font></p>
<p><font>The $inputarr parameter can be used for binding variables to parameters. Below
is an Oracle example:</font></p>
<pre><font> $conn-&gt;Execute("SELECT * FROM TABLE WHERE COND=:val", array('val'=&gt; $val));<br> </font></pre>
<p><font>Another example, using ODBC,which uses the ? convention:</font></p>
<pre><font> $conn-&gt;Execute("SELECT * FROM TABLE WHERE COND=?", array($val));<br></font></pre>
<font><a name="binding"></a>
<i>Binding variables</i></font><p>
<font>Variable binding speeds the compilation and caching of SQL statements, leading
to higher performance. Currently Oracle, Interbase and ODBC supports variable binding.
Interbase/ODBC style ? binding is emulated in databases that do not support binding.
Note that you do not have to quote strings if you use binding.
</font></p><p><font> Variable binding in the odbc, interbase and oci8po drivers.
</font></p><pre><font>$rs = $db-&gt;Execute('select * from table where val=?', array('10'));<br></font></pre>
<font>Variable binding in the oci8 driver:
</font><pre><font>$rs = $db-&gt;Execute('select name from table where val=:key', <br> array('key' =&gt; 10));<br></font></pre>
<font><a name="bulkbind"></a>
<i>Bulk binding</i>
</font><p><font>Since ADOdb 3.80, we support bulk binding in Execute(), in which you pass in a 2-dimensional array to
be bound to an INSERT/UPDATE or DELETE statement.
</font></p><pre><font>$arr = array(<br> array('Ahmad',32),<br> array('Zulkifli', 24),<br> array('Rosnah', 21)<br> );<br>$ok = $db-&gt;Execute('insert into table (name,age) values (?,?)',$arr);<br></font></pre>
<p><font>This provides very high performance as the SQL statement is prepared first.
The prepared statement is executed repeatedly for each array row until all rows are completed,
or until the first error. Very useful for importing data.
 
</font></p><p><font><b>CacheExecute<a name="cacheexecute"></a>([$secs2cache,]$sql,$inputarr=false)</b></font></p>
<p><font>Similar to Execute, except that the recordset is cached for $secs2cache seconds
in the $ADODB_CACHE_DIR directory, and $inputarr only accepts 1-dimensional arrays.
If CacheExecute() is called again with the same $sql, $inputarr,
and also the same database, same userid, and the cached recordset
has not expired, the cached recordset is returned.
</font></p><pre><font> include('adodb.inc.php'); <br> include('tohtml.inc.php');<br> $ADODB_<b>CACHE_DIR</b> = '/usr/local/ADOdbcache';<br> $conn = &amp;ADONewConnection('mysql'); <br> $conn-&gt;PConnect('localhost','userid','password','database');<br> $rs = $conn-&gt;<b>CacheExecute</b>(15, 'select * from table'); # cache 15 secs<br> rs2html($rs); /* recordset to html table */ <br></font></pre>
<p><font> Alternatively, since ADOdb 1.80, the $secs2cache parameter is optional:</font></p>
<pre><font> $conn-&gt;Connect(...);<br> $conn-&gt;cacheSecs = 3600*24; // cache 24 hours<br> $rs = $conn-&gt;CacheExecute('select * from table');<br></font></pre>
<font>If $secs2cache is omitted, we use the value
in $connection-&gt;cacheSecs (default is 3600 seconds, or 1 hour). Use CacheExecute()
only with SELECT statements.
</font><p><font>Performance note: I have done some benchmarks and found that they vary so greatly
that it's better to talk about when caching is of benefit. When your database
server is <i>much slower </i>than your Web server or the database is <i>very
overloaded </i>then ADOdb's caching is good because it reduces the load on
your database server. If your database server is lightly loaded or much faster
than your Web server, then caching could actually reduce performance. </font></p>
<p><font><b>ExecuteCursor<a name="executecursor"></a>($sql,$cursorName='rs',$parameters=false)</b></font></p>
<p><font>Execute an Oracle stored procedure, and returns an Oracle REF cursor variable as
a regular ADOdb recordset. Does not work with any other database except oci8.
Thanks to Robert Tuttle for the design.
</font></p><pre><font> $db = ADONewConnection("oci8"); <br> $db-&gt;Connect("foo.com:1521", "uid", "pwd", "FOO"); <br> $rs = $db-&gt;ExecuteCursor("begin :cursorvar := getdata(:param1); end;", <br> 'cursorvar',<br> array('param1'=&gt;10)); <br> # $rs is now just like any other ADOdb recordset object<br> rs2html($rs);</font></pre>
<p><font>ExecuteCursor() is a helper function that does the following internally:
</font></p><pre><font> $stmt = $db-&gt;Prepare("begin :cursorvar := getdata(:param1); end;", true); <br> $db-&gt;Parameter($stmt, $cur, 'cursorvar', false, -1, OCI_B_CURSOR);<br> $rs = $db-&gt;Execute($stmt,$bindarr);<br></font></pre>
<p><font>ExecuteCursor only accepts 1 out parameter. So if you have 2 out parameters, use:
</font></p><pre><font> $vv = 'A%';<br> $stmt = $db-&gt;PrepareSP("BEGIN list_tabs(:crsr,:tt); END;");<br> $db-&gt;OutParameter($stmt, $cur, 'crsr', -1, OCI_B_CURSOR);<br> $db-&gt;OutParameter($stmt, $vv, 'tt', 32); # return varchar(32)<br> $arr = $db-&gt;GetArray($stmt);<br> print_r($arr);<br> echo " val = $vv"; ## outputs 'TEST'<br></font></pre>
<font>for the following PL/SQL:
</font><pre><font> TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;<br><br> PROCEDURE list_tabs(tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS<br> BEGIN<br> OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;<br> tablenames := 'TEST';<br> END list_tabs;<br></font></pre>
<p><font><b>SelectLimit<a name="selectlimit"></a>($sql,$numrows=-1,$offset=-1,$inputarr=false)</b></font></p>
<p><font>Returns a recordset if successful. Returns false otherwise. Performs a select
statement, simulating PostgreSQL's SELECT statement, LIMIT $numrows OFFSET
$offset clause.</font></p>
<p><font>In PostgreSQL, SELECT * FROM TABLE LIMIT 3 will return the first 3 records
only. The equivalent is <code>$connection-&gt;SelectLimit('SELECT * FROM TABLE',3)</code>.
This functionality is simulated for databases that do not possess this feature.</font></p>
<p><font>And SELECT * FROM TABLE LIMIT 3 OFFSET 2 will return records 3, 4 and 5 (eg.
after record 2, return 3 rows). The equivalent in ADOdb is <code>$connection-&gt;SelectLimit('SELECT
* FROM TABLE',3,2)</code>.</font></p>
<p><font>Note that this is the <i>opposite</i> of MySQL's LIMIT clause. You can also
set <code>$connection-&gt;SelectLimit('SELECT * FROM TABLE',-1,10)</code> to
get rows 11 to the last row.</font></p>
<p><font>The last parameter $inputarr is for databases that support variable binding
such as Oracle oci8. This substantially reduces SQL compilation overhead.
Below is an Oracle example:</font></p>
<pre><font> $conn-&gt;SelectLimit("SELECT * FROM TABLE WHERE COND=:val", 100,-1,array('val'=&gt; $val));<br> </font></pre>
<p><font>The oci8po driver (oracle portable driver) uses the more standard bind variable
of ?:
</font></p><pre><font> $conn-&gt;SelectLimit("SELECT * FROM TABLE WHERE COND=?", 100,-1,array('val'=&gt; $val));<br></font></pre>
<p><font>
</font></p><p><font>Ron Wilson reports that SelectLimit does not work with UNIONs.
</font></p><p><font><b>CacheSelectLimit<a name="cacheselectlimit"></a>([$secs2cache,] $sql, $numrows=-1,$offset=-1,$inputarr=false)</b></font></p>
<p><font>Similar to SelectLimit, except that the recordset returned is cached for $secs2cache
seconds in the $ADODB_CACHE_DIR directory. </font></p>
<p><font>Since 1.80, $secs2cache has been optional, and you can define the caching time
in $connection-&gt;cacheSecs.</font></p>
<pre><font> $conn-&gt;Connect(...);<br> $conn-&gt;cacheSecs = 3600*24; // cache 24 hours<br> $rs = $conn-&gt;CacheSelectLimit('select * from table',10);</font></pre>
<font>
</font><p><font><b>CacheFlush<a name="cacheflush"></a>($sql=false,$inputarr=false)</b></font></p>
<p><font>Flush (delete) any cached recordsets for the SQL statement $sql in $ADODB_CACHE_DIR.
</font></p><p><font>If no parameter is passed in, then all adodb_*.cache files are deleted.
</font></p><p><font> If you want to flush all cached recordsets manually, execute the following
PHP code (works only under Unix): <br>
<code> &nbsp; system("rm -f `find ".$ADODB_CACHE_DIR." -name
adodb_*.cache`");</code></font></p>
<p><font>For general cleanup of all expired files, you should use <a href="http://www.superscripts.com/tutorial/crontab.html">crontab</a>
on Unix, or at.exe on Windows, and a shell script similar to the following:<font face="Courier New, Courier, mono"><br>
#------------------------------------------------------ <br>
# This particular example deletes files in the TMPPATH <br>
# directory with the string ".cache" in their name that <br>
# are more than 7 days old. <br>
#------------------------------------------------------ <br>
AGED=7 <br>
find ${TMPPATH} -mtime +$AGED | grep "\.cache" | xargs rm -f <br>
</font> </font></p>
<p><font><b>MetaError<a name="metaerror"></a>($errno=false)</b></font></p>
<p><font>Returns a virtualized error number, based on PEAR DB's error number system. You might
need to include adodb-error.inc.php before you call this function. The parameter $errno
is the native error number you want to convert. If you do not pass any parameter, MetaError
will call ErrorNo() for you and convert it. If the error number cannot be virtualized, MetaError
will return -1 (DB_ERROR).</font></p>
 
<p><font><b>MetaErrorMsg<a name="metaerrormsg"></a>($errno)</b></font></p>
<p><font>Pass the error number returned by MetaError() for the equivalent textual error message.</font></p>
<p><font><b>ErrorMsg<a name="errormsg"></a>()</b></font></p>
<p><font>Returns the last status or error message. The error message is reset after every
call to Execute().
</font></p><p>
<font>This can return a string even if
no error occurs. In general you do not need to call this function unless an
ADOdb function returns false on an error. </font></p>
<p><font>Note: If <b>debug</b> is enabled, the SQL error message is always displayed
when the <b>Execute</b> function is called.</font></p>
<p><font><b>ErrorNo<a name="errorno"></a>()</b></font></p>
<p><font>Returns the last error number. The error number is reset after every call to Execute().
If 0 is returned, no error occurred.
</font></p><p>
<font>Note that old versions of PHP (pre 4.0.6) do
not support error number for ODBC. In general you do not need to call this
function unless an ADOdb function returns false on an error.</font></p>
 
<p><font><b>SetFetchMode<a name="setfetchmode"></a>($mode)</b></font></p>
<p><font>Sets the current fetch mode for the connection and stores
it in $db-&gt;fetchMode. Legal modes are ADODB_FETCH_ASSOC and ADODB_FETCH_NUM.
For more info, see <a href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a>.</font></p>
<p><font>Returns the previous fetch mode, which could be false
if SetFetchMode( ) has not been called before.</font></p>
<font>
</font><p><font><b>CreateSequence<a name="createseq"></a>($seqName = 'adodbseq',$startID=1)</b></font></p>
<p><font>Create a sequence. The next time GenID( ) is called, the value returned will
be $startID. Added in 2.60.
</font></p><p><font><b>DropSequence<a name="dropseq"></a>($seqName = 'adodbseq')</b></font></p>
<p><font>Delete a sequence. Added in 2.60.
</font></p><p><font><b>GenID<a name="genid"></a>($seqName = 'adodbseq',$startID=1)</b></font></p>
<p><font>Generate a sequence number . Works for interbase,
mysql, postgresql, oci8, oci8po, mssql, ODBC based (access,vfp,db2,etc) drivers
currently. Uses $seqName as the name of the sequence. GenID() will automatically
create the sequence for you if it does not exist (provided the userid has
permission to do so). Otherwise you will have to create the sequence yourself.
</font></p><p><font> If your database driver emulates sequences, the name of the table is the sequence
name. The table has one column, "id" which should be of type integer, or if
you need something larger - numeric(16).
</font></p><p><font> For ODBC and databases that do not support sequences natively (eg mssql, mysql),
we create a table for each sequence. If the sequence has not been defined
earlier, it is created with the starting value set in $startID.</font></p>
<p><font>Note that the mssql driver's GenID() before 1.90 used to generate 16 byte GUID's.</font></p>
<p><font><b>UpdateBlob<a name="updateblob"></a>($table,$column,$val,$where)</b></font></p>
<font>Allows you to store a blob (in $val) into $table into $column in a row at $where.
</font><p><font> Usage:
</font></p><p><font>
</font></p><pre><font> # for oracle<br> $conn-&gt;Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, empty_blob())');<br> $conn-&gt;UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');<br> <br> # non oracle databases<br> $conn-&gt;Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');<br> $conn-&gt;UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');<br></font></pre>
<p><font> Returns true if succesful, false otherwise. Supported by MySQL, PostgreSQL,
Oci8, Oci8po and Interbase drivers. Other drivers might work, depending on
the state of development.</font></p>
<p><font>Note that when an Interbase blob is retrieved using SELECT, it still needs
to be decoded using $connection-&gt;DecodeBlob($blob); to derive the original
value in versions of PHP before 4.1.0.
</font></p><p><font>For PostgreSQL, you can store your blob using blob oid's or as a bytea field.
You can use bytea fields but not blob oid's currently with UpdateBlob( ).
Conversely UpdateBlobFile( ) supports oid's, but not bytea data.<br>
<br>
If you do not pass in an oid, then UpdateBlob() assumes that you are storing
in bytea fields.
<p>If you do not have any blob fields, you can improve you can improve general SQL query performance by disabling blob handling with $connection->disableBlobs = true.
</font></p><p><font><b>UpdateClob<a name="updateclob"></a>($table,$column,$val,$where)</b></font></p>
<font>Allows you to store a clob (in $val) into $table into $column in a row at $where.
Similar to UpdateBlob (see above), but for Character Large OBjects.
</font><p><font> Usage:
</font></p><pre><font> # for oracle<br> $conn-&gt;Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, empty_clob())');<br> $conn-&gt;UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');<br> <br> # non oracle databases<br> $conn-&gt;Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)');<br> $conn-&gt;UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');<br></font></pre>
<p><font><b>UpdateBlobFile<a name="updateblobfile"></a>($table,$column,$path,$where,$blobtype='BLOB')</b></font></p>
<p><font>Similar to UpdateBlob, except that we pass in a file path to where the blob
resides.
</font></p><p><font>For PostgreSQL, if you are using blob oid's, use this interface. This interface
does not support bytea fields.
</font></p><p><font>Returns true if successful, false otherwise.
</font></p><p><font><b>BlobEncode<a name="blobencode" id="blobencode"></a>($blob)</b>
</font></p><p><font>Some databases require blob's to be encoded manually before upload. Note if
you use UpdateBlob( ) or UpdateBlobFile( ) the conversion is done automatically
for you and you do not have to call this function. For PostgreSQL, currently,
BlobEncode() can only be used for bytea fields.
</font></p><p><font>Returns the encoded blob value.
</font></p><p><font>Note that there is a connection property called <em>blobEncodeType</em> which
has 3 legal values:
</font></p><p><font>false - no need to perform encoding or decoding.<br>
'I' - blob encoding required, and returned encoded blob is a numeric value
(no need to quote).<br>
'C' - blob encoding required, and returned encoded blob is a character value
(requires quoting).
</font></p><p><font>This is purely for documentation purposes, so that programs that accept multiple
database drivers know what is the right thing to do when processing blobs.
</font></p><p><font><strong>BlobDecode<a name="blobdecode"></a>($blob, $maxblobsize = false)</strong>
</font></p><p><font>Some databases require blob's to be decoded manually after doing a select statement.
If the database does not require decoding, then this function will return
the blob unchanged. Currently BlobDecode is only required for one database,
PostgreSQL, and only if you are using blob oid's (if you are using bytea fields,
we auto-decode for you).</font> The default maxblobsize is set in $connection-&gt;maxblobsize, which
is set to 256K in adodb 4.54. </p><p>
In ADOdb 4.54 and later, the blob is the return value. In earlier versions, the blob data is sent to stdout.</p><font>
</font><p></p><pre><font>$rs = $db-&gt;Execute("select bloboid from postgres_table where id=$key");<br>$blob = $db-&gt;BlobDecode( reset($rs-&gt;fields) );</font></pre>
<p><font><b>Replace<a name="replace"></a>($table, $arrFields, $keyCols,$autoQuote=false)</b></font></p>
<p><font>Try to update a record, and if the record is not found, an insert statement
is generated and executed. Returns 0 on failure, 1 if update statement worked,
2 if no record was found and the insert was executed successfully. This differs
from MySQL's replace which deletes the record and inserts a new record. This
also means you cannot update the primary key. The only exception to this is
Interbase and its derivitives, which uses delete and insert because of some
Interbase API limitations.
</font></p><p><font>The parameters are $table which is the table name, the $arrFields which is an
associative array where the keys are the field names, and $keyCols is the name
of the primary key, or an array of field names if it is a compound key. If
$autoQuote is set to true, then Replace() will quote all values that are non-numeric;
auto-quoting will not quote nulls. Note that auto-quoting will not work if
you use SQL functions or operators.
</font></p><p><font>Examples:
</font></p><pre><font># single field primary key<br>$ret = $db-&gt;Replace('atable', <br> array('id'=&gt;1000,'firstname'=&gt;'Harun','lastname'=&gt;'Al-Rashid'),<br> 'id',$autoquote = true); <br># generates UPDATE atable SET firstname='Harun',lastname='Al-Rashid' WHERE id=1000<br># or INSERT INTO atable (id,firstname,lastname) VALUES (1000,'Harun','Al-Rashid')<br><br># compound key<br>$ret = $db-&gt;Replace('atable2', <br> array('firstname'=&gt;'Harun','lastname'=&gt;'Al-Rashid', 'age' =&gt; 33, 'birthday' =&gt; 'null'),<br> array('lastname','firstname'),<br> $autoquote = true);<br><br># no auto-quoting<br>$ret = $db-&gt;Replace('atable2', <br> array('firstname'=&gt;"'Harun'",'lastname'=&gt;"'Al-Rashid'", 'age' =&gt; 'null'),<br> array('lastname','firstname')); <br></font></pre>
<p><font><b>AutoExecute<a name="autoexecute"></a>($table, $arrFields, $mode, $where=false, $forceUpdate=true,$magicq=false)</b></font></p>
<p>Since ADOdb 4.56, you can automatically generate and execute INSERTs and UPDATEs on a given table with this
function, which is a wrapper for GetInsertSQL() and GetUpdateSQL().
<p>AutoExecute() inserts or updates $table given an array of $arrFields, where the keys are the field names and the array values are the
field values to store. Note that there is some overhead because the table is first queried to extract key information
before the SQL is generated. We generate an INSERT or UPDATE based on $mode (see below).
<p>
Legal values for $mode are
<ul>
<li>'INSERT' or 1 or DB_AUTOQUERY_INSERT
<li>'UPDATE' or 2 or DB_AUTOQUERY_UPDATE
</ul>
<p>You have to define the constants DB_AUTOQUERY_UPDATE and DB_AUTOQUERY_INSERT yourself or include adodb-pear.inc.php.
<p>The $where clause is required if $mode == 'UPDATE'. If $forceUpdate=false then we will query the
database first and check if the field value returned by the query matches the current field value; only if they differ do we update that field.
<p>Returns true on success, false on error.
<p>An example of its use is:
<pre>
$record["firstName"] = "Carol";
$record["lasTname"] = "Smith";
$conn->AutoExecute($table,$record,'INSERT');
# executes <i>"INSERT INTO $table (firstName,lasTname) values ('Carol',Smith')"</i>;
 
$record["firstName"] = "Carol";
$record["lasTname"] = "Jones";
$conn->AutoExecute($table,$record,'UPDATE', "lastname like 'Sm%'");
# executes <i>"UPDATE $table SET firstName='Carol',lasTname='Jones' WHERE lastname like 'Sm%'"</i>;
</pre>
<p>Note: One of the strengths of ADOdb's AutoExecute() is that only valid field names for $table are updated. If $arrFields
contains keys that are invalid field names for $table, they are ignored. There is some overhead in doing this as we have to
query the database to get the field names, but given that you are not directly coding the SQL yourself, you probably aren't interested in
speed at all, but convenience.
<p>Since 4.62, the table name to be used can be overridden by setting $rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is called.
<p><font><b>GetUpdateSQL<a name="getupdatesql"></a>(&amp;$rs, $arrFields, $forceUpdate=false,$magicq=false, $force=null)</b></font></p>
<p><font>Generate SQL to update a table given a recordset $rs, and the modified fields
of the array $arrFields (which must be an associative array holding the column
names and the new values) are compared with the current recordset. If $forceUpdate
is true, then we also generate the SQL even if $arrFields is identical to
$rs-&gt;fields. Requires the recordset to be associative. $magicq is used
to indicate whether magic quotes are enabled (see qstr()). The field names in the array
are case-insensitive.</font></p>
<font> </font><p><font>Since 4.52, we allow you to pass the $force type parameter, and this overrides the <a href="#ADODB_FORCE_TYPE">$ADODB_FORCE_TYPE</a>
global variable.
<p>Since 4.62, the table name to be used can be overridden by setting $rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is called.
</font></p><p><font><b>GetInsertSQL<a name="getinsertsql"></a>(&amp;$rs, $arrFields,$magicq=false,$force_type=false)</b></font></p>
<p><font>Generate SQL to insert into a table given a recordset $rs. Requires the query
to be associative. $magicq is used to indicate whether magic quotes are enabled
(for qstr()). The field names in the array are case-insensitive.</font></p>
<p>
<font> Since 2.42, you can pass a table name instead of a recordset into
GetInsertSQL (in $rs), and it will generate an insert statement for that table.
</font></p><p><font>Since 4.52, we allow you to pass the $force_type parameter, and this overrides the <a href="#ADODB_FORCE_TYPE">$ADODB_FORCE_TYPE</a>
global variable.
<p>Since 4.62, the table name to be used can be overridden by setting $rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is called.
</font></p><p><font><b>PageExecute<a name="pageexecute"></a>($sql, $nrows, $page, $inputarr=false)</b>
</font></p><p><font>Used for pagination of recordset. $page is 1-based. See <a href="#ex8">Example
8</a>.</font></p>
<p><font><b>CachePageExecute<a name="cachepageexecute"></a>($secs2cache,
$sql, $nrows, $page, $inputarr=false)</b> </font></p>
<p><font>Used for pagination of recordset. $page is 1-based. See
<a href="#ex8">Example 8</a>. Caching version of PageExecute.</font></p>
<font>
</font><p></p>
<p><font><b>Close<a name="close"></a>( )</b></font></p>
<p><font>Close the database connection. PHP4 proudly states that we no longer have to
clean up at the end of the connection because the reference counting mechanism
of PHP4 will automatically clean up for us.</font></p>
<font> </font><p><font><b>StartTrans<a name="starttrans"></a>( )</b></font></p>
<font> </font><p><font>Start a monitored transaction. As SQL statements are executed, ADOdb will monitor
for SQL errors, and if any are detected, when CompleteTrans() is called, we auto-rollback.
</font></p><p>
<font> </font></p><p><font> To understand why StartTrans() is superior to BeginTrans(),
let us examine a few ways of using BeginTrans().
The following is the wrong way to use transactions:
</font></p><pre><font>$DB-&gt;BeginTrans();<br>$DB-&gt;Execute("update table1 set val=$val1 where id=$id");<br>$DB-&gt;Execute("update table2 set val=$val2 where id=$id");<br>$DB-&gt;CommitTrans();<br></font></pre>
<p><font>because you perform no error checking. It is possible to update table1 and
for the update on table2 to fail. Here is a better way:
</font></p><pre><font>$DB-&gt;BeginTrans();<br>$ok = $DB-&gt;Execute("update table1 set val=$val1 where id=$id");<br>if ($ok) $ok = $DB-&gt;Execute("update table2 set val=$val2 where id=$id");<br>if ($ok) $DB-&gt;CommitTrans();<br>else $DB-&gt;RollbackTrans();<br></font></pre>
<p><font>Another way is (since ADOdb 2.0):
</font></p><pre><font>$DB-&gt;BeginTrans();<br>$ok = $DB-&gt;Execute("update table1 set val=$val1 where id=$id");<br>if ($ok) $ok = $DB-&gt;Execute("update table2 set val=$val2 where id=$id");<br>$DB-&gt;CommitTrans($ok);<br></font></pre>
<p><font> Now it is a headache monitoring $ok all over the place. StartTrans() is an
improvement because it monitors all SQL errors for you. This is particularly
useful if you are calling black-box functions in which SQL queries might be executed.
Also all BeginTrans, CommitTrans and RollbackTrans calls inside a StartTrans block
will be disabled, so even if the black box function does a commit, it will be ignored.
</font></p><pre><font>$DB-&gt;StartTrans();<br>CallBlackBox();<br>$DB-&gt;Execute("update table1 set val=$val1 where id=$id");<br>$DB-&gt;Execute("update table2 set val=$val2 where id=$id");<br>$DB-&gt;CompleteTrans();<br></font></pre>
<p><font>Note that a StartTrans blocks are nestable, the inner blocks are ignored.
</font></p><p><font><b>CompleteTrans<a name="completetrans"></a>($autoComplete=true)</b></font></p>
<font> </font><p><font>Complete a transaction called with StartTrans(). This function monitors
for SQL errors, and will commit if no errors have occured, otherwise it will rollback.
Returns true on commit, false on rollback. If the parameter $autoComplete is true
monitor sql errors and commit and rollback as appropriate. Set $autoComplete to false
to force rollback even if no SQL error detected.
</font></p><p><font><b>FailTrans<a name="failtrans"></a>( )</b></font></p>
<font> </font><p><font>Fail a transaction started with StartTrans(). The rollback will only occur when
CompleteTrans() is called.
</font></p><p><font><b>HasFailedTrans<a name="hasfailedtrans"></a>( )</b></font></p>
<font> </font><p><font>Check whether smart transaction has failed,
eg. returns true if there was an error in SQL execution or FailTrans() was called.
If not within smart transaction, returns false.
</font></p><p><font><b>BeginTrans<a name="begintrans"></a>( )</b></font></p>
<p><font>Begin a transaction. Turns off autoCommit. Returns true if successful. Some
databases will always return false if transaction support is not available.
Any open transactions will be rolled back when the connection is closed. Among the
databases that support transactions are Oracle, PostgreSQL, Interbase, MSSQL, certain
versions of MySQL, DB2, Informix, Sybase, etc.</font></p>
<font> </font><p><font>Note that <a href="#starttrans">StartTrans()</a> and CompleteTrans() is a superior method of
handling transactions, available since ADOdb 3.40. For a explanation, see the <a href="#starttrans">StartTrans()</a> documentation.
 
</font></p><p><font>You can also use the ADOdb <a href="#errorhandling">error handler</a> to die
and rollback your transactions for you transparently. Some buggy database extensions
are known to commit all outstanding tranasactions, so you might want to explicitly
do a $DB-&gt;RollbackTrans() in your error handler for safety.
</font></p><h4><font>Detecting Transactions</font></h4>
<font> </font><p><font>Since ADOdb 2.50, you are able to detect when you are inside a transaction. Check
that $connection-&gt;transCnt &gt; 0. This variable is incremented whenever BeginTrans() is called,
and decremented whenever RollbackTrans() or CommitTrans() is called.
</font></p><p><font><b>CommitTrans<a name="committrans"></a>($ok=true)</b></font></p>
<p><font>End a transaction successfully. Returns true if successful. If the database
does not support transactions, will return true also as data is always committed.
</font></p>
<p><font>If you pass the parameter $ok=false, the data is rolled back. See example in
BeginTrans().</font></p>
<p><font><b>RollbackTrans<a name="rollbacktrans"></a>( )</b></font></p>
<p><font>End a transaction, rollback all changes. Returns true if successful. If the
database does not support transactions, will return false as data is never rollbacked.
</font></p>
<font>
</font><p><font><b>GetAssoc<a name="getassoc1"></a>($sql,$inputarr=false,$force_array=false,$first2cols=false)</b></font></p>
<p><font>Returns an associative array for the given query $sql with optional bind parameters
in $inputarr. If the number of columns returned is greater to two, a 2-dimensional
array is returned, with the first column of the recordset becomes the keys
to the rest of the rows. If the columns is equal to two, a 1-dimensional array
is created, where the the keys directly map to the values (unless $force_array
is set to true, when an array is created for each value).
</font></p><p><font> Examples:<a name="getassocex"></a></font></p>
 
<p><font>We have the following data in a recordset:</font></p>
<p><font>row1: Apple, Fruit, Edible<br>
row2: Cactus, Plant, Inedible<br>
row3: Rose, Flower, Edible</font></p>
<p><font>GetAssoc will generate the following 2-dimensional associative
array:</font></p>
<p><font>Apple =&gt; array[Fruit, Edible]<br>
Cactus =&gt; array[Plant, Inedible]<br>
Rose =&gt; array[Flower,Edible]</font></p>
<p><font>If the dataset is:</font></p>
<p><font>row1: Apple, Fruit<br>
row2: Cactus, Plant<br>
row3: Rose, Flower </font></p>
<p><font>GetAssoc will generate the following 1-dimensional associative
array (with $force_array==false):</font></p>
<p><font>Apple =&gt; Fruit</font><br>
Cactus=&gt;Plant<br>
Rose=&gt;Flower </p>
<p><font>The function returns:</font></p>
<p><font>The associative array, or false if an error occurs.</font></p>
<font>
<p><b>CacheGetAssoc<a name="cachegetassoc"></a>([$secs2cache,] $sql,$inputarr=false,$force_array=false,$first2cols=false)</b></p>
</font>
<p><font>Caching version of <a href="#getassoc1">GetAssoc</a> function above.
</font></p><p><font><b>GetOne<a name="getone"></a>($sql,$inputarr=false)</b></font></p>
<p><font>Executes the SQL and returns the first field of the first row. The recordset
and remaining rows are discarded for you automatically. If an error occur, false
is returned.</font></p>
<p><font><b>GetRow<a name="getrow"></a>($sql,$inputarr=false)</b></font></p>
<p><font>Executes the SQL and returns the first row as an array. The recordset and remaining
rows are discarded for you automatically. If an error occurs, false is returned.</font></p>
<p><font><b>GetAll<a name="getall"></a>($sql,$inputarr=false)</b></font></p>
 
<p>Executes the SQL and returns the all the rows as a 2-dimensional
array. The recordset is discarded for you automatically. If an error occurs,
false is returned. <i>GetArray</i> is a synonym for <i>GetAll</i>.</p>
<p><b>GetCol<a name="getcol"></a>($sql,$inputarr=false,$trim=false)</b></p>
 
<p><font>Executes the SQL and returns all elements of the first column as a
1-dimensional array. The recordset is discarded for you automatically. If an error occurs,
false is returned.</font></p>
<p><font><b>CacheGetOne<a name="cachegetone"></a>([$secs2cache,]
$sql,$inputarr=false), CacheGetRow<a name="cachegetrow"></a>([$secs2cache,] $sql,$inputarr=false), CacheGetAll<a name="cachegetall"></a>([$secs2cache,]
$sql,$inputarr=false), CacheGetCol<a name="cachegetcol"></a>([$secs2cache,]
$sql,$inputarr=false,$trim=false)</b></font></p>
<font>
</font><p><font>Similar to above Get* functions, except that the recordset is serialized and
cached in the $ADODB_CACHE_DIR directory for $secs2cache seconds. Good for speeding
up queries on rarely changing data. Note that the $secs2cache parameter is optional.
If omitted, we use the value in $connection-&gt;cacheSecs (default is 3600 seconds,
or 1 hour).</font></p>
<p><font><b>Prepare<a name="prepare"></a>($sql )</b></font></p>
<p><font>Prepares (compiles) an SQL query for repeated execution. Bind parameters
are denoted by ?, except for the oci8 driver, which uses the traditional Oracle :varname
convention.
</font></p>
<p><font>Returns an array containing the original sql statement
in the first array element; the remaining elements of the array are driver dependent.
If there is an error, or we are emulating Prepare( ), we return the original
$sql string. This is because all error-handling has been centralized in Execute(
).</font></p>
<p><font>Prepare( ) cannot be used with functions that use SQL
query rewriting techniques, e.g. PageExecute( ) and SelectLimit( ).</font></p>
<p>Example:</p>
<pre><font>$stmt = $DB-&gt;Prepare('insert into table (col1,col2) values (?,?)');<br>for ($i=0; $i &lt; $max; $i++)<br></font> $DB-&gt;<font>Execute($stmt,array((string) rand(), $i));<br></font></pre>
<font>
</font><p><font>Also see InParameter(), OutParameter() and PrepareSP() below. Only supported internally by interbase,
oci8 and selected ODBC-based drivers, otherwise it is emulated. There is no
performance advantage to using Prepare() with emulation.
</font></p><p><font> Important: Due to limitations or bugs in PHP, if you are getting errors when
you using prepared queries, try setting $ADODB_COUNTRECS = false before preparing.
This behaviour has been observed with ODBC.
</font></p><p><font><b>IfNull<a name="ifnull"></a>($field, $nullReplacementValue)</b></font></p>
<p><font>Portable IFNULL function (NVL in Oracle). Returns a string that represents
the function that checks whether a $field is null for the given database, and
if null, change the value returned to $nullReplacementValue. Eg.</font></p>
<pre><font>$sql = <font color="#993300">'SELECT '</font>.$db-&gt;IfNull('name', <font color="#993300">"'- unknown -'"</font>).<font color="#993300"> ' FROM table'</font>;</font></pre>
 
<p><font><b>length<a name="length"></a></b></font></p>
<p><font>This is not a function, but a property. Some databases have "length" and others "len"
as the function to measure the length of a string. To use this property:
</font></p><pre><font> $sql = <font color="#993300">"SELECT "</font>.$db-&gt;length.<font color="#993300">"(field) from table"</font>;<br> $rs = $db-&gt;Execute($sql);<br></font></pre>
 
<p><font><b>random<a name="random"></a></b></font></p>
<p><font>This is not a function, but a property. This is a string that holds the sql to
generate a random number between 0.0 and 1.0 inclusive.
 
</font></p><p><font><b>substr<a name="substr"></a></b></font></p>
<p><font>This is not a function, but a property. Some databases have "substr" and others "substring"
as the function to retrieve a sub-string. To use this property:
</font></p><pre><font> $sql = <font color="#993300">"SELECT "</font>.$db-&gt;substr.<font color="#993300">"(field, $offset, $length) from table"</font>;<br> $rs = $db-&gt;Execute($sql);<br></font></pre>
<p><font>For all databases, the 1st parameter of <i>substr</i> is the field, the 2nd is the
offset (1-based) to the beginning of the sub-string, and the 3rd is the length of the sub-string.
 
 
</font></p><p><font><b>Param<a name="param"></a>($name)</b></font></p>
<p><font>Generates a bind placeholder portably. For most databases, the bind placeholder
is "?". However some databases use named bind parameters such as Oracle, eg
":somevar". This allows us to portably define an SQL statement with bind parameters:
</font></p><pre><font>$sql = <font color="#993300">'insert into table (col1,col2) values ('</font>.$DB-&gt;Param('a').<font color="#993300">','</font>.$DB-&gt;Param('b').<font color="#993300">')'</font>;<br><font color="#006600"># generates 'insert into table (col1,col2) values (?,?)'<br># or 'insert into table (col1,col2) values (:a,:b)</font>'<br>$stmt = $DB-&gt;Prepare($sql);<br>$stmt = $DB-&gt;Execute($stmt,array('one','two'));<br></font></pre>
<font> </font>
<p></p>
<p><font><b>PrepareSP</b><b><a name="preparesp"></a></b><b>($sql,
$cursor=false )</b></font></p>
<p><font>When calling stored procedures in mssql and oci8 (oracle),
and you might want to directly bind to parameters that return values, or
for special LOB handling. PrepareSP() allows you to do so. </font></p>
<p><font>Returns the same array or $sql string as Prepare( )
above. If you do not need to bind to return values, you should use Prepare(
) instead.</font></p>
<p><font>The 2nd parameter, $cursor is not used except with oci8.
Setting it to true will force OCINewCursor to be called; this is to support
output REF CURSORs. </font></p>
<p><font>For examples of usage of PrepareSP( ), see InParameter(
) below. </font></p>
<p><font>Note: in the mssql driver, preparing stored procedures
requires a special function call, mssql_init( ), which is called by this
function. PrepareSP( ) is available in all other drivers, and is emulated
by calling Prepare( ). </font></p>
<p><font><b> InParameter<a name="inparameter"></a>($stmt, $var,
$name, $maxLen = 4000, $type = false )</b></font></p>
<font>Binds a PHP variable as input to a stored procedure variable.
The parameter <i>$stmt</i> is the value returned by PrepareSP(), <i>$var</i> is
the PHP variable you want to bind, $name is the name of the stored procedure
variable. Optional is <i>$maxLen</i>, the maximum length of the data to bind,
and $type which is database dependant. Consult <a href="http://php.net/mssql_bind">mssql_bind</a> and <a href="http://php.net/ocibindbyname">ocibindbyname</a> docs
at php.net for more info on legal values for $type. </font>
<p>
<font>InParameter() is a wrapper function that calls Parameter()
with $isOutput=false. The advantage of this function is that it is self-documenting,
because the $isOutput parameter is no longer needed. Only for mssql and oci8
currently. </font></p>
<p><font>Here is an example using oci8: </font></p>
<pre><font><font color="green"># For oracle, Prepare and PrepareSP are identical</font>
$stmt = $db-&gt;PrepareSP(
<font color="#993300">"declare RETVAL integer; <br> begin<br> :RETVAL := </font><font color="#993300">SP_RUNSOMETHING</font><font color="#993300">(:myid,:group);<br> end;"</font>);<br>$db-&gt;InParameter($stmt,$id,'myid');<br>$db-&gt;InParameter($stmt,$group,'group',64);<br>$db-&gt;OutParameter($stmt,$ret,'RETVAL');<br>$db-&gt;Execute($stmt);<br></font></pre>
<p><font> The same example using mssql:</font></p>
<font>
</font><pre><font><font color="green"># @RETVAL = SP_RUNSOMETHING @myid,@group</font>
$stmt = $db-&gt;PrepareSP(<font color="#993333">'<font color="#993300">SP_RUNSOMETHING</font>'</font>); <br><font color="green"># note that the parameter name does not have @ in front!</font>
$db-&gt;InParameter($stmt,$id,'myid');
$db-&gt;InParameter($stmt,$group,'group',64);
<font color="green"># return value in mssql - RETVAL is hard-coded name</font> <br>$db-&gt;OutParameter($stmt,$ret,'RETVAL');<br>$db-&gt;Execute($stmt); </font></pre>
 
<p><font>Note that the only difference between the oci8 and mssql implementations is $sql.</font></p>
<p>
<font> If $type parameter is set to false, in mssql, $type will be dynamicly determined
based on the type of the PHP variable passed <font face="Courier New, Courier, mono">(string
=&gt; SQLCHAR, boolean =&gt;SQLINT1, integer =&gt;SQLINT4 or float/double=&gt;SQLFLT8)</font>.
</font></p><p><font>
In oci8, $type can be set to OCI_B_FILE (Binary-File), OCI_B_CFILE (Character-File),
OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) and OCI_B_ROWID (ROWID). To
pass in a null, use<font face="Courier New, Courier, mono"> $db-&gt;Parameter($stmt,
$null=null, 'param')</font>.
</font></p><p><font><b> OutParameter<a name="outparameter"></a>($stmt, $var, $name,
$maxLen = 4000, $type = false )</b></font></p>
<font> Binds a PHP variable as output from a stored procedure variable. The parameter <i>$stmt</i>
is the value returned by PrepareSP(), <i>$var</i> is the PHP variable you want to bind, <i>$name</i>
is the name of the stored procedure variable. Optional is <i>$maxLen</i>, the maximum length of the
data to bind, and <i>$type</i> which is database dependant.
</font><p>
<font> OutParameter() is a wrapper function that calls Parameter() with $isOutput=true.
The advantage of this function is that it is self-documenting, because
the $isOutput parameter is no longer needed. Only for mssql
and oci8 currently.
</font></p><p>
<font>For an example, see <a href="#inparameter">InParameter</a>.
 
</font></p><p><font><b> Parameter<a name="parameter"></a>($stmt, $var, $name, $isOutput=false,
$maxLen = 4000, $type = false )</b></font></p>
<p><font>Note: This function is deprecated, because of the new InParameter() and OutParameter() functions.
These are superior because they are self-documenting, unlike Parameter().
</font></p><p><font>Adds a bind parameter suitable for return values or special data handling (eg.
LOBs) after a statement has been prepared using PrepareSP(). Only for mssql
and oci8 currently. The parameters are:<br>
<br>
$<i><b>stmt</b></i> Statement returned by Prepare() or PrepareSP().<br>
$<i><b>var</b></i> PHP variable to bind to. Make sure you pre-initialize it!<br>
$<i><b>name</b></i> Name of stored procedure variable name to bind to.<br>
[$<i><b>isOutput</b></i>] Indicates direction of parameter 0/false=IN 1=OUT
2= IN/OUT. This is ignored in oci8 as this driver auto-detects the direction.<br>
[$<b>maxLen</b>] Maximum length of the parameter variable.<br>
[$<b>type</b>] Consult <a href="http://php.net/mssql_bind">mssql_bind</a> and
<a href="http://php.net/ocibindbyname">ocibindbyname</a> docs at php.net for
more info on legal values for type.</font></p>
<p><font>Lastly, in oci8, bind parameters can be reused without calling PrepareSP( )
or Parameters again. This is not possible with mssql. An oci8 example:</font></p>
<pre><font>$id = 0; $i = 0;<br>$stmt = $db-&gt;PrepareSP( <font color="#993300">"update table set val=:i where id=:id"</font>);<br>$db-&gt;Parameter($stmt,$id,'id');<br>$db-&gt;Parameter($stmt,$i, 'i');<br>for ($cnt=0; $cnt &lt; 1000; $cnt++) {<br> $id = $cnt; <br> $i = $cnt * $cnt; <font color="green"># works with oci8!</font>
$db-&gt;Execute($stmt); <br>}</font></pre>
<p><font><b>Bind<a name="bind"></a>($stmt, $var, $size=4001, $type=false, $name=false)</b></font></p>
<p><font>This is a low-level function supported only by the oci8
driver. <b>Avoid using</b> unless you only want to support Oracle. The Parameter(
) function is the recommended way to go with bind variables.</font></p>
<p><font>Bind( ) allows you to use bind variables in your sql
statement. This binds a PHP variable to a name defined in an Oracle sql statement
that was previously prepared using Prepare(). Oracle named variables begin with
a colon, and ADOdb requires the named variables be called :0, :1, :2, :3, etc.
The first invocation of Bind() will match :0, the second invocation will match
:1, etc. Binding can provide 100% speedups for insert, select and update statements.
</font></p>
<p>The other variables, $size sets the buffer size for data storage, $type is
the optional descriptor type OCI_B_FILE (Binary-File), OCI_B_CFILE (Character-File),
OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) and OCI_B_ROWID (ROWID).
Lastly, instead of using the default :0, :1, etc names, you can define your
own bind-name using $name.
</p><p><font>The following example shows 3 bind variables being used:
p1, p2 and p3. These variables are bound to :0, :1 and :2.</font></p>
<pre>$stmt = $DB-&gt;Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)");<br>$DB-&gt;Bind($stmt, $p1);<br>$DB-&gt;Bind($stmt, $p2);<br>$DB-&gt;Bind($stmt, $p3);<br>for ($i = 0; $i &lt; $max; $i++) { <br> $p1 = ?; $p2 = ?; $p3 = ?;<br> $DB-&gt;Execute($stmt);<br>}</pre>
<p>You can also use named variables:</p>
<pre>$stmt = $DB-&gt;Prepare("insert into table (col0, col1, col2) values (:name0, :name1, :name2)");<br>$DB-&gt;Bind($stmt, $p1, "name0");<br>$DB-&gt;Bind($stmt, $p2, "name1");<br>$DB-&gt;Bind($stmt, $p3, "name2");<br>for ($i = 0; $i &lt; $max; $i++) { <br> $p1 = ?; $p2 = ?; $p3 = ?;<br> $DB-&gt;Execute($stmt);<br>}</pre>
<p><b>LogSQL($enable=true)<a name="logsql"></a></b></p>
Call this method to install a SQL logging and timing function (using fnExecute).
Then all SQL statements are logged into an adodb_logsql table in a database. If
the adodb_logsql table does not exist, ADOdb will create the table if you have
the appropriate permissions. Returns the previous logging value (true for enabled,
false for disabled). Here are samples of the DDL for selected databases:
<p>
</p><pre> <b>mysql:</b>
CREATE TABLE adodb_logsql (
created datetime NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 text NOT NULL,
params text NOT NULL,
tracer text NOT NULL,
timer decimal(16,6) NOT NULL
)
<b>postgres:</b>
CREATE TABLE adodb_logsql (
created timestamp NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 text NOT NULL,
params text NOT NULL,
tracer text NOT NULL,
timer decimal(16,6) NOT NULL
)
<b>mssql:</b>
CREATE TABLE adodb_logsql (
created datetime NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 varchar(4000) NOT NULL,
params varchar(3000) NOT NULL,
tracer varchar(500) NOT NULL,
timer decimal(16,6) NOT NULL
)
<b>oci8:</b>
CREATE TABLE adodb_logsql (
created date NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 varchar(4000) NOT NULL,
params varchar(4000),
tracer varchar(4000),
timer decimal(16,6) NOT NULL
)
</pre>
Usage:
<pre> $conn-&gt;LogSQL(); // turn on logging<br> :<br> $conn-&gt;Execute(...);<br> :<br> $conn-&gt;LogSQL(false); // turn off logging<br> <br> # output summary of SQL logging results<br> $perf = NewPerfMonitor($conn);<br> echo $perf-&gt;SuspiciousSQL();<br> echo $perf-&gt;ExpensiveSQL();<br></pre>
<p>One limitation of logging is that rollback also prevents SQL from being logged.
</p><p>
If you prefer to use another name for the table used to store the SQL, you can override it by calling
adodb_perf::table($tablename), where $tablename is the new table name (you will still need to manually
create the table yourself). An example:
</p><pre> include('adodb.inc.php');<br> include('adodb-perf.inc.php');<br> adodb_perf::table('my_logsql_table');<br></pre>
Also see <a href="docs-perf.htm">Performance Monitor</a>.
<p><font><b>fnExecute and fnCacheExecute properties<a name="fnexecute" id="fnexecute"></a></b></font></p>
<p>These two properties allow you to define bottleneck functions for all sql statements
processed by ADOdb. This allows you to perform statistical analysis and query-rewriting
of your sql.
</p><p><b>Examples of fnExecute</b></p>
<p>Here is an example of using fnExecute, to count all cached queries and non-cached
queries, you can do this:</p>
<pre><font color="#006600"># $db is the connection object</font>
function CountExecs($db, $sql, $inputarray)
{
global $EXECS;
 
if (!is_array(inputarray)) $EXECS++;
<font color="#006600"># handle 2-dimensional input arrays</font>
else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray);
else $EXECS++;
}
 
<font color="#006600"># $db is the connection object</font>
function CountCachedExecs($db, $secs2cache, $sql, $inputarray)
{<br>global $CACHED; $CACHED++;<br>}<br><br>$db = NewADOConnection('mysql');<br>$db-&gt;Connect(...);<br>$db-&gt;<strong>fnExecute</strong> = 'CountExecs';<br>$db-&gt;<strong>fnCacheExecute</strong> = 'CountCachedExecs';<br> :<br> :<br><font color="#006600"># After many sql statements:</font>`<br>printf("&lt;p&gt;Total queries=%d; total cached=%d&lt;/p&gt;",$EXECS+$CACHED, $CACHED);<br></pre>
<p>The fnExecute function is called before the sql is parsed and executed, so
you can perform a query rewrite. If you are passing in a prepared statement,
then $sql is an array (see <a href="#prepare">Prepare</a>). The fnCacheExecute
function is only called if the recordset returned was cached.<font>
The function parameters match the Execute and CacheExecute functions respectively,
except that $this (the connection object) is passed as the first parameter.</font></p>
<p>Since ADOdb 3.91, the behaviour of fnExecute varies depending on whether the
defined function returns a value. If it does not return a value, then the $sql
is executed as before. This is useful for query rewriting or counting sql queries.
</p><p> On the other hand, you might want to replace the Execute function with one
of your own design. If this is the case, then have your function return a value.
If a value is returned, that value is returned immediately, without any further
processing. This is used internally by ADOdb to implement LogSQL() functionality.
</p>
<p>
</p><hr />
<h3><font>ADOConnection Utility Functions</font></h3>
<p><font><b>BlankRecordSet<a name="blankrecordset"></a>([$queryid])</b></font></p>
<p><font>No longer available - removed since 1.99.</font></p>
<p><font><b>Concat<a name="concat"></a>($s1,$s2,....)</b></font></p>
<p><font>Generates the sql string used to concatenate $s1, $s2, etc together. Uses the
string in the concat_operator field to generate the concatenation. Override
this function if a concatenation operator is not used, eg. MySQL.</font></p>
<p><font>Returns the concatenated string.</font></p>
<p><font><b>DBDate<a name="dbdate"></a>($date)</b></font></p>
<p><font>Format the $<b>date</b> in the format the database accepts. This is used in
INSERT/UPDATE statements; for SELECT statements, use <a href="#sqldate">SQLDate</a>.
The $<b>date</b> parameter can be a Unix integer timestamp or an ISO format
Y-m-d. Uses the fmtDate field, which holds the format to use. If null or false
or '' is passed in, it will be converted to an SQL null.</font></p>
<p><font>Returns the date as a quoted string.</font></p>
<p><font><b>DBTimeStamp<a name="dbtimestamp"></a>($ts)</b></font></p>
<p><font>Format the timestamp $<b>ts</b> in the format the database accepts; this can
be a Unix integer timestamp or an ISO format Y-m-d H:i:s. Uses the fmtTimeStamp
field, which holds the format to use. If null or false or '' is passed in, it
will be converted to an SQL null.</font></p>
<p><font>Returns the timestamp as a quoted string.</font></p>
<p><font><b>qstr<a name="qstr"></a>($s,[$magic_quotes_enabled</b>=false]<b>)</b></font></p>
<p><font>Quotes a string to be sent to the database. The $<b>magic_quotes_enabled</b>
parameter may look funny, but the idea is if you are quoting a string extracted
from a POST/GET variable, then pass get_magic_quotes_gpc() as the second parameter.
This will ensure that the variable is not quoted twice, once by <i>qstr</i>
and once by the <i>magic_quotes_gpc</i>.</font></p>
<p><font>Eg.<font face="Courier New, Courier, mono"> $s = $db-&gt;qstr(HTTP_GET_VARS['name'],get_magic_quotes_gpc());</font></font></p>
<p><font>Returns the quoted string.</font></p>
<p><font><b>Quote<a name="quote"></a>($s)</b></font></p>
<p><font>Quotes the string $s, escaping the database specific quote character as appropriate.
Formerly checked magic quotes setting, but this was disabled since 3.31 for
compatibility with PEAR DB.
</font></p><p><font><b>Affected_Rows<a name="affected_rows"></a>( )</b></font></p>
<p><font>Returns the number of rows affected by a update or delete statement. Returns
false if function not supported.</font></p>
<p><font>Not supported by interbase/firebird currently. </font></p>
<p><font><b>Insert_ID<a name="inserted_id"></a>( )</b></font></p>
<p><font>Returns the last autonumbering ID inserted. Returns false if function not supported.
</font></p>
<p><font>Only supported by databases that support auto-increment or object id's, such
as PostgreSQL, MySQL and MS SQL Server currently. PostgreSQL returns the OID, which
can change on a database reload.</font></p>
<p><font><b>RowLock<a name="rowlock"></a>($table,$where)</b></font></p>
<p><font>Lock a table row for the duration of a transaction. For example to lock record $id in table1:
</font></p><pre><font> $DB-&gt;StartTrans();<br> $DB-&gt;RowLock("table1","rowid=$id");<br> $DB-&gt;Execute($sql1);<br> $DB-&gt;Execute($sql2);<br> $DB-&gt;CompleteTrans();<br></font></pre>
<p><font>Supported in db2, interbase, informix, mssql, oci8, postgres, sybase.
</font></p><p><font><b>MetaDatabases<a name="metadatabases"></a>()</b></font></p>
<p><font>Returns a list of databases available on the server as an array. You have to
connect to the server first. Only available for ODBC, MySQL and ADO.</font></p>
<p><font><b>MetaTables<a name="metatables"></a>($ttype = false, $showSchema = false,
$mask=false)</b></font></p>
<p><font>Returns an array of tables and views for the current database as an array.
The array should exclude system catalog tables if possible. To only show tables,
use $db-&gt;MetaTables('TABLES'). To show only views, use $db-&gt;MetaTables('VIEWS').
The $showSchema parameter currently works only for DB2, and when set to true,
will add the schema name to the table, eg. "SCHEMA.TABLE". </font></p>
<p><font>You can define a mask for matching. For example, setting $mask = 'TMP%' will
match all tables that begin with 'TMP'. Currently only mssql, oci8, odbc_mssql
and postgres* support $mask.
</font></p><p><font><b>MetaColumns<a name="metacolumns"></a>($table,$notcasesensitive=true)</b></font></p>
<p><font>Returns an array of ADOFieldObject's, one field object for every column of
$table. A field object is a class instance with (name, type, max_length) defined.
Currently Sybase does not recognise date types, and ADO cannot identify
the correct data type (so we default to varchar).
</font></p><p><font> The $notcasesensitive parameter determines whether we uppercase or lowercase the table name to normalize it
(required for some databases). Does not work with MySQL ISAM tables.
</font></p><p><font>For schema support, pass in the $table parameter, "$schema.$tablename". This is only
supported for selected databases.
</font></p><p><font><b>MetaColumnNames<a name="metacolumnames"></a>($table,$numericIndex=false)</b></font></p>
<p><font>Returns an array of column names for $table. Since ADOdb 4.22, this is an associative array, with the
keys in uppercase. Set $numericIndex=true if you want the old behaviour of numeric indexes (since 4.23).
</font></p><p>
<font>e.g. array('FIELD1' =&gt; 'Field1', 'FIELD2'=&gt;'Field2')
</font></p><p>
</p><p><font><b>MetaPrimaryKeys<a name="metaprimarykeys"></a>($table,
$owner=false)</b></font>
</p>
<p><font>Returns an array containing column names that are the
primary keys of $table. Supported by mysql, odbc (including db2, odbc_mssql,
etc), mssql, postgres, interbase/firebird, oci8 currently. </font></p>
<p><font>Views (and some tables) have primary keys, but sometimes this information is not available from the
database. You can define a function ADODB_View_PrimaryKeys($databaseType, $database, $view, $owner) that
should return an array containing the fields that make up the primary key. If that function exists,
it will be called when MetaPrimaryKeys() cannot find a primary key for a table or view.
</font></p><pre><font>// In this example: dbtype = 'oci8', $db = 'mydb', $view = 'dataView', $owner = false <br>function ADODB_View_PrimaryKeys($dbtype,$db,$view,$owner)<br>{<br> switch(strtoupper($view)) {<br> case 'DATAVIEW': return array('DATAID');<br> default: return false;<br> }<br>}<br><br>$db = NewADOConnection('oci8');<br>$db-&gt;Connect('localhost','root','','mydb'); <br>$db-&gt;MetaPrimaryKeys('dataView');<br></font></pre>
<p><font><b>ServerInfo<a name="serverinfo" id="serverinfo"></a>()</b></font>
</p>
<p><font>Returns an array of containing two elements 'description'
and 'version'. The 'description' element contains the string description of
the database. The 'version' naturally holds the version number (which is also
a string).</font></p>
<p><font><b>MetaForeignKeys<a name="metaforeignkeys"></a>($table, $owner=false, $upper=false)</b>
</font></p><p><font>Returns an associate array of foreign keys, or false if not supported. For
example, if table employee has a foreign key where employee.deptkey points to
dept_table.deptid, and employee.posn=posn_table.postionid and employee.poscategory=posn_table.category,
then $conn-&gt;MetaForeignKeys('employee') will return
</font></p><pre><font> array(<br> 'dept_table' =&gt; array('deptkey=deptid'),<br> 'posn_table' =&gt; array('posn=positionid','poscategory=category')<br> )<br></font></pre>
<p><font>The optional schema or owner can be defined in $owner. If $upper is true, then
the table names (array keys) are upper-cased.
</font></p><hr />
<h2><font>ADORecordSet<a name="adorecordset"></a></font></h2>
<p><font>When an SQL statement successfully is executed by <font face="Courier New, Courier, mono">ADOConnection-&gt;Execute($sql),</font>an
ADORecordSet object is returned. This object contains a virtual cursor so we
can move from row to row, functions to obtain information about the columns
and column types, and helper functions to deal with formating the results to
show to the user.</font></p>
<h3><font>ADORecordSet Fields</font></h3>
<p><font><b>fields: </b>Array containing the current row. This is not associative, but
is an indexed array from 0 to columns-1. See also the function <b><a href="#fields">Fields</a></b>,
which behaves like an associative array.</font></p>
<p><font><b>dataProvider</b>: The underlying mechanism used to connect to the database.
Normally set to <b>native</b>, unless using <b>odbc</b> or <b>ado</b>.</font></p>
<p><font><b>blobSize</b>: Maximum size of a char, string or varchar object before it
is treated as a Blob (Blob's should be shown with textarea's). See the <a href="#metatype">MetaType</a>
function.</font></p>
<p><font><b>sql</b>: Holds the sql statement used to generate this record set.</font></p>
<p><font><b>canSeek</b>: Set to true if Move( ) function works.</font></p>
<p><font><b>EOF</b>: True if we have scrolled the cursor past the last record.</font></p>
<h3><font>ADORecordSet Functions</font></h3>
<p><font><b>ADORecordSet( )</b></font></p>
<p><font>Constructer. Normally you never call this function yourself.</font></p>
<p><font><b>GetAssoc<a name="getassoc"></a>([$force_array])</b></font></p>
<p><font>Generates an associative array from the recordset. Note that is this function
is also <a href="#getassoc1">available</a> in the connection object. More details
can be found there.</font></p>
<font> </font>
<p><font><b>GetArray<a name="getarray"></a>([$number_of_rows])</b></font></p>
<p><font>Generate a 2-dimensional array of records from the current
cursor position, indexed from 0 to $number_of_rows - 1. If $number_of_rows
is undefined, till EOF.</font></p>
<p><font><b>GetRows<a name="getrows"></a>([$number_of_rows])</b></font></p>
<font>Generate a 2-dimensional array of records from the current
cursor position. Synonym for GetArray() for compatibility with Microsoft ADO. </font>
<p><font> <b>GetMenu<a name="getmenu"></a>($name, [$default_str=''],
[$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])</b></font></p>
<p><font>Generate a HTML menu (&lt;select&gt;&lt;option&gt;&lt;option&gt;&lt;/select&gt;).
The first column of the recordset (fields[0]) will hold the string to display
in the option tags. If the recordset has more than 1 column, the second column
(fields[1]) is the value to send back to the web server.. The menu will be
given the name $<i>name</i>. </font></p>
<p><font> If $<i>default_str</i> is defined, then if $<i>default_str</i> ==
fields[0], that field is selected. If $<i>blank1stItem</i> is true, the first
option is empty. You can also set the first option strings by setting $blank1stItem
= "$value:$text".</font></p>
<p><font>$<i>Default_str</i> can be array for a multiple select
listbox.</font></p>
<p><font>To get a listbox, set the $<i>size</i> to a non-zero
value (or pass $default_str as an array). If $<i>multiple_select</i> is true
then a listbox will be generated with $<i>size</i> items (or if $size==0,
then 5 items) visible, and we will return an array to a server. Lastly use
$<i>moreAttr </i> to add additional attributes such as javascript or styles. </font></p>
<p><font>Menu Example 1: <code>GetMenu('menu1','A',true)</code> will
generate a menu:
<select name="menu1"><option> </option><option value="1" selected="selected">A </option><option value="2">B </option><option value="3">C </option></select>
for the data (A,1), (B,2), (C,3). Also see <a href="#ex5">example 5</a>.</font></p>
<p><font>Menu Example 2: For the same data, <code>GetMenu('menu1',array('A','B'),false)</code> will
generate a menu with both A and B selected: <br>
<select name="menu1" multiple="multiple" size="3"><option value="1" selected="selected">A </option><option value="2" selected="selected">B </option><option value="3">C </option></select>
</font></p>
<p><font> <b>GetMenu2<a name="getmenu2"></a>($name, [$default_str=''],
[$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])</b></font></p>
<p><font>This is nearly identical to GetMenu, except that the
$<i>default_str</i> is matched to fields[1] (the option values).</font></p>
<p><font>Menu Example 3: Given the data in menu example 2, <code>GetMenu2('menu1',array('1','2'),false)</code> will
generate a menu with both A and B selected in menu example 2, but this time
the selection is based on the 2nd column, which holds the values to return
to the Web server. </font></p>
<p><font><b>UserDate<a name="userdate"></a>($str, [$fmt])</b></font></p>
<p><font>Converts the date string $<i>str</i> to another format.
The date format is Y-m-d, or Unix timestamp format. The default $<i>fmt</i> is
Y-m-d.</font></p>
<p><font><b>UserTimeStamp<a name="usertimestamp"></a>($str, [$fmt])</b></font></p>
<p><font>Converts the timestamp string $<b>str</b> to another
format. The timestamp format is Y-m-d H:i:s, as in '2002-02-28 23:00:12',
or Unix timestamp format. UserTimeStamp calls UnixTimeStamp to parse $<i>str</i>,
and $<i>fmt</i> defaults to Y-m-d H:i:s if not defined. </font></p>
<p><font><b>UnixDate<a name="unixdate"></a>($str)</b></font></p>
<p><font>Parses the date string $<b>str</b> and returns it in
unix mktime format (eg. a number indicating the seconds after January 1st,
1970). Expects the date to be in Y-m-d H:i:s format, except for Sybase and
Microsoft SQL Server, where M d Y is also accepted (the 3 letter month strings
are controlled by a global array, which might need localisation).</font></p>
<p><font>This function is available in both ADORecordSet and
ADOConnection since 1.91.</font></p>
<p><font><b>UnixTimeStamp<a name="unixtimestamp"></a>($str)</b></font></p>
<p><font>Parses the timestamp string $<b>str</b> and returns
it in unix mktime format (eg. a number indicating the seconds after January
1st, 1970). Expects the date to be in "Y-m-d, H:i:s" (1970-12-24, 00:00:00)
or "Y-m-d H:i:s" (1970-12-24 00:00:00) or "YmdHis" (19701225000000) format,
except for Sybase and Microsoft SQL Server, where "M d Y h:i:sA" (Dec 25
1970 00:00:00AM) is also accepted (the 3 letter month strings are controlled
by a global array, which might need localisation).</font></p>
<font>
</font><p><font>This function is available in both ADORecordSet
and ADOConnection since 1.91. </font></p>
<p><font><b>OffsetDate<a name="offsetdate"></a>($dayFraction,
$basedate=false)</b></font></p>
<p><font>Returns a string with the native SQL functions to calculate
future and past dates based on $basedate in a portable fashion. If $basedate
is not defined, then the current date (at 12 midnight) is used. Returns the
SQL string that performs the calculation when passed to Execute(). </font></p>
<p><font>For example, in Oracle, to find the date and time that
is 2.5 days from today, you can use:</font></p>
<pre><font># get date one week from now<br>$fld = $conn-&gt;OffsetDate(7); // returns "(trunc(sysdate)+7")</font></pre>
<pre><font># get date and time that is 60 hours from current date and time<br>$fld = $conn-&gt;OffsetDate(2.5, $conn-&gt;sysTimeStamp); // returns "(sysdate+2.5)"<br><br>$conn-&gt;Execute("UPDATE TABLE SET dodate=$fld WHERE ID=$id");</font></pre>
<p><font> This function is available for mysql, mssql, oracle, oci8 and postgresql drivers
since 2.13. It might work with other drivers provided they allow performing
numeric day arithmetic on dates.</font></p>
<font> </font>
<p><font><b>SQLDate<a name="sqldate"></a>($dateFormat, $basedate=false)</b></font></p>
<font>Returns a string which contains the native SQL functions
to format a date or date column $basedate. This is used in SELECT statements.
For INSERT/UPDATE statements, use <a href="#dbdate">DBDate</a>. It uses a case-sensitive
$dateFormat, which supports: </font>
<pre><font>
Y: 4-digit Year
Q: Quarter (1-4)
M: Month (Jan-Dec)
m: Month (01-12)
d: Day (01-31)
H: Hour (00-23)
h: Hour (1-12)
i: Minute (00-59)
s: Second (00-60)
A: AM/PM indicator
w: day of week (0-6 or 1-7 depending on DB)
l: day of week (as string - lowercase L)
W: week in year (0..53 for MySQL, 1..53 for PostgreSQL and Oracle)
</font></pre>
<p><font>All other characters are treated as strings. You can
also use \ to escape characters. Available on selected databases, including
mysql, postgresql, mssql, oci8 and DB2. </font></p>
<p><font>This is useful in writing portable sql statements that
GROUP BY on dates. For example to display total cost of goods sold broken
by quarter (dates are stored in a field called postdate): </font></p>
<pre><font> $sqlfn = $db-&gt;SQLDate('Y-\QQ','postdate'); # get sql that formats postdate to output 2002-Q1<br> $sql = "SELECT $sqlfn,SUM(cogs) FROM table GROUP BY $sqlfn ORDER BY 1 desc";<br> </font></pre>
<p><font><b>MoveNext<a name="movenext"></a>( )</b></font></p>
<p><font>Move the internal cursor to the next row. The <i>$this-&gt;fields</i> array
is automatically updated. Returns false if unable to do so (normally because
EOF has been reached), otherwise true. </font></p>
<p><font> If EOF is reached, then the $this-&gt;fields array
is set to false (this was only implemented consistently in ADOdb 3.30). For
the pre-3.30 behaviour of $this-&gt;fields (at EOF), set the global variable
$ADODB_COMPAT_FETCH = true.</font></p>
<p><font>Example:</font></p>
<pre><font>$rs = $db-&gt;Execute($sql);<br>if ($rs) <br> while (!$rs-&gt;EOF) {<br> ProcessArray($rs-&gt;fields); <br> $rs-&gt;MoveNext();<br> } </font></pre>
<p><font><b>Move<a name="move"></a>($to)</b></font></p>
<p><font>Moves the internal cursor to a specific row $<b>to</b>.
Rows are zero-based eg. 0 is the first row. The <b>fields</b> array is automatically
updated. For databases that do not support scrolling internally, ADOdb will
simulate forward scrolling. Some databases do not support backward scrolling.
If the $<b>to</b> position is after the EOF, $<b>to</b> will move to the
end of the RecordSet for most databases. Some obscure databases using odbc
might not behave this way.</font></p>
<p><font>Note: This function uses <i>absolute positioning</i>,
unlike Microsoft's ADO.</font></p>
<p><font>Returns true or false. If false, the internal cursor
is not moved in most implementations, so AbsolutePosition( ) will return
the last cursor position before the Move( ). </font></p>
<p><font><b>MoveFirst<a name="movefirst"></a>()</b></font></p>
<p><font>Internally calls Move(0). Note that some databases do
not support this function.</font></p>
<p><font><b>MoveLast<a name="movelast"></a>()</b></font></p>
<p><font>Internally calls Move(RecordCount()-1). Note that some
databases do not support this function.</font></p>
<p><font><b>GetRowAssoc</b><a name="getrowassoc"></a>($toUpper=true)</font></p>
<p><font>Returns an associative array containing the current
row. The keys to the array are the column names. The column names are upper-cased
for easy access. To get the next row, you will still need to call MoveNext(). </font></p>
<p><font>For example:<br>
Array ( [ID] =&gt; 1 [FIRSTNAME] =&gt; Caroline [LASTNAME] =&gt; Miranda [CREATED]
=&gt; 2001-07-05 ) </font></p>
<p><font>Note: do not use GetRowAssoc() with $ADODB_FETCH_MODE
= ADODB_FETCH_ASSOC. Because they have the same functionality, they will
interfere with each other.</font></p>
<font>
</font><p><font><b>AbsolutePage<a name="absolutepage"></a>($page=-1) </b></font></p>
<p><font>Returns the current page. Requires PageExecute()/CachePageExecute() to be called.
See <a href="#ex8">Example 8</a>.</font></p>
<font>
<p><b>AtFirstPage<a name="atfirstpage">($status='')</a></b></p>
<p>Returns true if at first page (1-based). Requires PageExecute()/CachePageExecute()
to be called. See <a href="#ex8">Example 8</a>.</p>
<p><b>AtLastPage<a name="atlastpage">($status='')</a></b></p>
<p>Returns true if at last page (1-based). Requires PageExecute()/CachePageExecute()
to be called. See <a href="#ex8">Example 8</a>.</p>
<p><b>Fields</b><a name="fields"></a>(<b>$colname</b>)</p>
<p>Returns the value of the associated column $<b>colname</b> for the current
row. The column name is case-insensitive.</p>
<p>This is a convenience function. For higher performance, use <a href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a>. </p>
<p><b>FetchRow</b><a name="fetchrow"></a>()</p>
</font><p><font>Returns array containing current row, or false
if EOF. FetchRow( ) internally moves to the next record after returning the
current row. </font></p>
<p><font>Warning: Do not mix using FetchRow() with MoveNext().</font></p>
<p><font>Usage:</font></p>
<pre><font>$rs = $db-&gt;Execute($sql);<br>if ($rs)<br> while ($arr = $rs-&gt;FetchRow()) {<br> &nbsp;&nbsp;# process $arr <br> }</font></pre>
<p><font><b>FetchInto</b><a name="fetchinto"></a>(<b>&amp;$array</b>)</font></p>
<p><font> Sets $array to the current row. Returns PEAR_Error
object if EOF, 1 if ok (DB_OK constant). If PEAR is undefined, false is returned
when EOF. FetchInto( ) internally moves to the next record after returning
the current row. </font></p>
<p><font> FetchRow() is easier to use. See above.</font></p>
<font> </font>
<p><font><b>FetchField<a name="fetchfield"></a>($column_number)</b></font></p>
<p><font>Returns an object containing the <b>name</b>, <b>type</b> and <b>max_length</b> of
the associated field. If the max_length cannot be determined reliably, it
will be set to -1. The column numbers are zero-based. See <a href="#ex2">example
2.</a></font></p>
<p><font><b>FieldCount<a name="fieldcount"></a>( )</b></font></p>
<p><font>Returns the number of fields (columns) in the record
set.</font></p>
<p><font><b>RecordCount<a name="recordcount"></a>( )</b></font></p>
<p><font>Returns the number of rows in the record set. If the
number of records returned cannot be determined from the database driver
API, we will buffer all rows and return a count of the rows after all the
records have been retrieved. This buffering can be disabled (for performance
reasons) by setting the global variable $ADODB_COUNTRECS = false. When disabled,
RecordCount( ) will return -1 for certain databases. See the supported databases
list above for more details. </font></p>
<p><font> RowCount is a synonym for RecordCount.</font></p>
<p><font><b>PO_RecordCount<a name="po_recordcount"></a>($table,
$where)</b></font></p>
<p><font>Returns the number of rows in the record set. If the
database does not support this, it will perform a SELECT COUNT(*) on the
table $table, with the given $where condition to return an estimate of the
recordset size.</font></p>
<p><font>$numrows = $rs-&gt;PO_RecordCount("articles_table", "group=$group");</font></p>
<font><b> NextRecordSet<a name="nextrecordset" id="nextrecordset"></a>()</b> </font>
<p><font>For databases that allow multiple recordsets to be returned
in one query, this function allows you to switch to the next recordset. Currently
only supported by mssql driver.</font></p>
<pre><font>$rs = $db-&gt;Execute('execute return_multiple_rs');<br>$arr1 = $rs-&gt;GetArray();<br>$rs-&gt;NextRecordSet();<br>$arr2 = $rs-&gt;GetArray();</font></pre>
<p><font><b>FetchObject<a name="fetchobject"></a>($toupper=true)</b></font></p>
<p><font>Returns the current row as an object. If you set $toupper
to true, then the object fields are set to upper-case. Note: The newer FetchNextObject()
is the recommended way of accessing rows as objects. See below.</font></p>
<p><font><b>FetchNextObject<a name="fetchnextobject"></a>($toupper=true)</b></font></p>
<p><font>Gets the current row as an object and moves to the next
row automatically. Returns false if at end-of-file. If you set $toupper to
true, then the object fields are set to upper-case.</font></p>
<pre><font>$rs = $db-&gt;Execute('select firstname,lastname from table');<br>if ($rs) {<br> while ($o = $rs-&gt;FetchNextObject()) {<br> print "$o-&gt;FIRSTNAME, $o-&gt;LASTNAME&lt;BR&gt;";<br> }<br>}<br></font></pre>
<p><font>There is some trade-off in speed in using FetchNextObject().
If performance is important, you should access rows with the <code>fields[]</code> array. <b>FetchObj<a name="fetchobj" id="fetchobj"></a>()</b> </font></p>
<p><font>Returns the current record as an object. Fields are
not upper-cased, unlike FetchObject.
</font></p>
<p><font><b>FetchNextObj<a name="fetchnextobj" id="fetchnextobj"></a>()</b> </font></p>
<p><font>Returns the current record as an object and moves to
the next record. If EOF, false is returned. Fields are not upper-cased, unlike
FetctNextObject. </font></p>
<font>
<p><b>CurrentRow<a name="currentrow"></a>( )</b></p>
<p>Returns the current row of the record set. 0 is the first row.</p>
<p><b>AbsolutePosition<a name="abspos"></a>( )</b></p>
<p>Synonym for <b>CurrentRow</b> for compatibility with ADO. Returns the current
row of the record set. 0 is the first row.</p>
<p><b>MetaType<a name="metatype"></a>($nativeDBType[,$field_max_length],[$fieldobj])</b></p>
<p>Determine what <i>generic</i> meta type a database field type is given its
native type $<b>nativeDBType</b> as a string and the length of the field $<b>field_max_length</b>.
Note that field_max_length can be -1 if it is not known. The field object returned
by FetchField() can be passed in $<b>fieldobj</b> or as the 1st parameter <b>$nativeDBType</b>.
This is useful for databases such as <i>mysql</i> which has additional properties
in the field object such as <i>primary_key</i>. </p>
<p>Uses the field <b>blobSize</b> and compares it with $<b>field_max_length</b> to
determine whether the character field is actually a blob.</p>
For example, $db-&gt;MetaType('char') will return 'C'.
<p>Returns:</p>
<ul>
<li><b>C</b>: Character fields that should be shown in a &lt;input type="text"&gt; tag. </li>
<li><b>X</b>: Clob (character large objects), or large text fields that should
be shown in a &lt;textarea&gt;</li>
<li><b>D</b>: Date field</li>
<li><b>T</b>: Timestamp field</li>
<li><b>L</b>: Logical field (boolean or bit-field)</li>
<li><b>N</b>: Numeric field. Includes decimal, numeric, floating point, and
real. </li>
<li><b>I</b>:&nbsp; Integer field. </li>
<li><b>R</b>: Counter or Autoincrement field. Must be numeric.</li>
<li><b>B</b>: Blob, or binary large objects. </li>
</ul>
</font><p><font> Since ADOdb 3.0, MetaType accepts $fieldobj
as the first parameter, instead of $nativeDBType. </font></p>
<font> </font>
<p><font><b>Close( )<a name="rsclose"></a></b></font></p>
<p><font>Closes the recordset, cleaning all memory and resources
associated with the recordset. </font></p>
<p>
<font>If memory management is not an issue, you do not need to
call this function as recordsets are closed for you by PHP at the end of the
script. SQL statements such as INSERT/UPDATE/DELETE do not really return a recordset,
so you do not have to call Close() for such SQL statements.</font></p>
<hr />
<h3><font>function rs2html<a name="rs2html"></a>($adorecordset,[$tableheader_attributes],
[$col_titles])</font></h3>
<p><font>This is a standalone function (rs2html = recordset to
html) that is similar to PHP's <i>odbc_result_all</i> function, it prints
a ADORecordSet, $<b>adorecordset</b> as a HTML table. $<b>tableheader_attributes</b> allow
you to control the table <i>cellpadding</i>, <i>cellspacing</i> and <i>border</i> attributes.
Lastly you can replace the database column names with your own column titles
with the array $<b>col_titles</b>. This is designed more as a quick debugging
mechanism, not a production table recordset viewer.</font></p>
<p><font>You will need to include the file <i>tohtml.inc.php</i>.</font></p>
<p><font>Example of rs2html:<b><font color="#336600"><a name="exrs2html"></a></font></b></font></p>
<pre><font><b><font color="#336600">&lt;?<br>include('tohtml.inc.php')</font></b>; # load code common to ADOdb <br><b>include</b>('adodb.inc.php'); # load code common to ADOdb <br>$<font color="#663300">conn</font> = &amp;ADONewConnection('mysql'); # create a connection <br>$<font color="#663300">conn</font>-&gt;PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br>$<font color="#663300">sql</font> = 'select CustomerName, CustomerID from customers'; <br>$<font color="#663300">rs</font> = $<font color="#663300">conn</font>-&gt;Execute($sql); <br><font color="#336600"><b>rs2html</b></font><b>($<font color="#663300">rs</font>,'<i>border=2 cellpadding=3</i>',array('<i>Customer Name','Customer ID</i>'));<br>?&gt;</b></font></pre>
<hr />
<h3><font>Differences between this ADOdb library and Microsoft
ADO<a name="adodiff"></a></font></h3>
<ol>
<font>
<li>ADOdb only supports recordsets created by a connection object. Recordsets
cannot be created independently.</li>
<li>ADO properties are implemented as functions in ADOdb. This makes it easier
to implement any enhanced ADO functionality in the future.</li>
<li>ADOdb's <font face="Courier New, Courier, mono">ADORecordSet-&gt;Move()</font> uses
absolute positioning, not relative. Bookmarks are not supported.</li>
<li><font face="Courier New, Courier, mono">ADORecordSet-&gt;AbsolutePosition() </font>cannot
be used to move the record cursor.</li>
<li>ADO Parameter objects are not supported. Instead we have the ADOConnection::<a href="#parameter">Parameter</a>(
) function, which provides a simpler interface for calling preparing parameters
and calling stored procedures.</li>
<li>Recordset properties for paging records are available, but implemented as
in <a href="#ex8">Example 8</a>.</li>
</font></ol>
<hr />
<h1><font>Database Driver Guide<a name="driverguide"></a></font></h1>
<p><font>This describes how to create a class to connect to a
new database. To ensure there is no duplication of work, kindly email me
at jlim#natsoft.com.my if you decide to create such a class.</font></p>
<p><font>First decide on a name in lower case to call the database
type. Let's say we call it xbase. </font></p>
<p><font>Then we need to create two classes ADODB_xbase and ADORecordSet_xbase
in the file adodb-xbase.inc.php.</font></p>
<p><font>The simplest form of database driver is an adaptation
of an existing ODBC driver. Then we just need to create the class <i>ADODB_xbase
extends ADODB_odbc</i> to support the new <b>date</b> and <b>timestamp</b> formats,
the <b>concatenation</b> operator used, <b>true</b> and <b>false</b>. For
the<i> ADORecordSet_xbase extends ADORecordSet_odbc </i>we need to change
the <b>MetaType</b> function. See<b> adodb-vfp.inc.php</b> as an example.</font></p>
<p><font>More complicated is a totally new database driver that
connects to a new PHP extension. Then you will need to implement several
functions. Fortunately, you do not have to modify most of the complex code.
You only need to override a few stub functions. See <b>adodb-mysql.inc.php</b> for
example.</font></p>
<p><font>The default date format of ADOdb internally is YYYY-MM-DD
(Ansi-92). All dates should be converted to that format when passing to an
ADOdb date function. See Oracle for an example how we use ALTER SESSION to
change the default date format in _pconnect _connect.</font></p>
<p><font><b>ADOConnection Functions to Override</b></font></p>
<p><font>Defining a constructor for your ADOConnection derived
function is optional. There is no need to call the base class constructor.</font></p>
<p><font>_<b>connect</b>: Low level implementation of Connect.
Returns true or false. Should set the _<b>connectionID</b>.</font></p>
<p><font>_<b>pconnect:</b> Low level implemention of PConnect.
Returns true or false. Should set the _<b>connectionID</b>.</font></p>
<p><font>_<b>query</b>: Execute a query. Returns the queryID,
or false.</font></p>
<p><font>_<b>close: </b>Close the connection -- PHP should clean
up all recordsets. </font></p>
<p><font><b>ErrorMsg</b>: Stores the error message in the private
variable _errorMsg. </font></p>
<p><font><b>ADOConnection Fields to Set</b></font></p>
<p><font>_<b>bindInputArray</b>: Set to true if binding of parameters
for SQL inserts and updates is allowed using ?, eg. as with ODBC.</font></p>
<p><font><b>fmtDate</b></font></p>
<p><font><b>fmtTimeStamp</b></font></p>
<p><font><b>true</b></font></p>
<p><font><b>false</b></font></p>
<p><font><b>concat_operator</b></font></p>
<p><font><b>replaceQuote</b></font></p>
<p><font><b>hasLimit</b> support SELECT * FROM TABLE LIMIT 10
of MySQL.</font></p>
<p><font><b>hasTop</b> support Microsoft style SELECT TOP 10
* FROM TABLE.</font></p>
<p><font><b>ADORecordSet Functions to Override</b></font></p>
<p><font>You will need to define a constructor for your ADORecordSet
derived class that calls the parent class constructor.</font></p>
<p><font><b>FetchField: </b> as documented above in ADORecordSet</font></p>
<p><font>_<b>initrs</b>: low level initialization of the recordset:
setup the _<b>numOfRows</b> and _<b>numOfFields</b> fields -- called by the
constructor.</font></p>
<p><font>_<b>seek</b>: seek to a particular row. Do not load
the data into the fields array. This is done by _fetch. Returns true or false.
Note that some implementations such as Interbase do not support seek. Set
canSeek to false.</font></p>
<p><font>_<b>fetch</b>: fetch a row using the database extension
function and then move to the next row. Sets the <b>fields</b> array. If
the parameter $ignore_fields is true then there is no need to populate the <b>fields</b> array,
just move to the next row. then Returns true or false.</font></p>
<p><font>_<b>close</b>: close the recordset</font></p>
<p><font><b>Fields</b>: If the array row returned by the PHP
extension is not an associative one, you will have to override this. See
adodb-odbc.inc.php for an example. For databases such as MySQL and MSSQL
where an associative array is returned, there is no need to override this
function.</font></p>
<p><font><b>ADOConnection Fields to Set</b></font></p>
<p><font>canSeek: Set to true if the _seek function works.</font></p>
<h2><font>Optimizing PHP</font></h2>
For info on tuning PHP, read this article on <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php">Optimizing
PHP</a>. </font></p>
 
<h2><font>Change Log<a name="Changes"></a><a name="changes"></a><a name="changelog"></a></font></h2>
<P>
<p><a name="4.80"></a><b>4.80 8 Mar 2006</b>
<p>Added activerecord support.
<p>Added mysql $conn->compat323 = true if you want MySQL 3.23 compat enabled. Fixes GetOne() Select-Limit problems.
<p>Added adodb-xmlschema03.inc.php to support XML Schema version 3 and updated adodb-datadict.htm docs.
<p><a name="4.72"></a><b>4.72 21 Feb 2006</b>
<p>Added 'new' DSN parameter for NConnect().
<p>Pager now sanitizes $PHP_SELF to protect against XSS. Thx to James Bercegay and others.
<p>ADOConnection::MetaType changed to setup $rs->connection correctly.
<p>New native DB2 driver contributed by Larry Menard, Dan Scott, Andy Staudacher, Bharat Mediratta.
<p>The mssql CreateSequence() did not BEGIN TRANSACTION correctly. Fixed. Thx Sean Lee.
<p>The _adodb_countrecs() function in adodb-lib.inc.php has been revised to handle more ORDER BY variations.
<p><a name="4.71"></a><b>4.71 24 Jan 2006</b>
<p>Fixes postgresql security issue related to binary strings. Thx to Andy Staudacher.
<p>Several DSN bugs found:
<p>1. Fix bugs in DSN connections introduced in 4.70 when underscores are found in the DSN.
<p>2. DSN with _ did not work properly in PHP5 (fine in PHP4). Fixed.
<p>3. Added support for PDO DSN connections in NewADOConnection(), and database parameter in PDO::Connect().
<p>The oci8 datetime flag not correctly implemented in ADORecordSet_array. Fixed.
<p>Added BlobDelete() to postgres, as a counterpoint to UpdateBlobFile().
<p>Fixed GetInsertSQL() to support oci8po.
<p>Fixed qstr() issue with postgresql with \0 in strings.
<p>Fixed some datadict driver loading issues in _adodb_getdriver().
<p>Added register shutdown function session_write_close in adodb-session.inc.php for PHP 5 compat. See http://phplens.com/lens/lensforum/msgs.php?id=14200.
<p><a name="4.70"></a><b>4.70 6 Jan 2006</b>
<p>Many fixes from Danila Ulyanov to ibase, oci8, postgres, mssql, odbc_oracle, odbtp, etc drivers.
<p>Changed usage of binary hint in adodb-session.inc.php for mysql. See
http://phplens.com/lens/lensforum/msgs.php?id=14160
<p>Fixed invalid variable reference problem in undomq(), adodb-perf.inc.php.
<p>Fixed http://phplens.com/lens/lensforum/msgs.php?id=14254 in adodb-perf.inc.php, _DBParameter() settings of fetchmode was wrong.
<p>Fixed security issues in server.php and tmssql.php discussed by Andreas Sandblad in a Secunia security advisory. Added $ACCEPTIP = 127.0.0.1
and changed suggested root password to something more secure.
<p>Changed pager to close recordset after RenderLayout().
<p><a name="4.68"></a><b>4.68 25 Nov 2005</b>
<p>PHP 5 compat for mysqli. MetaForeignKeys repeated twice and MYSQLI_BINARY_FLAG missing.
<p>PHP 5.1 support for postgresql bind parameters using ? did not work if >= 10 parameters. Fixed. Thx to Stanislav Shramko.
<p>Lots of PDO improvements.
<p>Spelling error fixed in mysql MetaForeignKeys, $associative parameter.
<p><a name="4.67"></a><b>4.67 16 Nov 2005</b>
<p>Postgresql not_null flag not set to false correctly. Thx Cristian MARIN.
<p>We now check in Replace() if key is in fieldArray. Thx Sébastien Vanvelthem.
<p>_file_get_contents() function was missing in xmlschema. fixed.
<p>Added week in year support to SQLDate(), using 'W' flag. Thx Spider.
<p>In sqlite metacolumns was repeated twice, causing PHP 5 problems. Fixed.
<p>Made debug output XHTML compliant.
<p><a name="4.66"></a><b>4.66 28 Sept 2005</b>
<p>ExecuteCursor() in oci8 did not clean up properly on failure. Fixed.
<p>Updated xmlschema.dtd, by "Alec Smecher" asmecher#smecher.bc.ca
<p>Hardened SelectLimit, typecasting nrows and offset to integer.
<p>Fixed misc bugs in AutoExecute() and GetInsertSQL().
<p>Added $conn->database as the property holding the database name. The older $conn->databaseName is retained for backward
compat.
<p>Changed _adodb_backtrace() compat check to use function_exists().
<p>Bug in postgresql MetaIndexes fixed. Thx Kevin Jamieson.
<p>Improved OffsetDate for MySQL, reducing rounding error.
<p>Metacolumns added to sqlite. Thx Mark Newnham.
<p>PHP 4.4 compat fixes for GetAssoc().
<p>Added postgresql bind support for php 5.1. Thx Cristiano da Cunha Duarte
<p>OffsetDate() fixes for postgresql, typecasting strings to date or timestamp.
<p>DBTimeStamp formats for mssql, odbc_mssql and postgresql made to conform with other db's.
<p>Changed PDO constants from PDO_ to PDO:: to support latest spec.
<p><a name="4.65"></a><b>4.65 22 July 2005</b>
<p>Reverted 'X' in mssql datadict to 'TEXT' to be compat with mssql driver. However now you can
set $datadict->typeX = 'varchar(4000)' or 'TEXT' or 'CLOB' for mssql and oci8 drivers.
<p>Added charset support when using DSN for Oracle.
<p>_adodb_getmenu did not use fieldcount() to get number of fields. Fixed.
<p>MetaForeignKeys() for mysql/mysqli contributed by Juan Carlos Gonzalez.
<p>MetaDatabases() now correctly returns an array for mysqli driver. Thx Cristian MARIN.
<p>CompleteTrans(false) did not return false. Fixed. Thx to JMF.
<p>AutoExecute() did not work with Oracle. Fixed. Thx José Moreira.
<p>MetaType() added to connection object.
<p>More PHP 4.4 reference return fixes. Thx Ryan C Bonham and others.
 
<p><a name="4.64"></a><b>4.64 20 June 2005</b>
<p>In datadict, if the default field value is set to '', then it is not applied when the field is created. Fixed by Eugenio.
<p>MetaPrimaryKeys for postgres did not work because of true/false change in 4.63. Fixed.
<p>Tested ocifetchstatement in oci8. Rejected at the end.
<p>Added port to dsn handling. Supported in postgres, mysql, mysqli,ldap.
<p>Added 'w' and 'l' to mysqli SQLDate().
<p>Fixed error handling in ldap _connect() to be more consistent. Also added ErrorMsg() handling to ldap.
<p>Added support for union in _adodb_getcount, adodb-lib.inc.php for postgres and oci8.
<p>rs2html() did not work with null dates properly.
<p>PHP 4.4 reference return fixes.
 
<p><a name="4.63"></a><b>4.63 18 May 2005</b>
<p>Added $nrows<0 check to mysqli's SelectLimit().
<p>Added OptimizeTable() and OptimizeTables() in adodb-perf.inc.php. By Markus Staab.
<p>PostgreSQL inconsistencies fixed. true and false set to TRUE and FALSE, and boolean type in datadict-postgres.inc.php set
to 'L' => 'BOOLEAN'. Thx Kevin Jamieson.
<p>New adodb_session_create_table() function in adodb-session.inc.php. By Markus Staab.
<p>Added null check to UserTimeStamp().
<p>Fixed typo in mysqlt driver in adorecordset. Thx to Andy Staudacher.
<p>GenID() had a bug in the raiseErrorFn handling. Fixed. Thx Marcos Pont.
<p>Datadict name quoting now handles ( ) in index fields correctly - they aren't part of the index field.
<p>Performance monitoring: (1) oci8 Ixora checks moved down; (2) expensive sql changed so that only those sql with
count(*)>1 are shown; (3) changed sql1 field to a length+crc32 checksum - this breaks backward compat.
<p>We remap firebird15 to firebird in data dictionary.
 
<p><a name="4.62"></a><b>4.62 2 Apr 2005</b>
<p>Added 'w' (dow as 0-6 or 1-7) and 'l' (dow as string) for SQLDate for oci8, postgres and mysql.
<p>Rolled back MetaType() changes for mysqli done in prev version.
<p>Datadict change by chris, cblin#tennaxia.com data mappings from:
<pre>
oci8: X->varchar(4000) XL->CLOB
mssql: X->XL->TEXT
mysql: X->XL->LONGTEXT
fbird: X->XL->varchar(4000)
</pre>
<p>to:
<pre>
oci8: X->varchar(4000) XL->CLOB
mssql: X->VARCHAR(4000) XL->TEXT
mysql: X->TEXT XL->LONGTEXT
fbird: X->VARCHAR(4000) XL->VARCHAR(32000)
</pre>
<p>Added $connection->disableBlobs to postgresql to improve performance when no bytea is used (2-5% improvement).
<p>Removed all HTTP_* vars.
<p>Added $rs->tableName to be set before calling AutoExecute().
<p>Alex Rootoff rootoff#pisem.net contributed ukrainian language file.
<p>Added new mysql_option() support using $conn->optionFlags array.
<p>Added support for ldap_set_option() using the $LDAP_CONNECT_OPTIONS global variable. Contributed by Josh Eldridge.
<p>Added LDAP_* constant definitions to ldap.
<p>Added support for boolean bind variables. We use $conn->false and $conn->true to hold values to set false/true to.
<p>We now do not close the session connection in adodb-session.inc.php as other objects could be using this connection.
<p>We now strip off \0 at end of Ixora SQL strings in $perf->tohtml() for oci8.
<p><a name="4.61"></a><b>4.61 23 Feb 2005</b>
<p>MySQLi added support for mysqli_connect_errno() and mysqli_connect_error().
<p>Massive improvements to alpha PDO driver.
<p>Quote string bind parameters logged by performance monitor for easy type checking. Thx Jason Judge.
<p>Added support for $role when connecting with Interbase/firebird.
<p>Added support for enum recognition in MetaColumns() mysql and mysqli. Thx Amedeo Petrella.
<p>The sybase_ase driver contributed by Interakt Online. Thx Cristian Marin cristic#interaktonline.com.
<p>Removed not_null, has_default, and default_value from ADOFieldObject.
<p>Sessions code, fixed quoting of keys when handling LOBs in session write() function.
<p>Sessions code, added adodb_session_regenerate_id(), to reduce risk of session hijacking by changing session cookie dynamically. Thx Joe Li.
<p>Perf monitor, polling for CPU did not work for PHP 4.3.10 and 5.0.0-5.0.3 due to PHP bugs, so we special case these versions.
<p>Postgresql, UpdateBlob() added code to handle type==CLOB.
<p><a name="4.60"></a><b>4.60 24 Jan 2005</b>
<p>Implemented PEAR DB's autoExecute(). Simplified design because I don't like using constants when
strings work fine.
<p>_rs2serialize will now update $rs->sql and $rs->oldProvider.
<p>Added autoExecute().
<p>Added support for postgres8 driver. Currently just remapped to postgres7 driver.
<p>Changed oci8 _query(), so that OCIBindByName() sets the length to -1 if element size is > 4000. This provides better support
for LONGs.
<p>Added SetDateLocale() support for netherlands (Nl).
<p>Spelling error in pivot code ($iff should be $iif).
</p><p>mysql insert_id() did not work with mysql 3.x. Fixed.
</p><p>"\r\n" not converted to spaces correctly in exporting data. Fixed.
</p><p>_nconnect() in mysqli did not return value correctly. Fixed.
</p><p>Arne Eckmann contributed danish language file.
</p><p>Added clone() support to FetchObject() for PHP5.<br>
</p>
<p>Removed SQL_CUR_USE_ODBC from odbc_mssql.<br>
</p>
<p><a name="4.55"></a><b>4.55 5 Jan 2005</b>
</p><p>Found bug in Execute() with bind params for db's that do not support binding natively.
</p><p>DropSequence() now correctly uses default parameter.
</p><p>Now Execute() ignores locale for floats, so 1.23 is NEVER converted to 1,23.
</p><p>SetFetchMode() not properly saved in adodb-perf, suspicious sql and expensive sql. Fixed.
</p><p>Added INET to postgresql metatypes. Thx motzel.
</p><p>Allow oracle hints to work when counting with _adodb_getcount in adodb-lib.inc.php. Thx Chris Wrye.
</p><p>Changed mysql insert_id() to use SELECT LAST_INSERT_ID().
</p><p>If alter col in datadict does not modify col type/size of actual
col, then it is removed from alter col code. By Mark Newham. Not
perfect as MetaType() !== ActualType().
</p><p>Added handling of view fields in metacolumns() for postgresql. Thx Renato De Giovanni.
</p><p>Added to informix MetaPrimaryKeys and MetaColumns fixes for null bit. Thx to Cecilio Albero.
</p><p>Removed obsolete connection_timeout() from perf code.
</p><p>Added support for arrayClass in adodb-csv.inc.php.
</p><p>RSFilter now accepts methods of the form $array($obj, 'methodname'). Thx to blake#near-time.com.
</p><p>Changed CacheFlush to $cmd = 'rm -rf '.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/';
</p><p>For better cursor concurrency, added code to free ref cursors in
oci8 when $rs-&gt;Close() is called. Note that CLose() is called
internally by the Get* functions too.
</p><p>Added IIF support for access when pivoting. Thx Volodia Krupach.
</p><p>Added mssql datadict support for timestamp. Thx Alexios.
</p><p>Informix pager fix. By Mario Ramirez.
</p><p>ADODB_TABLE_REGEX now includes ':'. By Mario Ramirez.
</p><p>Mark Newnham contributed MetaIndexes for oci8 and db2.
</p><p><a name="4.54"></a><b>4.54 5 Nov 2004</b>
</p><p>
Now you can set $db-&gt;charSet = ?? before doing a Connect() in oci8.
</p><p>
Added adodbFetchMode to sqlite.
</p><p>
Perf code, added a string typecast to substr in adodb_log_sql().
</p><p>
Postgres: Changed BlobDecode() to use po_loread, added new $maxblobsize parameter, and now it returns the blob instead
of sending it to stdout - make sure to mention that as a compat warning.
Also added $db-&gt;IsOID($oid) function; uses a heuristic, not guaranteed to work 100%.
</p><p>
Contributed arabic language file by "El-Shamaa, Khaled" k.el-shamaa#cgiar.org
</p><p>
PHP5 exceptions did not handle @ protocol properly. Fixed.
</p><p>
Added ifnull handling for postgresql (using coalesce).
</p><p>
Added metatables() support for Postgresql 8.0 (no longer uses pg_% dictionary tables).
</p><p>
Improved Sybase ErrorMsg() function. By Gaetano Giunta.
</p><p>
Improved oci8 SelectLimit() to use Prepare(). By Cristiano Duarte.
</p><p>
Type-cast $row parameter in ifx_fetch_row() to int. Thx stefan bodgan.
</p><p>Ralf becker contributed improvements in postgresql, sapdb, mysql data dictionary handling:<br>
- MySql and Postgres MetaType was reporting every int column which was
part of a primary key and unique as serial<br>
- Postgres was not reporting the scale of decimal types<br>
- MaxDB was padding the defaults of none-string types with spaces<br>
- MySql now correctly converts enum columns to varchar
</p><p>
Ralf also changed Postgresql datadict:<br>
- you cant add NOT NULL columns in postgres in one go, they need to be
added as NULL and then altered to NOT NULL<br>
- AlterColumnSQL could not change a varchar column with numbers into an
integer column, postgres need an explicit conversation<br>
- a re-created sequence was not set to the correct value, if the name
was the old name (no implicit sequence), now always the new name of the
implicit sequence is used<br>
</p><p>Sergio Strampelli added extra $intoken check to Lens_ParseArgs() in datadict code.
</p><p><a name="4.53"></a><b>4.53 28 Sept 2004</b>
</p><p>FetchMode cached in recordset is sometimes mapped to native db fetchMode. Normally this does not matter,
but when using cached recordsets, we need to switch back to using adodb fetchmode. So we cache this
in $rs-&gt;adodbFetchMode if it differs from the db's fetchMode.
</p><p>For informix we now set canSeek = false driver because stefan bodgan tells me that seeking doesn't work.
</p><p>SetDateLocale() never worked till now ;-) Thx david#tomato.it
</p><p>Set $_bindInputArray = true in sapdb driver. Required for clob support.
</p><p>Fixed some PEAR::DB emulation issues with isError() and isWarning. Thx to Gert-Rainer Bitterlich.
</p><p>Empty() used in getupdatesql without strlen() check. Fixed.</p>
<p>Added unsigned detection to mysql and mysqli drivers. Thx to dan cech.
</p><p>Added hungarian language file. Thx to Hal&aacute;szv&aacute;ri G&aacute;bor.
</p><p>Improved fieldname-type formatting of datadict SQL generated (adding $widespacing parameter to _GenField).
</p><p>Datadict oci8 DROP CONSTRAINTS misspelt. Fixed. Thx Mark Newnham.
</p><p>Changed odbtp to dynamically change databaseType based on connection, eg. from 'odbtp' to 'odbtp_mssql' when connecting
to mssql database.
</p><p>In datadict, MySQL I4 was wrongly mapped to MEDIUMINT, which is actually I3. Fixed.
</p><p>Fixed mysqli MetaType() recognition. Mysqli returns numeric types unlike mysql extension. Thx Francesco Riosa.
</p><p>VFP odbc driver curmode set wrongly, causing problems with memo fields. Fixed.
</p><p>Odbc driver did not recognize odbc version 2 driver date types properly. Fixed. Thx Bostjan.
</p><p>ChangeTableSQL() fixes to datadict-db2.inc.php by Mark Newnham.
</p><p>Perf monitoring with odbc improved. Now we try in perf code to manually set the sysTimeStamp using date() if sysTimeStamp
is empty.
</p><p>All ADO errors are thrown as exceptions in PHP5.
So we added exception handling to ado in PHP5 by creating new adodb-ado5.inc.php driver.
</p><p>Added IsConnected(). Returns true if connection object connected. By Luca.Gioppo.
</p><p>"Ralf Becker"
RalfBecker#digitalROCK.de contributed new sapdb data-dictionary driver
and a large patch that implements field and table renaming for oracle,
mssql, postgresql, mysql and sapdb. See the new RenameTableSQL() and
RenameColumnSQL() functions.
</p><p>We now check ExecuteCursor to see if PrepareSP was initially called.
</p><p>Changed oci8 datadict to use MODIFY for $dd-&gt;alterCol. Thx Mark Newnham.
</p><p><a name="4.52"></a><b>4.52 10 Aug 2004</b>
</p><p>Bug found in Replace() when performance logging enabled, introduced in ADOdb 4.50. Fixed.
</p><p>Replace() checks update stmt. If update stmt fails, we now return immediately. Thx to alex.
</p><p>Added support for $ADODB_FORCE_TYPE in GetUpdateSQL/GetInsertSQL. Thx to niko.
</p><p>Added ADODB_ASSOC_CASE support to postgres/postgres7 driver.
</p><p>Support for DECLARE stmt in oci8. Thx Lochbrunner.
</p><p><a name="4.51"></a><b>4.51 29 July 2004</b>
</p><p>Added adodb-xmlschema 1.0.2. Thx dan and richard.
</p><p>Added new adorecordset_ext_* classes. If ADOdb extension installed for mysql, mysqlt and oci8
(but not oci8po), we use the superfast ADOdb extension code for movenext.
</p><p>Added schema support to mssql and odbc_mssql MetaPrimaryKeys().
</p><p>Patched MSSQL driver to support PHP NULL and Boolean values
while binding the input array parameters in the _query() function. By Stephen Farmer.
</p><p>Added support for clob's for mssql, UpdateBlob(). Thx to gfran#directa.com.br
</p><p>Added normalize support for postgresql (true=lowercase table name, or false=case-sensitive table names)
to MetaColumns($table, $normalize=true).
</p><p>PHP5 variant dates in ADO not working. Fixed in adodb-ado.inc.php.
</p><p>Constant ADODB_FORCE_NULLS was not working properly for many releases (for GetUpdateSQL). Fixed.
Also GetUpdateSQL strips off ORDER BY now - thx Elieser Le&atilde;o.
</p><p>Perf Monitor for oci8 now dynamically highlights optimizer_* params if too high/low.
</p><p>Added dsn support to NewADOConnection/ADONewConnection.
</p><p>Fixed out of page bounds bug in _adodb_pageexecute_all_rows() Thx to "Sergio Strampelli" sergio#rir.it
</p><p>Speedup of movenext for mysql and oci8 drivers.
</p><p>Moved debugging code _adodb_debug_execute() to adodb-lib.inc.php.
</p><p>Fixed postgresql bytea detection bug. See http://phplens.com/lens/lensforum/msgs.php?id=9849.
</p><p>Fixed ibase datetimestamp typo in PHP5. Thx stefan.
</p><p>Removed whitespace at end of odbtp drivers.
</p><p>Added db2 metaprimarykeys fix.
</p><p>Optimizations to MoveNext() for mysql and oci8. Misc speedups to Get* functions.
</p><p><a name="4.50"></a><b>4.50 6 July 2004</b>
</p><p>Bumped it to 4.50 to avoid confusion with PHP 4.3.x series.
</p><p>Added db2 metatables and metacolumns extensions.
</p><p>Added alpha PDO driver. Very buggy, only works with odbc.
</p><p>Tested mysqli. Set poorAffectedRows = true. Cleaned up movenext() and _fetch().
</p><p>PageExecute does not work properly with php5 (return val not a variable). Reported Dmytro Sychevsky sych#php.com.ua. Fixed.
</p><p>MetaTables() for mysql, $showschema parameter was not backward compatible with older versions of adodb. Fixed.
</p><p>Changed mysql GetOne() to work with mysql 3.23 when using with non-select stmts (e.g. SHOW TABLES).
</p><p>Changed TRIG_ prefix to a variable in datadict-oci8.inc.php. Thx to Luca.Gioppo#csi.it.
</p><p>New to adodb-time code. We allow you to define your own daylights savings function,
adodb_daylight_sv for pre-1970 dates. If the function is defined
(somewhere in an include), then you can correct
for daylights savings. See http://phplens.com/phpeverywhere/node/view/16#daylightsavings
for more info.
</p><p>New sqlitepo driver. This is because assoc mode does not work like other drivers in sqlite.
Namely, when selecting (joining) multiple tables, in assoc mode the table
names are included in the assoc keys in the "sqlite" driver.
In "sqlitepo" driver, the table names are stripped from the returned column names.
When this results in a conflict, the first field get preference.
Contributed by Herman Kuiper herman#ozuzo.net
</p><p>Added $forcenull parameter to GetInsertSQL/GetUpdateSQL. Idea by Marco Aurelio Silva.
</p><p>More XHTML changes for GetMenu. By Jeremy Evans.
</p><p>Fixes some ibase date issues. Thx to stefan bogdan.
</p><p>Improvements to mysqli driver to support $ADODB_COUNTRECS.
</p><p>Fixed adodb-csvlib.inc.php problem when reading stream from socket. We need to poll stream continiously.
</p><p><a name="4.23"></a><b>4.23 16 June 2004</b>
</p><p>
New interbase/firebird fixes thx to Lester Caine.
Driver fixes a problem with getting field names in the result array, and
corrects a couple of data conversions. Also we default to dialect3 for firebird.
Also ibase sysDate property was wrong. Changed to cast as timestamp.
</p><p>
The datadict driver is set up to give quoted tables and fields as this
was the only way round reserved words being used as field names in
TikiWiki. TikiPro is tidying that up, and I hope to be able to produce a
build of THAT which uses what I consider proper UPPERCASE field and
table names. The conversion of TikiWiki to ADOdb helped in that, but
until the database is completely tidied up in TikiPro ...
</p><p>Modified _gencachename() to include fetchmode in name hash.
This means you should clear your cache directory after installing this release as the
cache name algorithm has changed.
</p><p>Now Cache* functions work in safe
mode, because we do not create sub-directories in the $ADODB_CACHE_DIR
in safe mode. In non-safe mode we still create sub-directories. Done by
modifying _gencachename().
</p><p>Added $gmt parameter (true/false)
to UserDate and UserTimeStamp in connection class, to force conversion
of input (in local time) to be converted to UTC/GMT.
</p><p>Mssql datadict did not support INT types properly (no size param allowed).
Added _GetSize() to datadict-mssql.inc.php.
</p><p>For borland_ibase, BeginTrans(), changed:<br>
</p><pre> $this-&gt;_transactionID = $this-&gt;_connectionID;</pre>
to<br>
<pre> $this-&gt;_transactionID = ibase_trans($this-&gt;ibasetrans, $this-&gt;_connectionID);</pre>
<p>Fixed typo in mysqi_field_seek(). Thx to Sh4dow (sh4dow#php.pl).
</p><p>LogSQL did not work with Firebird/Interbase. Fixed.
</p><p>Postgres: made errorno() handling more consistent. Thx to Michael Jahn, Michael.Jahn#mailbox.tu-dresden.de.
</p><p>Added informix patch to better support metatables, metacolumns by "Cecilio Albero" c-albero#eos-i.com
</p><p>Cyril Malevanov contributed patch to oci8 to support passing of LOB parameters:
</p><pre> $text = 'test test test';<br> $sql = "declare rs clob; begin :rs := lobinout(:sa0); end;";<br> $stmt = $conn -&gt; PrepareSP($sql);<br> $conn -&gt; InParameter($stmt,$text,'sa0', -1, OCI_B_CLOB);<br> $rs = '';<br> $conn -&gt; OutParameter($stmt,$rs,'rs', -1, OCI_B_CLOB);<br> $conn -&gt; Execute($stmt);<br> echo "return = ".$rs."&lt;br&gt;";<br></pre>
As he says, the LOBs limitations are:
<pre> - use OCINewDescriptor before binding<br> - if Param is IN, uses save() before each execute. This is done automatically for you.<br> - if Param is OUT, uses load() after each execute. This is done automatically for you.<br> - when we bind $var as LOB, we create new descriptor and return it as a<br> Bind Result, so if we want to use OUT parameters, we have to store<br> somewhere &amp;$var to load() data from LOB to it.<br> - IN OUT params are not working now (should not be a big problem to fix it)<br> - now mass binding not working too (I've wrote about it before)<br></pre>
<p>Simplified Connect() and PConnect() error handling.
</p><p>When extension not loaded, Connect() and PConnect() will return null. On connect error, the fns will return false.
</p><p>CacheGetArray() added to code.
</p><p>Added Init() to adorecordset_empty().
</p><p>Changed postgres64 driver, MetaColumns() to not strip off quotes in default value if :: detected (type-casting of default).
</p><p>Added test: if (!defined('ADODB_DIR')) die(). Useful to prevent hackers from detecting file paths.
</p><p>Changed metaTablesSQL to ignore Postgres 7.4 information schemas (sql_*).
</p><p>New polish language file by Grzegorz Pacan
</p><p>Added support for UNION in _adodb_getcount().
</p><p>Added security check for ADODB_DIR to limit path disclosure issues. Requested by postnuke team.
</p><p>Added better error message support to oracle driver. Thx to Gaetano Giunta.
</p><p>Added showSchema support to mysql.
</p><p>Bind in oci8 did not handle $name=false properly. Fixed.
</p><p>If extension not loaded, Connect(), PConnect(), NConnect() will return null.
</p><p><b>4.22 15 Apr 2004</b>
</p><p>Moved docs to own adodb/docs folder.
</p><p>Fixed session bug when quoting compressed/encrypted data in Replace().
</p><p>Netezza Driver and LDAP drivers contributed by Josh Eldridge.
</p><p>GetMenu now uses rtrim() on values instead of trim().
</p><p>Changed MetaColumnNames to return an associative array, keys being the field names in uppercase.
</p><p>Suggested fix to adodb-ado.inc.php affected_rows to support PHP5 variants. Thx to Alexios Fakos.
</p><p>Contributed bulgarian language file by Valentin Sheiretsky valio#valio.eu.org.
</p><p>Contributed romanian language file by stefan bogdan.
</p><p>GetInsertSQL now checks for table name (string) in $rs, and will create a recordset for that
table automatically. Contributed by Walt Boring. Also added OCI_B_BLOB in bind on Walt's request - hope
it doesn't break anything :-)
</p><p>Some minor postgres speedups in _initrs().
</p><p> ChangeTableSQL checks now if MetaColumns returns empty. Thx Jason Judge.
</p><p>Added ADOConnection::Time(), returns current database time in unix timestamp format, or false.
</p><p><b>4.21 20 Mar 2004</b>
</p><p>We no longer in SelectLimit for VFP driver add SELECT TOP X unless an ORDER BY exists.
</p><p>Pim Koeman contributed dutch language file adodb-nl.inc.php.
</p><p>Rick Hickerson added CLOB support to db2 datadict.
</p><p>Added odbtp driver. Thx to "stefan bogdan" sbogdan#rsb.ro.
</p><p>Changed PrepareSP() 2nd parameter, $cursor, to default to true (formerly false). Fixes oci8 backward
compat problems with OUT params.
</p><p>Fixed month calculation error in adodb-time.inc.php. 2102-June-01 appeared as 2102-May-32.
</p><p>Updated PHP5 RC1 iterator support. API changed, hasMore() renamed to valid().
</p><p>Changed internal format of serialized cache recordsets. As we store a version number, this should be
backward compatible.
</p><p>Error handling when driver file not found was flawed in ADOLoadCode(). Fixed.
</p><p><b>4.20 27 Feb 2004</b>
</p><p>Updated to AXMLS 1.01.
</p><p>MetaForeignKeys for postgres7 modified by Edward Jaramilla, works on pg 7.4.
</p><p>Now numbers accepts function calls or sequences for GetInsertSQL/GetUpdateSQL numeric fields.
</p><p>Changed quotes of 'delete from $perf_table' to "". Thx Kehui (webmaster#kehui.net)
</p><p>Added ServerInfo() for ifx, and putenv trim fix. Thx Fernando Ortiz.
</p><p>Added addq(), which is analogous to addslashes().
</p><p>Tested with php5b4. Fix some php5 compat problems with exceptions and sybase.
</p><p>Carl-Christian Salvesen added patch to mssql _query to support binds greater than 4000 chars.
</p><p>Mike suggested patch to PHP5 exception handler. $errno must be numeric.
</p><p>Added double quotes (") to ADODB_TABLE_REGEX.
</p><p>For oci8, Prepare(...,$cursor),
$cursor's meaning was accidentally inverted in 4.11. This causes
problems with ExecuteCursor() too, which calls Prepare() internally.
Thx to William Lovaton.
</p><p>Now dateHasTime property in connection object renamed to datetime for consistency. This could break bc.
</p><p>Csongor Halmai reports that db2 SelectLimit with input array is not working. Fixed..
</p><p><b>4.11 27 Jan 2004</b>
</p><p>Csongor Halmai reports db2 binding not working. Reverted back to emulated binding.
</p><p>Dan Cech modifies datadict code. Adds support for DropIndex. Minor cleanups.
</p><p>Table misspelt in perf-oci8.inc.php. Changed v$conn_cache_advice to v$db_cache_advice. Reported by Steve W.
</p><p>UserTimeStamp and DBTimeStamp did not handle YYYYMMDDHHMMSS format properly. Reported by Mike Muir. Fixed.
</p><p>Changed oci8 Prepare(). Does not auto-allocate OCINewCursor automatically, unless 2nd param is set to true.
This will break backward compat, if Prepare/Execute is used instead of ExecuteCursor. Reported by Chris Jones.
</p><p>Added InParameter() and OutParameter(). Wrapper functions to Parameter(), but nicer because they
are self-documenting.
</p><p>Added 'R' handling in ActualType() to datadict-mysql.inc.php
</p><p>Added ADOConnection::SerializableRS($rs). Returns a recordset that can be serialized in a session.
</p><p>Added "Run SQL" to performance UI().
</p><p>Misc spelling corrections in adodb-mysqli.inc.php, adodb-oci8.inc.php and datadict-oci8.inc.php, from Heinz Hombergs.
</p><p>MetaIndexes() for ibase contributed by Heinz Hombergs.
</p><p><b>4.10 12 Jan 2004</b>
</p><p>Dan Cech contributed extensive changes to data dictionary to support name quoting (with `), and drop table/index.
</p><p>Informix added cursorType property. Default remains IFX_SCROLL, but you can change to 0 (non-scrollable cursor) for performance.
</p><p>Added ADODB_View_PrimaryKeys() for returning view primary keys to MetaPrimaryKeys().
</p><p>Simplified chinese file, adodb-cn.inc.php from cysoft.
</p><p>Added check for ctype_alnum in adodb-datadict.inc.php. Thx to Jason Judge.
</p><p>Added connection parameter to ibase Prepare(). Fix by Daniel Hassan.
</p><p>Added nameQuote for quoting identifiers and names to connection obj. Requested by Jason Judge. Also the
data dictionary parser now detects `field name` and generates column names with spaces correctly.
</p><p>BOOL type not recognised correctly as L. Fixed.
</p><p>Fixed paths in ADODB_DIR for session files, and back-ported it to 4.05 (15 Dec 2003)
</p><p>Added Schema to postgresql MetaTables. Thx to col#gear.hu
</p><p>Empty postgresql recordsets that had blob fields did not set EOF properly. Fixed.
</p><p>CacheSelectLimit internal parameters to SelectLimit were wrong. Thx to Nio.
</p><p>Modified adodb_pr() and adodb_backtrace() to support command-line usage (eg. no html).
</p><p>Fixed some fr and it lang errors. Thx to Gaetano G.
</p><p>Added contrib directory, with adodb rs to xmlrpc convertor by Gaetano G.
</p><p>Fixed array recordset bugs when _skiprow1 is true. Thx to Gaetano G.
</p><p>Fixed pivot table code when count is false.
</p><p>
 
</p><p><b>4.05 13 Dec 2003 </b>
</p><p>Added MetaIndexes to data-dict code - thx to Dan Cech.
</p><p>Rewritten session code by Ross Smith. Moved code to adodb/session directory.
</p><p>Added function exists check on connecting to most drivers, so we don't crash with the unknown function error.
</p><p>Smart Transactions failed with GenID() when it no seq table has been created because the sql
statement fails. Fix by Mark Newnham.
</p><p>Added $db-&gt;length, which holds name of function that returns strlen.
</p><p>Fixed error handling for bad driver in ADONewConnection - passed too few params to error-handler.
</p><p>Datadict did not handle types like 16.0 properly in _GetSize. Fixed.
</p><p>Oci8 driver SelectLimit() bug &amp;= instead of =&amp; used. Thx to Swen Th&uuml;mmler.
</p><p>Jesse Mullan suggested not flushing outp when output buffering enabled. Due to Apache 2.0 bug. Added.
</p><p>MetaTables/MetaColumns return ref bug with PHP5 fixed in adodb-datadict.inc.php.
</p><p>New mysqli driver contributed by Arjen de Rijke. Based on adodb 3.40 driver.
Then jlim added BeginTrans, CommitTrans, RollbackTrans, IfNull, SQLDate. Also fixed return ref bug.
</p><p>$ADODB_FLUSH added, if true then force flush in debugging outp. Default is false. In earlier
versions, outp defaulted to flush, which is not compat with apache 2.0.
</p><p>Mysql driver's GenID() function did not work when when sql logging is on. Fixed.
</p><p>$ADODB_SESSION_TBL not declared as global var. Not available if adodb-session.inc.php included in function. Fixed.
</p><p>The input array not passed to Execute() in _adodb_getcount(). Fixed.
</p><p><b>4.04 13 Nov 2003 </b>
</p><p>Switched back to foreach - faster than list-each.
</p><p>Fixed bug in ado driver - wiping out $this-&gt;fields with date fields.
</p><p>Performance Monitor, View SQL, Explain Plan did not work if strlen($SQL)&gt;max($_GET length). Fixed.
</p><p>Performance monitor, oci8 driver added memory sort ratio.
</p><p>Added random property, returns SQL to generate a floating point number between 0 and 1;
</p><p><b>4.03 6 Nov 2003 </b>
</p><p>The path to adodb-php4.inc.php and adodb-iterators.inc.php was not setup properly.
</p><p>Patched SQLDate in interbase to support hours/mins/secs. Thx to ari kuorikoski.
</p><p>Force autorollback for pgsql persistent connections -
apparently pgsql did not autorollback properly before 4.3.4. See http://bugs.php.net/bug.php?id=25404
</p><p><b>4.02 5 Nov 2003 </b>
</p><p>Some errors in adodb_error_pg() fixed. Thx to Styve.
</p><p>Spurious Insert_ID() error was generated by LogSQL(). Fixed.
</p><p>Insert_ID was interfering with Affected_Rows() and Replace() when LogSQL() enabled. Fixed.
</p><p>More foreach loops optimized with list/each.
</p><p>Null dates not handled properly in ADO driver (it becomes 31 Dec 1969!).
</p><p>Heinz Hombergs contributed patches for mysql MetaColumns - adding scale, made
interbase MetaColumns work with firebird/interbase, and added lang/adodb-de.inc.php.
</p><p>Added INFORMIXSERVER environment variable.
</p><p>Added $ADODB_ANSI_PADDING_OFF for interbase/firebird.
</p><p>PHP 5 beta 2 compat check. Foreach (Iterator) support. Exceptions support.
</p><p><b>4.01 23 Oct 2003 </b>
</p><p>Fixed bug in rs2html(), tohtml.inc.php, that generated blank table cells.
</p><p>Fixed insert_id() incorrectly generated when logsql() enabled.
</p><p>Modified PostgreSQL _fixblobs to use list/each instead of foreach.
</p><p>Informix ErrorNo() implemented correctly.
</p><p>Modified several places to use list/each, including GetRowAssoc().
</p><p>Added UserTimeStamp() to connection class.
</p><p>Added $ADODB_ANSI_PADDING_OFF for oci8po.
</p><p><b>4.00 20 Oct 2003 </b>
</p><p>Upgraded adodb-xmlschema to 1 Oct 2003 snapshot.
</p><p>Fix to rs2html warning message. Thx to Filo.
</p><p>Fix for odbc_mssql/mssql SQLDate(), hours was wrong.
</p><p>Added MetaColumns and MetaPrimaryKeys for sybase. Thx to Chris Phillipson.
</p><p>Added autoquoting to datadict for MySQL and PostgreSQL. Suggestion by Karsten Dambekalns
</p><p><b>3.94 11 Oct 2003 </b>
</p><p>Create trigger in datadict-oci8.inc.php did not work, because all cr/lf's must be removed.
</p><p>ErrorMsg()/ErrorNo() did not work for many databases when logging enabled. Fixed.
</p><p>Removed global variable $ADODB_LOGSQL as it does not work properly with multiple connections.
</p><p>Added SQLDate support for sybase. Thx to Chris Phillipson
</p><p>Postgresql checking of pgsql resultset resource was incorrect. Fix by Bharat Mediratta bharat#menalto.com.
Same patch applied to _insertid and _affectedrows for adodb-postgres64.inc.php.
</p><p>Added support for NConnect for postgresql.
</p><p>Added Sybase data dict support. Thx to Chris Phillipson
</p><p>Extensive improvements in $perf-&gt;UI(), eg. Explain now opens in new window, we show scripts
which call sql, etc.
</p><p>Perf Monitor UI works with magic quotes enabled.
</p><p>rsPrefix was declared twice. Removed.
</p><p>Oci8 stored procedure support, eg. "begin func(); end;" was incorrect in _query. Fixed.
</p><p>Tiraboschi Massimiliano contributed italian language file.
</p><p>Fernando Ortiz, fortiz#lacorona.com.mx, contributed informix performance monitor.
</p><p>Added _varchar (varchar arrays) support for postgresql. Reported by PREVOT St&eacute;phane.<hr />
<p><strong>0.10 Sept 9 2000</strong> First release
</p><h3><strong>Old change log history moved to <a href="old-changelog.htm">old-changelog.htm</a>.
</strong></h3>
<p>&nbsp;</p>
<p>
</p></body></html>
/web/kaklik's_web/torrentflux/adodb/docs/docs-datadict.htm
0,0 → 1,309
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ADOdb Data Dictionary Manual</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<style type="text/css">
body, td {
/*font-family: Arial, Helvetica, sans-serif;*/
font-size: 11pt;
}
pre {
font-size: 9pt;
background-color: #EEEEEE; padding: .5em; margin: 0px;
}
.toplink {
font-size: 8pt;
}
</style>
</head>
<body style="background-color: rgb(255, 255, 255);">
<h2>ADOdb Data Dictionary Library for PHP</h2>
<p>V4.80 8 Mar 2006 (c) 2000-2006 John Lim (<a
href="mailto:jlim#natsoft.com.my">jlim#natsoft.com.my</a>).<br>
AXMLS (c) 2004 ars Cognita, Inc</p>
<p><font size="1">This software is dual licensed using BSD-Style and
LGPL. This means you can use it in compiled proprietary and commercial
products.</font></p>
 
<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a>
&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a>
</p>
<p>This documentation describes a PHP class library to automate the
creation of tables, indexes and foreign key constraints portably for
multiple databases. Richard Tango-Lowy and Dan Cech have been kind
enough to contribute <a href="#xmlschema">AXMLS</a>, an XML schema
system for defining databases. You can contact them at
dcech#phpwerx.net and richtl#arscognita.com.</p>
<p>Currently the following databases are supported:</p>
<p> <b>Well-tested:</b> PostgreSQL, MySQL, Oracle, MSSQL.<br>
<b>Beta-quality:</b> DB2, Informix, Sybase, Interbase, Firebird.<br>
<b>Alpha-quality:</b> MS Access (does not support DEFAULT values) and
generic ODBC.
</p>
<h3>Example Usage</h3>
<pre> include_once('adodb.inc.php');<br> <font color="#006600"># First create a normal connection</font><br> $db = NewADOConnection('mysql');<br> $db-&gt;Connect(...);<br><br> <font
color="#006600"># Then create a data dictionary object, using this connection</font><br> $dict = <strong>NewDataDictionary</strong>($db);<br><br> <font
color="#006600"># We have a portable declarative data dictionary format in ADOdb, similar to SQL.<br> # Field types use 1 character codes, and fields are separated by commas.<br> # The following example creates three fields: "col1", "col2" and "col3":</font><br> $flds = " <br> <font
color="#663300"><strong> col1 C(32) NOTNULL DEFAULT 'abc',<br> col2 I DEFAULT 0,<br> col3 N(12.2)</strong></font><br> ";<br><br> <font
color="#006600"># We demonstrate creating tables and indexes</font><br> $sqlarray = $dict-&gt;<strong>CreateTableSQL</strong>($tabname, $flds, $taboptarray);<br> $dict-&gt;<strong>ExecuteSQLArray</strong>($sqlarray);<br><br> $idxflds = 'co11, col2';<br> $sqlarray = $dict-&gt;<strong>CreateIndexSQL</strong>($idxname, $tabname, $idxflds);<br> $dict-&gt;<strong>ExecuteSQLArray</strong>($sqlarray);<br></pre>
<h3>Class Factory</h3>
<h4>NewDataDictionary($connection, $drivername=false)</h4>
<p>Creates a new data dictionary object. You pass a database connection object in $connection. The $connection does not have to be actually connected to the database. Some database connection objects are generic (eg. odbtp and odbc). Since 4.53, you can tell ADOdb the actual database with $drivername. E.g.</p>
<pre>
$db =& NewADOConnection('odbtp');
$datadict = NewDataDictionary($db, 'mssql'); # force mssql
</pre>
<h3>Class Functions</h3>
<h4>function CreateDatabase($dbname, $optionsarray=false)</h4>
<p>Create a database with the name $dbname;</p>
<h4>function CreateTableSQL($tabname, $fldarray, $taboptarray=false)</h4>
<pre> RETURNS: an array of strings, the sql to be executed, or false<br> $tabname: name of table<br> $fldarray: string (or array) containing field info<br> $taboptarray: array containing table options<br></pre>
<p>The new format of $fldarray uses a free text format, where each
field is comma-delimited.
The first token for each field is the field name, followed by the type
and optional
field size. Then optional keywords in $otheroptions:</p>
<pre> "$fieldname $type $colsize $otheroptions"</pre>
<p>The older (and still supported) format of $fldarray is a
2-dimensional array, where each row in the 1st dimension represents one
field. Each row has this format:</p>
<pre> array($fieldname, $type, [,$colsize] [,$otheroptions]*)</pre>
<p>The first 2 fields must be the field name and the field type. The
field type can be a portable type codes or the actual type for that
database.</p>
<p>Legal portable type codes include:</p>
<pre> C: Varchar, capped to 255 characters.<br> X: Larger varchar, capped to 4000 characters (to be compatible with Oracle). <br> XL: For Oracle, returns CLOB, otherwise the largest varchar size.<br><br> C2: Multibyte varchar<br> X2: Multibyte varchar (largest size)<br><br> B: BLOB (binary large object)<br><br> D: Date (some databases do not support this, and we return a datetime type)<br> T: Datetime or Timestamp<br> L: Integer field suitable for storing booleans (0 or 1)<br> I: Integer (mapped to I4)<br> I1: 1-byte integer<br> I2: 2-byte integer<br> I4: 4-byte integer<br> I8: 8-byte integer<br> F: Floating point number<br> N: Numeric or decimal number<br></pre>
<p>The $colsize field represents the size of the field. If a decimal
number is used, then it is assumed that the number following the dot is
the precision, so 6.2 means a number of size 6 digits and 2 decimal
places. It is recommended that the default for number types be
represented as a string to avoid any rounding errors.</p>
<p>The $otheroptions include the following keywords (case-insensitive):</p>
<pre> AUTO For autoincrement number. Emulated with triggers if not available.<br> Sets NOTNULL also.<br> AUTOINCREMENT Same as auto.<br> KEY Primary key field. Sets NOTNULL also. Compound keys are supported.<br> PRIMARY Same as KEY.<br> DEF Synonym for DEFAULT for lazy typists.<br> DEFAULT The default value. Character strings are auto-quoted unless<br> the string begins and ends with spaces, eg ' SYSDATE '.<br> NOTNULL If field is not null.<br> DEFDATE Set default value to call function to get today's date.<br> DEFTIMESTAMP Set default to call function to get today's datetime.<br> NOQUOTE Prevents autoquoting of default string values.<br> CONSTRAINTS Additional constraints defined at the end of the field<br> definition.<br></pre>
<p>The Data Dictonary accepts two formats, the older array
specification:</p>
<pre> $flds = array(<br> array('COLNAME', 'DECIMAL', '8.4', 'DEFAULT' =&gt; 0, 'NOTNULL'),<br> array('id', 'I' , 'AUTO'),<br> array('`MY DATE`', 'D' , 'DEFDATE'),<br> array('NAME', 'C' , '32', 'CONSTRAINTS' =&gt; 'FOREIGN KEY REFERENCES reftable')<br> );<br></pre>
<p>Or the simpler declarative format:</p>
<pre> $flds = "<font color="#660000"><strong><br> COLNAME DECIMAL(8.4) DEFAULT 0 NOTNULL,<br> id I AUTO,<br> `MY DATE` D DEFDATE,<br> NAME C(32) CONSTRAINTS 'FOREIGN KEY REFERENCES reftable'</strong></font><br> ";<br></pre>
<p>Note that if you have special characters in the field name (e.g. My
Date), you should enclose it in back-quotes. Normally field names are
not case-sensitive, but if you enclose it in back-quotes, some
databases will treat the names as case-sensitive (eg. Oracle) , and
others won't. So be careful.</p>
<p>The $taboptarray is the 3rd parameter of the CreateTableSQL
function. This contains table specific settings. Legal keywords include:</p>
<ul>
<li><b>REPLACE</b><br>
Indicates that the previous table definition should be removed
(dropped)together with ALL data. See first example below. </li>
<li><b>DROP</b><br>
Drop table. Useful for removing unused tables. </li>
<li><b>CONSTRAINTS</b><br>
Define this as the key, with the constraint as the value. See the
postgresql <a href="#foreignkey">example</a> below. Additional constraints defined for the whole
table. You will probably need to prefix this with a comma. </li>
</ul>
<p>Database specific table options can be defined also using the name
of the database type as the array key. In the following example, <em>create
the table as ISAM with MySQL, and store the table in the "users"
tablespace if using Oracle</em>. And because we specified REPLACE, drop
the table first.</p>
<pre> $taboptarray = array('mysql' =&gt; 'TYPE=ISAM', 'oci8' =&gt; 'tablespace users', 'REPLACE');</pre>
<p><a name=foreignkey></a>You can also define foreign key constraints. The following is syntax
for postgresql:
</p>
<pre> $taboptarray = array('constraints' =&gt; ', FOREIGN KEY (col1) REFERENCES reftable (refcol)');</pre>
<h4>function DropTableSQL($tabname)</h4>
<p>Returns the SQL to drop the specified table.</p>
<h4>function ChangeTableSQL($tabname, $flds)</h4>
<p>Checks to see if table exists, if table does not exist, behaves like
CreateTableSQL. If table exists, generates appropriate ALTER TABLE
MODIFY COLUMN commands if field already exists, or ALTER TABLE ADD
$column if field does not exist.</p>
<p>The class must be connected to the database for ChangeTableSQL to
detect the existence of the table. Idea and code contributed by Florian
Buzin.</p>
<h4>function RenameTableSQL($tabname,$newname)</h4>
<p>Rename a table. Returns the an array of strings, which is the SQL required to rename a table. Since ADOdb 4.53. Contributed by Ralf Becker.</p>
<h4> function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='')</h4>
<p>Rename a table field. Returns the an array of strings, which is the SQL required to rename a column. The optional $flds is a complete column-defintion-string like for AddColumnSQL, only used by mysql at the moment. Since ADOdb 4.53. Contributed by Ralf Becker.</p>
<h4>function CreateIndexSQL($idxname, $tabname, $flds,
$idxoptarray=false)</h4>
<pre> RETURNS: an array of strings, the sql to be executed, or false<br> $idxname: name of index<br> $tabname: name of table<br> $flds: list of fields as a comma delimited string or an array of strings<br> $idxoptarray: array of index creation options<br></pre>
<p>$idxoptarray is similar to $taboptarray in that index specific
information can be embedded in the array. Other options include:</p>
<pre> CLUSTERED Create clustered index (only mssql)<br> BITMAP Create bitmap index (only oci8)<br> UNIQUE Make unique index<br> FULLTEXT Make fulltext index (only mysql)<br> HASH Create hash index (only postgres)<br> DROP Drop legacy index<br></pre>
<h4>function DropIndexSQL ($idxname, $tabname = NULL)</h4>
<p>Returns the SQL to drop the specified index.</p>
<h4>function AddColumnSQL($tabname, $flds)</h4>
<p>Add one or more columns. Not guaranteed to work under all situations.</p>
<h4>function AlterColumnSQL($tabname, $flds)</h4>
<p>Warning, not all databases support this feature.</p>
<h4>function DropColumnSQL($tabname, $flds)</h4>
<p>Drop 1 or more columns.</p>
<h4>function SetSchema($schema)</h4>
<p>Set the schema.</p>
<h4>function &amp;MetaTables()</h4>
<h4>function &amp;MetaColumns($tab, $upper=true, $schema=false)</h4>
<h4>function &amp;MetaPrimaryKeys($tab,$owner=false,$intkey=false)</h4>
<h4>function &amp;MetaIndexes($table, $primary = false, $owner = false)</h4>
<p>These functions are wrappers for the corresponding functions in the
connection object. However, the table names will be autoquoted by the
TableName function (see below) before being passed to the connection
object.</p>
<h4>function NameQuote($name = NULL)</h4>
<p>If the provided name is quoted with backquotes (`) or contains
special characters, returns the name quoted with the appropriate quote
character, otherwise the name is returned unchanged.</p>
<h4>function TableName($name)</h4>
<p>The same as NameQuote, but will prepend the current schema if
specified</p>
<h4>function MetaType($t,$len=-1,$fieldobj=false)</h4>
<h4>function ActualType($meta)</h4>
<p>Convert between database-independent 'Meta' and database-specific
'Actual' type codes.</p>
<h4>function ExecuteSQLArray($sqlarray, $contOnError = true)</h4>
<pre> RETURNS: 0 if failed, 1 if executed all but with errors, 2 if executed successfully<br> $sqlarray: an array of strings with sql code (no semicolon at the end of string)<br> $contOnError: if true, then continue executing even if error occurs<br></pre>
<p>Executes an array of SQL strings returned by CreateTableSQL or
CreateIndexSQL.</p>
<hr />
<a name="xmlschema"></a>
<h2>ADOdb XML Schema (AXMLS)</h2>
<p>This is a class contributed by Richard Tango-Lowy and Dan Cech that
allows the user to quickly
and easily build a database using the excellent ADODB database library
and a simple XML formatted file.
You can <a href="http://sourceforge.net/projects/adodb-xmlschema/">download
the latest version of AXMLS here</a>.</p>
<h3>Quick Start</h3>
<p>Adodb-xmlschema, or AXMLS, is a set of classes that allow the user
to quickly and easily build or upgrade a database on almost any RDBMS
using the excellent ADOdb database library and a simple XML formatted
schema file. Our goal is to give developers a tool that's simple to
use, but that will allow them to create a single file that can build,
upgrade, and manipulate databases on most RDBMS platforms.</p>
<span style="font-weight: bold;"> Installing axmls</span>
<p>The easiest way to install AXMLS to download and install any recent
version of the ADOdb database abstraction library. To install AXMLS
manually, simply copy the adodb-xmlschema.inc.php file and the xsl
directory into your adodb directory.</p>
<span style="font-weight: bold;"> Using AXMLS in Your Application</span>
<p>There are two steps involved in using AXMLS in your application:
first, you must create a schema, or XML representation of your
database, and second, you must create the PHP code that will parse and
execute the schema.</p>
<p>Let's begin with a schema that describes a typical, if simplistic
user management table for an application.</p>
<pre class="listing"><pre>&lt;?xml version="1.0"?&gt;<br>&lt;schema version="0.2"&gt;<br><br> &lt;table name="users"&gt;<br> &lt;desc&gt;A typical users table for our application.&lt;/desc&gt;<br> &lt;field name="userId" type="I"&gt;<br> &lt;descr&gt;A unique ID assigned to each user.&lt;/descr&gt;<br><br> &lt;KEY/&gt;<br> &lt;AUTOINCREMENT/&gt;<br> &lt;/field&gt;<br> <br> &lt;field name="userName" type="C" size="16"&gt;&lt;NOTNULL/&gt;&lt;/field&gt;<br><br> <br> &lt;index name="userName"&gt;<br> &lt;descr&gt;Put a unique index on the user name&lt;/descr&gt;<br> &lt;col&gt;userName&lt;/col&gt;<br> &lt;UNIQUE/&gt;<br><br> &lt;/index&gt;<br> &lt;/table&gt;<br> <br> &lt;sql&gt;<br> &lt;descr&gt;Insert some data into the users table.&lt;/descr&gt;<br> &lt;query&gt;insert into users (userName) values ( 'admin' )&lt;/query&gt;<br><br> &lt;query&gt;insert into users (userName) values ( 'Joe' )&lt;/query&gt;<br> &lt;/sql&gt;<br>&lt;/schema&gt; <br></pre></pre>
<p>Let's take a detailed look at this schema.</p>
<p>The opening &lt;?xml version="1.0"?&gt; tag is required by XML. The
&lt;schema&gt; tag tells the parser that the enclosed markup defines an
XML schema. The version="0.2" attribute sets <em>the version of the
AXMLS DTD used by the XML schema.</em> </p>
<p>All versions of AXMLS prior to version 1.0 have a schema version of
"0.1". The current schema version is "0.2".</p>
<pre class="listing"><pre>&lt;?xml version="1.0"?&gt;<br>&lt;schema version="0.2"&gt;<br> ...<br>&lt;/schema&gt;<br></pre></pre>
<p>Next we define one or more tables. A table consists of a fields (and
other objects) enclosed by &lt;table&gt; tags. The name="" attribute
specifies the name of the table that will be created in the database.</p>
<pre class="listing"><pre>&lt;table name="users"&gt;<br><br> &lt;desc&gt;A typical users table for our application.&lt;/desc&gt;<br> &lt;field name="userId" type="I"&gt;<br><br> &lt;descr&gt;A unique ID assigned to each user.&lt;/descr&gt;<br> &lt;KEY/&gt;<br> &lt;AUTOINCREMENT/&gt;<br> &lt;/field&gt;<br> <br> &lt;field name="userName" type="C" size="16"&gt;&lt;NOTNULL/&gt;&lt;/field&gt;<br><br> <br>&lt;/table&gt;<br></pre></pre>
<p>This table is called "users" and has a description and two fields.
The description is optional, and is currently only for your own
information; it is not applied to the database.</p>
<p>The first &lt;field&gt; tag will create a field named "userId" of
type "I", or integer. (See the ADOdb Data Dictionary documentation for
a list of valid types.) This &lt;field&gt; tag encloses two special
field options: &lt;KEY/&gt;, which specifies this field as a primary
key, and &lt;AUTOINCREMENT/&gt;, which specifies that the database
engine should automatically fill this field with the next available
value when a new row is inserted.</p>
<p>The second &lt;field&gt; tag will create a field named "userName" of
type "C", or character, and of length 16 characters. The
&lt;NOTNULL/&gt; option specifies that this field does not allow NULLs.</p>
<p>There are two ways to add indexes to a table. The simplest is to
mark a field with the &lt;KEY/&gt; option as described above; a primary
key is a unique index. The second and more powerful method uses the
&lt;index&gt; tags.</p>
<pre class="listing"><pre>&lt;table name="users"&gt;<br> ...<br> <br> &lt;index name="userName"&gt;<br> &lt;descr&gt;Put a unique index on the user name&lt;/descr&gt;<br> &lt;col&gt;userName&lt;/col&gt;<br><br> &lt;UNIQUE/&gt;<br> &lt;/index&gt;<br> <br>&lt;/table&gt;<br></pre></pre>
<p>The &lt;index&gt; tag specifies that an index should be created on
the enclosing table. The name="" attribute provides the name of the
index that will be created in the database. The description, as above,
is for your information only. The &lt;col&gt; tags list each column
that will be included in the index. Finally, the &lt;UNIQUE/&gt; tag
specifies that this will be created as a unique index.</p>
<p>Finally, AXMLS allows you to include arbitrary SQL that will be
applied to the database when the schema is executed.</p>
<pre class="listing"><pre>&lt;sql&gt;<br> &lt;descr&gt;Insert some data into the users table.&lt;/descr&gt;<br> &lt;query&gt;insert into users (userName) values ( 'admin' )&lt;/query&gt;<br><br> &lt;query&gt;insert into users (userName) values ( 'Joe' )&lt;/query&gt;<br>&lt;/sql&gt;<br></pre></pre>
<p>The &lt;sql&gt; tag encloses any number of SQL queries that you
define for your own use.</p>
<p>Now that we've defined an XML schema, you need to know how to apply
it to your database. Here's a simple PHP script that shows how to load
the schema.</p>
<pre class="listing"><pre>&lt;?PHP<br>/* You must tell the script where to find the ADOdb and<br> * the AXMLS libraries.<br> */
require( "path_to_adodb/adodb.inc.php");
require( "path_to_adodb/adodb-xmlschema.inc.php" ); # or adodb-xmlschema03.inc.php
 
/* Configuration information. Define the schema filename,<br> * RDBMS platform (see the ADODB documentation for valid<br> * platform names), and database connection information here.<br> */<br>$schemaFile = 'example.xml';<br>$platform = 'mysql';<br>$dbHost = 'localhost';<br>$dbName = 'database';<br>$dbUser = 'username';<br>$dbPassword = 'password';<br><br>/* Start by creating a normal ADODB connection.<br> */<br>$db = ADONewConnection( $platform );<br>$db-&gt;Connect( $dbHost, $dbUser, $dbPassword, $dbName );<br><br>/* Use the database connection to create a new adoSchema object.<br> */<br>$schema = new adoSchema( $db );<br><br>/* Call ParseSchema() to build SQL from the XML schema file.<br> * Then call ExecuteSchema() to apply the resulting SQL to <br> * the database.<br> */<br>$sql = $schema-&gt;ParseSchema( $schemaFile );<br>$result = $schema-&gt;ExecuteSchema();<br>?&gt;<br></pre></pre>
<p>Let's look at each part of the example in turn. After you manually
create the database, there are three steps required to load (or
upgrade) your schema.</p>
<p>First, create a normal ADOdb connection. The variables and values
here should be those required to connect to your database.</p>
<pre class="listing"><pre>$db = ADONewConnection( 'mysql' );<br>$db-&gt;Connect( 'host', 'user', 'password', 'database' );<br></pre></pre>
<p>Second, create the adoSchema object that load and manipulate your
schema. You must pass an ADOdb database connection object in order to
create the adoSchema object.</p>
<pre class="listing">$schema = new adoSchema( $db );<br></pre>
<p>Third, call ParseSchema() to parse the schema and then
ExecuteSchema() to apply it to the database. You must pass
ParseSchema() the path and filename of your schema file.</p>
<pre class="listing">$schema-&gt;ParseSchema( $schemaFile ); <br>$schema-&gt;ExecuteSchema();</pre>
<p>Execute the above code and then log into your database. If you've
done all this right, you should see your tables, indexes, and SQL.</p>
<p>You can find the source files for this tutorial in the examples
directory as tutorial_shema.xml and tutorial.php. See the class
documentation for a more detailed description of the adoSchema methods,
including methods and schema elements that are not described in this
tutorial.</p>
<h3>XML Schema Version 3</h3>
<p>In March 2006, we added adodb-xmlschema03.inc.php to the release, which supports version 3 of XML Schema.
The adodb-xmlschema.inc.php remains the same as previous releases, and supports version 2 of XML Schema.
Version 3 provides some enhancements:
 
<ul>
<li> Support for updating table data during an upgrade.
<li> Support for platform-specific table options and platform negation.
<li> Support for unsigned fields.
<li> Fixed opt and constraint support
<li> Many other fixes such as OPT tag, which allows you to set optional platform settings:
</ul>
 
<p>Example usage:
<pre>&lt;?xml version="1.0"?>
<b>&lt;schema version="0.3"></b>
&lt;table name="ats_kb">
&lt;descr>ATS KnowledgeBase&lt;/descr>
&lt;opt platform="mysql">TYPE=INNODB&lt;/opt>
&lt;field name="recid" type="I"/>
&lt;field name="organization_code" type="I4"/>
&lt;field name="sub_code" type="C" size="20"/>
etc...
</pre>
<p>To use it, change your code to include adodb-xmlschema03.inc.php.
 
<h3>Upgrading</h3>
<p>
If your schema version is older, than XSLT is used to transform the
schema to the newest version. This means that if you are using an older
XML schema format, you need to have the XSLT extension installed.
If you do not want to require your users to have the XSLT extension
installed, make sure you modify your XML schema to conform to the
latest version.
<hr />
<address>If you have any questions or comments, please email them to
Richard at richtl#arscognita.com.
</address>
</body>
</html>
/web/kaklik's_web/torrentflux/adodb/docs/docs-oracle.htm
0,0 → 1,542
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<style>
pre {
background-color: #eee;
padding: 0.75em 1.5em;
font-size: 12px;
border: 1px solid #ddd;
}
.greybg {
background-color: #eee;
padding: 0.75em 1.5em;
font-size: 12px;
border: 1px solid #ddd;
}
.style1 {color: #660000}
</style>
<title>ADOdb with PHP and Oracle</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</style>
</head>
 
<body>
<table width=100%><tr><td>
<h2>Using ADOdb with PHP and Oracle: an advanced tutorial</h2>
</td><td><div align="right"><img src=cute_icons_for_site/adodb.gif width="88" height="31"></div></tr></table>
<p><font size="1">(c)2004-2005 John Lim. All rights reserved.</font></p>
<h3>1. Introduction</h3>
<p>Oracle is the most popular commercial database used with PHP. There are many ways of accessing Oracle databases in PHP. These include:</p>
<ul>
<li>The oracle extension</li>
<li>The oci8 extension</li>
<li>PEAR DB library</li>
<li>ADOdb library</li>
</ul>
<p>The wide range of choices is confusing to someone just starting with Oracle and PHP. I will briefly summarize the differences, and show you the advantages of using <a href="http://adodb.sourceforge.net/">ADOdb</a>. </p>
<p>First we have the C extensions which provide low-level access to Oracle functionality. These C extensions are precompiled into PHP, or linked in dynamically when the web server starts up. Just in case you need it, here's a <a href=http://www.oracle.com/technology/tech/opensource/php/apache/inst_php_apache_linux.html>guide to installing Oracle and PHP on Linux</a>.</p>
<table width="75%" border="1" align="center">
<tr valign="top">
<td nowrap><b>Oracle extension</b></td>
<td>Designed for Oracle 7 or earlier. This is obsolete.</td>
</tr>
<tr valign="top">
<td nowrap><b>Oci8 extension</b></td>
<td> Despite it's name, which implies it is only for Oracle 8i, this is the standard method for accessing databases running Oracle 8i, 9i or 10g (and later).</td>
</tr>
</table>
<p>Here is an example of using the oci8 extension to query the <i>emp</i> table of the <i>scott</i> schema with bind parameters:
<pre>
$conn = OCILogon("scott","tiger", $tnsName);
 
$stmt = OCIParse($conn,"select * from emp where empno > :emp order by empno");
$emp = 7900;
OCIBindByName($stmt, ':emp', $emp);
$ok = OCIExecute($stmt);
while (OCIFetchInto($stmt,$arr)) {
print_r($arr);
echo "&lt;hr>";
}
</pre>
<p>This generates the following output:
<div class=greybg>
Array ( [0] => 7902 [1] => FORD [2] => ANALYST [3] => 7566 [4] => 03/DEC/81 [5] => 3000 [7] => 20 )
<hr />
Array ( [0] => 7934 [1] => MILLER [2] => CLERK [3] => 7782 [4] => 23/JAN/82 [5] => 1300 [7] => 10 )
</div>
<p>We also have many higher level PHP libraries that allow you to simplify the above code. The most popular are <a href="http://pear.php.net/">PEAR DB</a> and <a href="http://adodb.sourceforge.net/">ADOdb</a>. Here are some of the differences between these libraries:</p>
<table width="75%" border="1" align="center">
<tr>
<td><b>Feature</b></td>
<td><b>PEAR DB 1.6</b></td>
<td><b>ADOdb 4.52</b></td>
</tr>
<tr valign="top">
<td>General Style</td>
<td>Simple, easy to use. Lacks Oracle specific functionality.</td>
<td>Has multi-tier design. Simple high-level design for beginners, and also lower-level advanced Oracle functionality.</td>
</tr>
<tr valign="top">
<td>Support for Prepare</td>
<td>Yes, but only on one statement, as the last prepare overwrites previous prepares.</td>
<td>Yes (multiple simultaneous prepare's allowed)</td>
</tr>
<tr valign="top">
<td>Support for LOBs</td>
<td>No</td>
<td>Yes, using update semantics</td>
</tr>
<tr valign="top">
<td>Support for REF Cursors</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr valign="top">
<td>Support for IN Parameters</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr valign="top">
<td>Support for OUT Parameters</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr valign="top">
<td>Schema creation using XML</td>
<td>No</td>
<td>Yes, including ability to define tablespaces and constraints</td>
</tr>
<tr valign="top">
<td>Provides database portability features</td>
<td>No</td>
<td>Yes, has some ability to abstract features that differ between databases such as dates, bind parameters, and data types.</td>
</tr>
<tr valign="top">
<td>Performance monitoring and tracing</td>
<td>No</td>
<td>Yes. SQL can be traced and linked to web page it was executed on. Explain plan support included.</td>
</tr>
<tr valign="top">
<td>Recordset caching for frequently used queries</td>
<td>No</td>
<td>Yes. Provides great speedups for SQL involving complex <i>where, group-by </i>and <i>order-by</i> clauses.</td>
</tr>
<tr valign="top">
<td>Popularity</td>
<td>Yes, part of PEAR release</td>
<td>Yes, many open source projects are using this software, including PostNuke, Xaraya, Mambo, Tiki Wiki.</td>
</tr>
<tr valign="top">
<td>Speed</td>
<td>Medium speed.</td>
<td>Very high speed. Fastest database abstraction library available for PHP. <a href="http://phplens.com/lens/adodb/">Benchmarks are available</a>.</td>
</tr>
<tr valign="top">
<td>High Speed Extension available</td>
<td>No</td>
<td>Yes. You can install the optional ADOdb extension, which reimplements the most frequently used parts of ADOdb as fast C code. Note that the source code version of ADOdb runs just fine without this extension, and only makes use of the extension if detected.</td>
</tr>
</table>
<p> PEAR DB is good enough for simple web apps. But if you need more power, you can see ADOdb offers more sophisticated functionality. The rest of this article will concentrate on using ADOdb with Oracle. You can find out more about <a href="#connecting">connecting to Oracle</a> later in this guide.</p>
<h4>ADOdb Example</h4>
<p>In ADOdb, the above oci8 example querying the <i>emp</i> table could be written as:</p>
<pre>
include "/path/to/adodb.inc.php";
$db = NewADOConnection("oci8");
$db->Connect($tnsName, "scott", "tiger");
 
$rs = $db->Execute("select * from emp where empno>:emp order by empno",
array('emp' => 7900));
while ($arr = $rs->FetchRow()) {
print_r($arr);
echo "&lt;hr>";
}
</pre>
<p>The Execute( ) function returns a recordset object, and you can retrieve the rows returned using $recordset-&gt;FetchRow( ). </p>
<p>If we ignore the initial connection preamble, we can see the ADOdb version is much easier and simpler:</p>
<table width="100%" border="1">
<tr valign="top" bgcolor="#FFFFFF">
<td width="50%" bgcolor="#e0e0e0"><b>Oci8</b></td>
<td bgcolor="#e0e0e0"><b>ADOdb</b></td>
</tr>
<tr valign="top" bgcolor="#CCCCCC">
<td><pre><font size="1">$stmt = <b>OCIParse</b>($conn,
"select * from emp where empno > :emp");
$emp = 7900;
<b>OCIBindByName</b>($stmt, ':emp', $emp);
$ok = <b>OCIExecute</b>($stmt);
 
while (<b>OCIFetchInto</b>($stmt,$arr)) {
print_r($arr);
echo "&lt;hr>";
} </font></pre></td>
<td><pre><font size="1">$recordset = $db-><b>Execute</b>("select * from emp where empno>:emp",
array('emp' => 7900));
 
while ($arr = $recordset-><b>FetchRow</b>()) {
print_r($arr);
echo "&lt;hr>";
}</font></pre></td>
</tr>
</table>
<p>&nbsp;</p>
<h3>2. ADOdb Query Semantics</h3>
<p>You can also query the database using the standard Microsoft ADO MoveNext( ) metaphor. The data array for the current row is stored in the <i>fields</i> property of the recordset object, $rs.
MoveNext( ) offers the highest performance among all the techniques for iterating through a recordset:
<pre>
$rs = $db->Execute("select * from emp where empno>:emp", array('emp' => 7900));
while (!$rs->EOF) {
print_r($rs->fields);
$rs->MoveNext();
}
</pre>
<p>And if you are interested in having the data returned in a 2-dimensional array, you can use:
<pre>
$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900));
</pre>
<p>Now to obtain only the first row as an array:
<pre>
$arr = $db->GetRow("select * from emp where empno=:emp", array('emp' => 7900));
</pre>
<p>Or to retrieve only the first field of the first row:
<pre>
$arr = $db->GetOne("select ename from emp where empno=:emp", array('emp' => 7900));
</pre>
<p>For easy pagination support, we provide the SelectLimit function. The following will perform a select query, limiting it to 100 rows, starting from row 200:
<pre>
$offset = 200; $limitrows = 100;
$rs = $db->SelectLimit('select * from table', $offset, $limitrows);
</pre>
<p>The $limitrows parameter is optional.
<h4>Array Fetch Mode</h4>
<p>When data is being returned in an array, you can choose the type of array the data is returned in.
<ol>
<li> Numeric indexes - use <font size="2" face="Courier New, Courier, mono">$connection-&gt;SetFetchMode(ADODB_FETCH_NUM).</font></li>
<li>Associative indexes - the keys of the array are the names of the fields (in upper-case). Use <font size="2" face="Courier New, Courier, mono">$connection-&gt;SetFetchMode(ADODB_FETCH_ASSOC)</font><font face="Courier New, Courier, mono">.</font></li>
<li>Both numeric and associative indexes - use <font size="2" face="Courier New, Courier, mono">$connection-&gt;SetFetchMode(ADODB_FETCH_BOTH).</font></li>
</ol>
<p>The default is ADODB_FETCH_BOTH for Oracle.</p>
<h4><b>Caching</b></h4>
<p>You can define a database cache directory using $ADODB_CACHE_DIR, and cache the results of frequently used queries that rarely change. This is particularly useful for SQL with complex where clauses and group-by's and order-by's. It is also good for relieving heavily-loaded database servers.</p>
<p>This example will cache the following select statement for 3600 seconds (1 hour):</p>
<pre>
$ADODB_CACHE_DIR = '/var/adodb/tmp';
$rs = $db->CacheExecute(3600, "select names from allcountries order by 1");
</pre>
There are analogous CacheGetArray(
), CacheGetRow( ), CacheGetOne( ) and CacheSelectLimit( ) functions. The first parameter is the number of seconds to cache. You can also pass a bind array as a 3rd parameter (not shown above).
<p>There is an alternative syntax for the caching functions. The first parameter is omitted, and you set the cacheSecs
property of the connection object:
<pre>
$ADODB_CACHE_DIR = '/var/adodb/tmp';
$connection->cacheSecs = 3600;
$rs = $connection->CacheExecute($sql, array('id' => 1));
</pre>
<h3>&nbsp;</h3>
<h3>3. Using Prepare( ) For Frequently Used Statements</h3>
<p>Prepare( ) is for compiling frequently used SQL statement for reuse. For example, suppose we have a large array which needs to be inserted into an Oracle database. The following will result in a massive speedup in query execution (at least 20-40%), as the SQL statement only needs to be compiled once:</p>
<pre>
$stmt = $db->Prepare('insert into table (field1, field2) values (:f1, :f2)');
foreach ($arrayToInsert as $key => $value) {
$db->Execute($stmt, array('f1' => $key, 'f2' => $val);
}
</pre>
<p>&nbsp;</p>
<h3>4. Working With LOBs</h3>
<p>Oracle treats data which is more than 4000 bytes in length specially. These are called Large Objects, or LOBs for short. Binary LOBs are BLOBs, and character LOBs are CLOBs. In most Oracle libraries, you need to do a lot of work to process LOBs, probably because Oracle designed it to work in systems with little memory. ADOdb tries to make things easy by assuming the LOB can fit into main memory. </p>
<p>ADOdb will transparently handle LOBs in <i>select</i> statements. The LOBs are automatically converted to PHP variables without any special coding.</p>
<p>For updating records with LOBs, the functions UpdateBlob( ) and UpdateClob( ) are provided. Here's a BLOB example. The parameters should be self-explanatory:
<pre>
$ok = $db->Execute("insert into aTable (id, name, ablob)
values (aSequence.nextVal, 'Name', null)");
if (!$ok) return LogError($db-&gt;ErrorMsg());
<font color="#006600"># params: $tableName, $blobFieldName, $blobValue, $whereClause</font>
$db->UpdateBlob('aTable', 'ablob', $blobValue, 'id=aSequence.currVal');
</pre>
<p>and the analogous CLOB example:
<pre>
$ok = $db->Execute("insert into aTable (id, name, aclob)
values (aSequence.nextVal, 'Name', null)");
if (!$ok) return LogError($db-&gt;ErrorMsg());
$db->UpdateClob('aTable', 'aclob', $clobValue, 'id=aSequence.currVal');
</pre>
<p>Note that LogError( ) is a user-defined function, and not part of ADOdb.
<p>Inserting LOBs is more complicated. Since ADOdb 4.55, we allow you to do this
(assuming that the <em>photo</em> field is a BLOB, and we want to store $blob_data into
this field, and the primary key is the <em>id</em> field):
<pre>
$sql = <span class="style1">"INSERT INTO photos ( ID, photo) ".
"VALUES ( :id, empty_blob() )".
" RETURNING photo INTO :xx"</span>;
 
$stmt = $db->PrepareSP($sql);
$db->InParameter($stmt, $<strong>id</strong>, <span class="style1">'id'</span>);
$blob = $db->InParameter($stmt, $<strong>blob_data</strong>, <span class="style1">'xx'</span>,-1, OCI_B_BLOB);
$db->StartTrans();
$ok = $db->Execute($stmt);
$db->CompleteTrans();
</pre>
<p>
<h3>5. REF CURSORs</h3>
<p>Oracle recordsets can be passed around as variables called REF Cursors. For example, in PL/SQL, we could define a function <i>open_tab</i> that returns a REF CURSOR in the first parameter:</p>
<pre>
TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;
 
PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS
BEGIN
OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
END open_tab;
</pre>
<p>In ADOdb, we could access this REF Cursor using the ExecuteCursor() function. The following will find
all table names that begin with 'A' in the current schema:
<pre>
$rs = $db->ExecuteCursor("BEGIN open_tab(:refc,'A%'); END;",'refc');
while ($arr = $rs->FetchRow()) print_r($arr);
</pre>
<p>The first parameter is the PL/SQL statement, and the second parameter is the name of the REF Cursor.
</p>
<p>&nbsp;</p>
<h3>6. In and Out Parameters</h3>
<p>The following PL/SQL
stored procedure requires an input variable, and returns a result into an output variable:
<pre>
PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR) IS
BEGIN
output := 'I love '||input;
END;
</pre>
<p>The following ADOdb code allows you to call the stored procedure:</p>
<pre>
$stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;");
$input = 'Sophia Loren';
$db->InParameter($stmt,$input,'a1');
$db->OutParameter($stmt,$output,'a2');
$ok = $db->Execute($stmt);
if ($ok) echo ($output == 'I love Sophia Loren') ? 'OK' : 'Failed';
</pre>
<p>PrepareSP( ) is a special function that knows about bind parameters.
The main limitation currently is that IN OUT parameters do not work.
<h4>Bind Parameters and REF CURSORs</h4>
<p>We could also rewrite the REF CURSOR example to use InParameter (requires ADOdb 4.53 or later):
<pre>
$stmt = $db->PrepareSP("BEGIN adodb.open_tab(:refc,:tabname); END;");
$input = 'A%';
$db->InParameter($stmt,$input,'tabname');
$rs = $db->ExecuteCursor($stmt,'refc');
while ($arr = $rs->FetchRow()) print_r($arr);
</pre>
<h4>Bind Parameters and LOBs</h4>
<p>You can also operate on LOBs. In this example, we have IN and OUT parameters using CLOBs.
<pre>
$text = 'test test test';
$sql = "declare rs clob; begin :rs := lobinout(:sa0); end;";
$stmt = $conn -> PrepareSP($sql);
$conn -> InParameter($stmt,$text,'sa0', -1, OCI_B_CLOB); # -1 means variable length
$rs = '';
$conn -> OutParameter($stmt,$rs,'rs', -1, OCI_B_CLOB);
$conn -> Execute($stmt);
echo "return = ".$rs."&lt;br>";
</pre>
<p>Similarly, you can use the constant OCI_B_BLOB to indicate that you are using BLOBs.
<h4>Reusing Bind Parameters with CURSOR_SHARING=FORCE</h4>
<p>Many web programmers do not care to use bind parameters, and prefer to enter the SQL directly. So instead of:</p>
<pre>
$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900));
</pre>
<p>They prefer entering the values inside the SQL:
<pre>
$arr = $db->GetArray("select * from emp where empno>7900");
</pre>
<p>This reduces Oracle performance because Oracle will reuse compiled SQL which is identical to previously compiled SQL. The above example with the values inside the SQL
is unlikely to be reused. As an optimization, from Oracle 8.1 onwards, you can set the following session parameter after you login:
<pre>
ALTER SESSION SET CURSOR_SHARING=FORCE
</pre>
<p>This will force Oracle to convert all such variables (eg. the 7900 value) into constant bind parameters, improving SQL reuse.</p>
<p>More <a href="http://phplens.com/adodb/code.initialization.html#speed">speedup tips</a>.</p>
<p>&nbsp;</p>
<h3>7. Dates and Datetime in ADOdb</h3>
<p>There are two things you need to know about dates in ADOdb. </p>
<p>First, to ensure cross-database compability, ADOdb assumes that dates are returned in ISO format (YYYY-MM-DD H24:MI:SS).</p>
<p>Secondly, since Oracle treats dates and datetime as the same data type, we decided not to display the time in the default date format. So on login, ADOdb will set the NLS_DATE_FORMAT to 'YYYY-MM-DD'. If you prefer to show the date and time by default, do this:</p>
<pre>
$db = NewADOConnection('oci8');
$db->NLS_DATE_FORMAT = 'RRRR-MM-DD HH24:MI:SS';
$db->Connect($tns, $user, $pwd);
</pre>
<p>Or execute:</p>
<pre>$sql = &quot;ALTER SESSION SET NLS_DATE_FORMAT = 'RRRR-MM-DD HH24:MI:SS'&quot;;
$db-&gt;Execute($sql);
</pre>
<p>If you are not concerned about date portability and do not use ADOdb's portability layer, you can use your preferred date format instead.
<p>
<h3>8. Database Portability Layer</h3>
<p>ADOdb provides the following functions for portably generating SQL functions
as strings to be merged into your SQL statements:</p>
<table width="75%" border="1" align=center>
<tr>
<td width=30%><b>Function</b></td>
<td><b>Description</b></td>
</tr>
<tr>
<td>DBDate($date)</td>
<td>Pass in a UNIX timestamp or ISO date and it will convert it to a date
string formatted for INSERT/UPDATE</td>
</tr>
<tr>
<td>DBTimeStamp($date)</td>
<td>Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp
string formatted for INSERT/UPDATE</td>
</tr>
<tr>
<td>SQLDate($date, $fmt)</td>
<td>Portably generate a date formatted using $fmt mask, for use in SELECT
statements.</td>
</tr>
<tr>
<td>OffsetDate($date, $ndays)</td>
<td>Portably generate a $date offset by $ndays.</td>
</tr>
<tr>
<td>Concat($s1, $s2, ...)</td>
<td>Portably concatenate strings. Alternatively, for mssql use mssqlpo driver,
which allows || operator.</td>
</tr>
<tr>
<td>IfNull($fld, $replaceNull)</td>
<td>Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.</td>
</tr>
<tr>
<td>Param($name)</td>
<td>Generates bind placeholders, using ? or named conventions as appropriate.</td>
</tr>
<tr><td>$db->sysDate</td><td>Property that holds the SQL function that returns today's date</td>
</tr>
<tr><td>$db->sysTimeStamp</td><td>Property that holds the SQL function that returns the current
timestamp (date+time).
</td>
</tr>
<tr>
<td>$db->concat_operator</td><td>Property that holds the concatenation operator
</td>
</tr>
<tr><td>$db->length</td><td>Property that holds the name of the SQL strlen function.
</td></tr>
 
<tr><td>$db->upperCase</td><td>Property that holds the name of the SQL strtoupper function.
</td></tr>
<tr><td>$db->random</td><td>Property that holds the SQL to generate a random number between 0.00 and 1.00.
</td>
</tr>
<tr><td>$db->substr</td><td>Property that holds the name of the SQL substring function.
</td></tr>
</table>
<p>ADOdb also provides multiple oracle oci8 drivers for different scenarios:</p>
<table width="75%" border="1" align="center">
<tr>
<td nowrap><b>Driver Name</b></td>
<td><b>Description</b></td>
</tr>
<tr>
<td>oci805 </td>
<td>Specifically for Oracle 8.0.5. This driver has a slower SelectLimit( ).</td>
</tr>
<tr>
<td>oci8</td>
<td>The default high performance driver. The keys of associative arrays returned in a recordset are upper-case.</td>
</tr>
<tr>
<td>oci8po</td>
<td> The portable Oracle driver. Slightly slower than oci8. This driver uses ? instead of :<i>bindvar</i> for binding variables, which is the standard for other databases. Also the keys of associative arrays are in lower-case like other databases.</td>
</tr>
</table>
<p>Here's an example of calling the <i>oci8po</i> driver. Note that the bind variables use question-mark:</p>
<pre>$db = NewADOConnection('oci8po');
$db-&gt;Connect($tns, $user, $pwd);
$db-&gt;Execute(&quot;insert into atable (f1, f2) values (?,?)&quot;, array(12, 'abc'));</pre>
<p>&nbsp;<a name=connecting></a>
<h3>9. Connecting to Oracle</h3>
<p>Before you can use ADOdb, you need to have the Oracle client installed and setup the oci8 extension. This extension comes pre-compiled for Windows (but you still need to enable it in the php.ini file). For information on compiling the oci8 extension for PHP and Apache on Unix, there is an excellent guide at <a href="http://www.oracle.com/technology/tech/opensource/php/apache/inst_php_apache_linux.html">oracle.com</a>. </p>
<h4>Should You Use Persistent Connections</h4>
<p>One question that is frequently asked is should you use persistent connections to Oracle. Persistent connections allow PHP to recycle existing connections, reusing them after the previous web pages have completed. Non-persistent connections close automatically after the web page has completed. Persistent connections are faster because the cost of reconnecting is expensive, but there is additional resource overhead. As an alternative, Oracle allows you to pool and reuse server processes; this is called <a href="http://www.cise.ufl.edu/help/database/oracle-docs/server.920/a96521/manproc.htm#13132">Shared Server</a> (also known as MTS).</p>
<p>The author's benchmarks suggest that using non-persistent connections and the Shared Server configuration offer the best performance. If Shared Server is not an option, only then consider using persistent connections.</p>
<h4>Connection Examples</h4>
<p>Just in case you are having problems connecting to Oracle, here are some examples:</p>
<p>a. PHP and Oracle reside on the same machine, use default SID, with non-persistent connections:</p>
<pre> $conn = NewADOConnection('oci8');
$conn-&gt;Connect(false, 'scott', 'tiger');</pre>
<p>b. TNS Name defined in tnsnames.ora (or ONAMES or HOSTNAMES), eg. 'myTNS', using persistent connections:</p>
<pre> $conn = NewADOConnection('oci8');
$conn-&gt;PConnect(false, 'scott', 'tiger', 'myTNS');</pre>
<p>or</p>
<pre> $conn-&gt;PConnect('myTNS', 'scott', 'tiger');</pre>
<p>c. Host Address and SID</p>
<pre>
$conn->connectSID = true;
$conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', 'SID');</pre>
<p>d. Host Address and Service Name</p>
<pre> $conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', 'servicename');</pre>
<p>e. Oracle connection string:
<pre> $cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$host)(PORT=$port))
(CONNECT_DATA=(SID=$sid)))";
$conn-&gt;Connect($cstr, 'scott', 'tiger');
</pre>
<p>f. ADOdb data source names (dsn):
<pre>
$dsn = 'oci8://user:pwd@tnsname/?persist'; # persist is optional
$conn = ADONewConnection($dsn); # no need for Connect/PConnect
$dsn = 'oci8://user:pwd@host/sid';
$conn = ADONewConnection($dsn);
$dsn = 'oci8://user:pwd@/'; # oracle on local machine
$conn = ADONewConnection($dsn);</pre>
<p>With ADOdb data source names,
you don't have to call Connect( ) or PConnect( ).
</p>
<p>&nbsp;</p>
<h3>10. Error Checking</h3>
<p>The examples in this article are easy to read but a bit simplistic because we ignore error-handling. Execute( ) and Connect( ) will return false on error. So a more realistic way to call Connect( ) and Execute( ) is:
<pre>function InvokeErrorHandler()
{<br>global $db; ## assume global
MyLogFunction($db-&gt;ErrorNo(), $db-&gt;ErrorMsg());
}
if (!$db-&gt;Connect($tns, $usr, $pwd)) InvokeErrorHandler();
 
$rs = $db->Execute("select * from emp where empno>:emp order by empno",
array('emp' => 7900));
if (!$rs) return InvokeErrorHandler();
while ($arr = $rs->FetchRow()) {
print_r($arr);
echo "&lt;hr>";
}
</pre>
<p>You can retrieve the error message and error number of the last SQL statement executed from ErrorMsg( ) and ErrorNo( ). You can also <a href=http://phplens.com/adodb/using.custom.error.handlers.and.pear_error.html>define a custom error handler function</a>.
ADOdb also supports throwing exceptions in PHP5.
<p>&nbsp;</p>
<h3>Handling Large Recordsets (added 27 May 2005)</h3>
The oci8 driver does not support counting the number of records returned in a SELECT statement, so the function RecordCount()
is emulated when the global variable $ADODB_COUNTRECS is set to true, which is the default.
We emulate this by buffering all the records. This can take up large amounts of memory for big recordsets.
Set $ADODB_COUNTRECS to false for the best performance.
<p>
This variable is checked every time a query is executed, so you can selectively choose which recordsets to count.
<p>&nbsp;</p>
<h3>11. Other ADOdb Features</h3>
<p><a href="http://phplens.com/lens/adodb/docs-datadict.htm">Schema generation</a>. This allows you to define a schema using XML and import it into different RDBMS systems portably.</p>
<p><a href="http://phplens.com/lens/adodb/docs-perf.htm">Performance monitoring and tracing</a>. Highlights of performance monitoring include identification of poor and suspicious SQL, with explain plan support, and identifying which web pages the SQL ran on.</p>
<p>&nbsp;</p>
<h3>12. Download</h3>
<p>You can <a href="http://adodb.sourceforge.net/#download">download ADOdb from sourceforge</a>. ADOdb uses a BSD style license. That means that it is free for commercial use, and redistribution without source code is allowed.</p>
<p>&nbsp;</p>
<h3>13. Resources</h3>
<ul>
<li>Oracle's <a href="http://www.oracle.com/technology/pub/articles/php_experts/index.html">Hitchhiker Guide to PHP</a></li>
<li>OTN article on <a href=http://www.oracle.com/technology/pub/articles/deployphp/lim_deployphp.html>Optimizing PHP and Oracle</a> by this author.
<li>Oracle has an excellent <a href="http://www.oracle.com/technology/tech/opensource/php/php_troubleshooting_faq.html">FAQ on PHP</a></li>
<li>PHP <a href="http://php.net/oci8">oci8</a> manual pages</li>
<li><a href=http://phplens.com/lens/lensforum/topics.php?id=4>ADOdb forums</a>.
</ul>
</body>
</html>
/web/kaklik's_web/torrentflux/adodb/docs/docs-perf.htm
0,0 → 1,962
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ADOdb Performance Monitoring Library</title>
<style type="text/css">
body, td {
/*font-family: Arial, Helvetica, sans-serif;*/
font-size: 11pt;
}
pre {
font-size: 9pt;
background-color: #EEEEEE; padding: .5em; margin: 0px;
}
.toplink {
font-size: 8pt;
}
</style>
</head>
<body>
<h3>The ADOdb Performance Monitoring Library</h3>
<p>V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)</p>
<p><font size="1">This software is dual licensed using BSD-Style and
LGPL. This means you can use it in compiled proprietary and commercial
products.</font></p>
<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a>
&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a>
</p>
<h3>Introduction</h3>
<p>This module, part of the ADOdb package, provides both CLI and HTML
interfaces for viewing key performance indicators of your database.
This is very useful because web apps such as the popular phpMyAdmin
currently do not provide effective database health monitoring tools.
The module provides the following: </p>
<ul>
<li>A quick health check of your database server using <code>$perf-&gt;HealthCheck()</code>
or <code>$perf-&gt;HealthCheckCLI()</code>. </li>
<li>User interface for performance monitoring, <code>$perf-&gt;UI()</code>.
This UI displays:
<ul>
<li>the health check, </li>
<li>all SQL logged and their query plans, </li>
<li>a list of all tables in the current database</li>
<li>an interface to continiously poll the server for key
performance indicators such as CPU, Hit Ratio, Disk I/O</li>
<li>a form where you can enter and run SQL interactively.</li>
</ul>
</li>
<li>Gives you an API to build database monitoring tools for a server
farm, for example calling <code>$perf-&gt;DBParameter('data cache hit
ratio')</code> returns this very important statistic in a database
independant manner. </li>
</ul>
<p>ADOdb also has the ability to log all SQL executed, using <a
href="docs-adodb.htm#logsql">LogSQL</a>. All SQL logged can be
analyzed through the performance monitor <a href="#ui">UI</a>. In the <i>View
SQL</i> mode, we categorize the SQL into 3 types:
</p>
<ul>
<li><b>Suspicious SQL</b>: queries with high average execution times,
and are potential candidates for rewriting</li>
<li><b>Expensive SQL</b>: queries with high total execution times
(#executions * avg execution time). Optimizing these queries will
reduce your database server load.</li>
<li><b>Invalid SQL</b>: queries that generate errors.</li>
</ul>
<p>Each query is hyperlinked to a description of the query plan, and
every PHP script that executed that query is also shown.</p>
<p>Please note that the information presented is a very basic database
health check, and does not provide a complete overview of database
performance. Although some attempt has been made to make it work across
multiple databases in the same way, it is impossible to do so. For the
health check, we do try to display the following key database
parameters for all drivers:</p>
<ul>
<li><b>data cache size</b> - The amount of memory allocated to the
cache.</li>
<li><b>data cache hit ratio</b> - A measure of how effective the
cache is, as a percentage. The higher, the better.</li>
<li><b>current connections</b> - The number of sessions currently
connected to the database. </li>
</ul>
<p>You will need to connect to the database as an administrator to view
most of the parameters. </p>
<p>Code improvements as very welcome, particularly adding new database
parameters and automated tuning hints.</p>
<a name="usage"></a>
<h3>Usage</h3>
<p>Currently, the following drivers: <em>mysql</em>, <em>postgres</em>,
<em>oci8</em>, <em>mssql</em>, <i>informix</i> and <em>db2</em> are
supported. To create a new performance monitor, call NewPerfMonitor( )
as demonstrated below: </p>
<pre>&lt;?php<br>include_once('adodb.inc.php');<br>session_start(); <font
color="#006600"># session variables required for monitoring</font><br>$conn = ADONewConnection($driver);<br>$conn-&gt;Connect($server,$user,$pwd,$db);<br>$perf =&amp; NewPerfMonitor($conn);<br>$perf-&gt;UI($pollsecs=5);<br>?&gt;<br></pre>
<p>It is also possible to retrieve a single database parameter:</p>
<pre>$size = $perf-&gt;DBParameter('data cache size');<br></pre>
<p>
Thx to Fernando Ortiz for the informix module. </p>
<h3>Methods</h3>
<a name="ui"></a>
<p><font face="Courier New, Courier, mono">function <b>UI($pollsecs=5)</b></font></p>
<p>Creates a web-based user interface for performance monitoring. When
you click on Poll, server statistics will be displayed every $pollsecs
seconds. See <a href="#usage">Usage</a> above. </p>
<p>Since 4.11, we allow users to enter and run SQL interactively via
the "Run SQL" link. To disable this for security reasons, set this
constant before calling $perf-&gt;UI(). </p>
<p> </p>
<pre>define('ADODB_PERF_NO_RUN_SQL',1);</pre>
<p>Sample output follows below:</p>
<table bgcolor="lightyellow" border="1" width="100%">
<tbody>
<tr>
<td> <b><a href="http://php.weblogs.com/adodb?perf=1">ADOdb</a>
Performance Monitor</b> for localhost, db=test<br>
<font size="-1">PostgreSQL 7.3.2 on i686-pc-cygwin, compiled by
GCC gcc (GCC) 3.2 20020927 (prerelease)</font></td>
</tr>
<tr>
<td> <a href="#">Performance Stats</a> &nbsp; <a href="#">View
SQL</a> &nbsp; <a href="#">View Tables</a> &nbsp; <a href="#">Poll
Stats</a></td>
</tr>
</tbody>
</table>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td colspan="3">
<h3>postgres7</h3>
</td>
</tr>
<tr>
<td><b>Parameter</b></td>
<td><b>Value</b></td>
<td><b>Description</b></td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Ratios</i> &nbsp;</td>
</tr>
<tr>
<td>statistics collector</td>
<td>TRUE</td>
<td>Value must be TRUE to enable hit ratio statistics (<i>stats_start_collector</i>,<i>stats_row_level</i>
and <i>stats_block_level</i> must be set to true in postgresql.conf)</td>
</tr>
<tr>
<td>data cache hit ratio</td>
<td>99.7967555299239</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>IO</i> &nbsp;</td>
</tr>
<tr>
<td>data reads</td>
<td>125</td>
<td>&nbsp; </td>
</tr>
<tr>
<td>data writes</td>
<td>21.78125000000000000</td>
<td>Count of inserts/updates/deletes * coef</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Data Cache</i> &nbsp;</td>
</tr>
<tr>
<td>data cache buffers</td>
<td>640</td>
<td>Number of cache buffers. <a
href="http://www.varlena.com/GeneralBits/Tidbits/perf.html#basic">Tuning</a></td>
</tr>
<tr>
<td>cache blocksize</td>
<td>8192</td>
<td>(estimate)</td>
</tr>
<tr>
<td>data cache size</td>
<td>5M</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>operating system cache size</td>
<td>80M</td>
<td>(effective cache size)</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Memory Usage</i> &nbsp;</td>
</tr>
<tr>
<td>sort buffer size</td>
<td>1M</td>
<td>Size of sort buffer (per query)</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Connections</i> &nbsp;</td>
</tr>
<tr>
<td>current connections</td>
<td>0</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>max connections</td>
<td>32</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Parameters</i> &nbsp;</td>
</tr>
<tr>
<td>rollback buffers</td>
<td>8</td>
<td>WAL buffers</td>
</tr>
<tr>
<td>random page cost</td>
<td>4</td>
<td>Cost of doing a seek (default=4). See <a
href="http://www.varlena.com/GeneralBits/Tidbits/perf.html#less">random_page_cost</a></td>
</tr>
</tbody>
</table>
<p><font face="Courier New, Courier, mono">function <b>HealthCheck</b>()</font></p>
<p>Returns database health check parameters as a HTML table. You will
need to echo or print the output of this function,</p>
<p><font face="Courier New, Courier, mono">function <b>HealthCheckCLI</b>()</font></p>
<p>Returns database health check parameters formatted for a command
line interface. You will need to echo or print the output of this
function. Sample output for mysql:</p>
<pre>-- Ratios -- <br> MyISAM cache hit ratio =&gt; 56.5635738832 <br> InnoDB cache hit ratio =&gt; 0 <br> sql cache hit ratio =&gt; 0 <br> -- IO -- <br> data reads =&gt; 2622 <br> data writes =&gt; 2415.5 <br> -- Data Cache -- <br> MyISAM data cache size =&gt; 512K <br> BDB data cache size =&gt; 8388600<br> InnoDB data cache size =&gt; 8M<br> -- Memory Pools -- <br> read buffer size =&gt; 131072 <br> sort buffer size =&gt; 65528 <br> table cache =&gt; 4 <br> -- Connections -- <br> current connections =&gt; 3<br> max connections =&gt; 100</pre>
<p><font face="Courier New, Courier, mono">function <b>Poll</b>($pollSecs=5)
</font> </p>
<p> Run in infinite loop, displaying the following information every
$pollSecs. This will not work properly if output buffering is enabled.
In the example below, $pollSecs=3:
</p>
<pre>Accumulating statistics...<br> Time WS-CPU% Hit% Sess Reads/s Writes/s<br>11:08:30 0.7 56.56 1 0.0000 0.0000<br>11:08:33 1.8 56.56 2 0.0000 0.0000<br>11:08:36 11.1 56.55 3 2.5000 0.0000<br>11:08:39 9.8 56.55 2 3.1121 0.0000<br>11:08:42 2.8 56.55 1 0.0000 0.0000<br>11:08:45 7.4 56.55 2 0.0000 1.5000<br></pre>
<p><b>WS-CPU%</b> is the Web Server CPU load of the server that PHP is
running from (eg. the database client), and not the database. The <b>Hit%</b>
is the data cache hit ratio. <b>Sess</b> is the current number of
sessions connected to the database. If you are using persistent
connections, this should not change much. The <b>Reads/s</b> and <b>Writes/s</b>
are synthetic values to give the viewer a rough guide to I/O, and are
not to be taken literally. </p>
<p><font face="Courier New, Courier, mono">function <b>SuspiciousSQL</b>($numsql=10)</font></p>
<p>Returns SQL which have high average execution times as a HTML table.
Each sql statement
is hyperlinked to a new window which details the execution plan and the
scripts that execute this SQL.
</p>
<p> The number of statements returned is determined by $numsql. Data is
taken from the adodb_logsql table, where the sql statements are logged
when
$connection-&gt;LogSQL(true) is enabled. The adodb_logsql table is
populated using <a href="docs-adodb.htm#logsql">$conn-&gt;LogSQL</a>.
</p>
<p>For Oracle, Ixora Suspicious SQL returns a list of SQL statements
that are most cache intensive as a HTML table. These are data intensive
SQL statements that could benefit most from tuning. </p>
<p><font face="Courier New, Courier, mono">function <b>ExpensiveSQL</b>($numsql=10)</font></p>
<p>Returns SQL whose total execution time (avg time * #executions) is
high as a HTML table. Each sql statement
is hyperlinked to a new window which details the execution plan and the
scripts that execute this SQL.
</p>
<p> The number of statements returned is determined by $numsql. Data is
taken from the adodb_logsql table, where the sql statements are logged
when
$connection-&gt;LogSQL(true) is enabled. The adodb_logsql table is
populated using <a href="docs-adodb.htm#logsql">$conn-&gt;LogSQL</a>.
</p>
<p>For Oracle, Ixora Expensive SQL returns a list of SQL statements
that are taking the most CPU load when run.
</p>
<p><font face="Courier New, Courier, mono">function <b>InvalidSQL</b>($numsql=10)</font></p>
<p>Returns a list of invalid SQL as an HTML table.
</p>
<p>Data is taken from the adodb_logsql table, where the sql statements
are logged when
$connection-&gt;LogSQL(true) is enabled.
</p>
<p><font face="Courier New, Courier, mono">function <b>Tables</b>($orderby=1)</font></p>
<p>Returns information on all tables in a database, with the first two
fields containing the table name and table size, the remaining fields
depend on the database driver. If $orderby is set to 1, it will sort by
name. If $orderby is set to 2, then it will sort by table size. Some
database drivers (mssql and mysql) will ignore the $orderby clause. For
postgresql, the information is up-to-date since the last <i>vacuum</i>.
Not supported currently for db2.</p>
<h3>Raw Functions</h3>
<p>Raw functions return values without any formatting.</p>
<p><font face="Courier New, Courier, mono">function <b>DBParameter</b>($paramname)</font></p>
<p>Returns the value of a database parameter, such as
$this-&gt;DBParameter("data cache size").</p>
<p><font face="Courier New, Courier, mono">function <b>CPULoad</b>()</font></p>
<p>Returns the CPU load of the database client (NOT THE SERVER) as a
percentage. Only works for Linux and Windows. For Windows, WMI must be
available.</p>
<h3>Format of $settings Property</h3>
<p> To create new database parameters, you need to understand
$settings. The $settings data structure is an associative array. Each
element of the array defines a database parameter. The key is the name
of the database parameter. If no key is defined, then it is assumed to
be a section break, and the value is the name of the section break. If
this is too confusing, looking at the source code will help a lot!</p>
<p> Each database parameter is itself an array consisting of the
following elements:</p>
<ol start="0">
<li> Category code, used to group related db parameters. If the
category code is 'HIDE', then
the database parameter is not shown when HTML() is called. <br>
</li>
<li> either
<ol type="a">
<li>sql string to retrieve value, eg. "select value from
v\$parameter where name='db_block_size'", </li>
<li>array holding sql string and field to look for, e.g.
array('show variables','table_cache'); optional 3rd parameter is the
$rs-&gt;fields[$index] to use (otherwise $index=1), and optional 4th
parameter is a constant to multiply the result with (typically 100 for
percentage calculations),</li>
<li>a string prefixed by =, then a PHP method of the class is
invoked, e.g. to invoke $this-&gt;GetIndexValue(), set this array
element to '=GetIndexValue', <br>
</li>
</ol>
</li>
<li> Description of database parameter. If description begins with an
=, then it is interpreted as a method call, just as in (1c) above,
taking one parameter, the current value. E.g. '=GetIndexDescription'
will invoke $this-&gt;GetIndexDescription($val). This is useful for
generating tuning suggestions. For an example, see WarnCacheRatio().</li>
</ol>
<p>Example from MySQL, table_cache database parameter:</p>
<pre>'table cache' =&gt; array('CACHE', # category code<br> array("show variables", 'table_cache'), # array (type 1b)<br> 'Number of tables to keep open'), # description</pre>
<h3>Example Health Check Output</h3>
<p><a href="#db2">db2</a> <a href="#informix">informix</a> <a
href="#mysql">mysql</a> <a href="#mssql">mssql</a> <a href="#oci8">oci8</a>
<a href="#postgres">postgres</a></p>
<p><a name="db2"></a></p>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td colspan="3">
<h3>db2</h3>
</td>
</tr>
<tr>
<td><b>Parameter</b></td>
<td><b>Value</b></td>
<td><b>Description</b></td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Ratios</i> &nbsp;</td>
</tr>
<tr bgcolor="#ffffff">
<td>data cache hit ratio</td>
<td>0 &nbsp; </td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Data Cache</i></td>
</tr>
<tr bgcolor="#ffffff">
<td>data cache buffers</td>
<td>250 &nbsp; </td>
<td>See <a
href="http://www7b.boulder.ibm.com/dmdd/library/techarticle/anshum/0107anshum.html#bufferpoolsize">tuning
reference</a>.</td>
</tr>
<tr bgcolor="#ffffff">
<td>cache blocksize</td>
<td>4096 &nbsp; </td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#ffffff">
<td>data cache size</td>
<td>1000K &nbsp; </td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Connections</i></td>
</tr>
<tr bgcolor="#ffffff">
<td>current connections</td>
<td>2 &nbsp; </td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><a name="informix"></a>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td colspan="3">
<h3>informix</h3>
</td>
</tr>
<tr>
<td><b>Parameter</b></td>
<td><b>Val
ue</b></td>
<td><b>Description</b></td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Ratios</i> &nbsp;</td>
</tr>
<tr>
<td>data cache hit
ratio</td>
<td>95.89</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>IO</i> &nbsp;</td>
</tr>
<tr>
<td>data
reads</td>
<td>1883884</td>
<td>Page reads</td>
</tr>
<tr>
<td>data writes</td>
<td>1716724</td>
<td>Page writes</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Connections</i>
&nbsp;</td>
</tr>
<tr>
<td>current connections</td>
<td>263.0</td>
<td>Number of
sessions</td>
</tr>
</tbody>
</table>
</p>
<p>&nbsp;</p>
<p><a name="mysql" id="mysql"></a></p>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td colspan="3">
<h3>mysql</h3>
</td>
</tr>
<tr>
<td><b>Parameter</b></td>
<td><b>Value</b></td>
<td><b>Description</b></td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Ratios</i> &nbsp;</td>
</tr>
<tr>
<td>MyISAM cache hit ratio</td>
<td>56.5658301822</td>
<td><font color="red"><b>Cache ratio should be at least 90%</b></font></td>
</tr>
<tr>
<td>InnoDB cache hit ratio</td>
<td>0</td>
<td><font color="red"><b>Cache ratio should be at least 90%</b></font></td>
</tr>
<tr>
<td>sql cache hit ratio</td>
<td>0</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>IO</i> &nbsp;</td>
</tr>
<tr>
<td>data reads</td>
<td>2622</td>
<td>Number of selects (Key_reads is not accurate)</td>
</tr>
<tr>
<td>data writes</td>
<td>2415.5</td>
<td>Number of inserts/updates/deletes * coef (Key_writes is not
accurate)</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Data Cache</i> &nbsp;</td>
</tr>
<tr>
<td>MyISAM data cache size</td>
<td>512K</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>BDB data cache size</td>
<td>8388600</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>InnoDB data cache size</td>
<td>8M</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Memory Pools</i> &nbsp;</td>
</tr>
<tr>
<td>read buffer size</td>
<td>131072</td>
<td>(per session)</td>
</tr>
<tr>
<td>sort buffer size</td>
<td>65528</td>
<td>Size of sort buffer (per session)</td>
</tr>
<tr>
<td>table cache</td>
<td>4</td>
<td>Number of tables to keep open</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Connections</i> &nbsp;</td>
</tr>
<tr>
<td>current connections</td>
<td>3</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>max connections</td>
<td>100</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><a name="mssql" id="mssql"></a></p>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td colspan="3">
<h3>mssql</h3>
</td>
</tr>
<tr>
<td><b>Parameter</b></td>
<td><b>Value</b></td>
<td><b>Description</b></td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Ratios</i> &nbsp;</td>
</tr>
<tr>
<td>data cache hit ratio</td>
<td>99.9999694824</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>prepared sql hit ratio</td>
<td>99.7738579828</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>adhoc sql hit ratio</td>
<td>98.4540169133</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>IO</i> &nbsp;</td>
</tr>
<tr>
<td>data reads</td>
<td>2858</td>
<td>&nbsp; </td>
</tr>
<tr>
<td>data writes</td>
<td>1438</td>
<td>&nbsp; </td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Data Cache</i> &nbsp;</td>
</tr>
<tr>
<td>data cache size</td>
<td>4362</td>
<td>in K</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Connections</i> &nbsp;</td>
</tr>
<tr>
<td>current connections</td>
<td>14</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>max connections</td>
<td>32767</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><a name="oci8" id="oci8"></a></p>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td colspan="3">
<h3>oci8</h3>
</td>
</tr>
<tr>
<td><b>Parameter</b></td>
<td><b>Value</b></td>
<td><b>Description</b></td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Ratios</i> &nbsp;</td>
</tr>
<tr>
<td>data cache hit ratio</td>
<td>96.98</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>sql cache hit ratio</td>
<td>99.96</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>IO</i> &nbsp;</td>
</tr>
<tr>
<td>data reads</td>
<td>842938</td>
<td>&nbsp; </td>
</tr>
<tr>
<td>data writes</td>
<td>16852</td>
<td>&nbsp; </td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Data Cache</i> &nbsp;</td>
</tr>
<tr>
<td>data cache buffers</td>
<td>3072</td>
<td>Number of cache buffers</td>
</tr>
<tr>
<td>data cache blocksize</td>
<td>8192</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>data cache size</td>
<td>48M</td>
<td>shared_pool_size</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Memory Pools</i> &nbsp;</td>
</tr>
<tr>
<td>java pool size</td>
<td>0</td>
<td>java_pool_size</td>
</tr>
<tr>
<td>sort buffer size</td>
<td>512K</td>
<td>sort_area_size (per query)</td>
</tr>
<tr>
<td>user session buffer size</td>
<td>8M</td>
<td>large_pool_size</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Connections</i> &nbsp;</td>
</tr>
<tr>
<td>current connections</td>
<td>1</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>max connections</td>
<td>170</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>data cache utilization ratio</td>
<td>88.46</td>
<td>Percentage of data cache actually in use</td>
</tr>
<tr>
<td>user cache utilization ratio</td>
<td>91.76</td>
<td>Percentage of user cache (large_pool) actually in use</td>
</tr>
<tr>
<td>rollback segments</td>
<td>11</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Transactions</i> &nbsp;</td>
</tr>
<tr>
<td>peak transactions</td>
<td>24</td>
<td>Taken from high-water-mark</td>
</tr>
<tr>
<td>max transactions</td>
<td>187</td>
<td>max transactions / rollback segments &lt; 3.5 (or
transactions_per_rollback_segment)</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Parameters</i> &nbsp;</td>
</tr>
<tr>
<td>cursor sharing</td>
<td>EXACT</td>
<td>Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR
(9i+). See <a
href="http://www.praetoriate.com/oracle_tips_cursor_sharing.htm">cursor_sharing</a>.</td>
</tr>
<tr>
<td>index cache cost</td>
<td>0</td>
<td>% of indexed data blocks expected in the cache. Recommended
is 20-80. Default is 0. See <a
href="http://www.dba-oracle.com/oracle_tips_cbo_part1.htm">optimizer_index_caching</a>.</td>
</tr>
<tr>
<td>random page cost</td>
<td>100</td>
<td>Recommended is 10-50 for TP, and 50 for data warehouses.
Default is 100. See <a
href="http://www.dba-oracle.com/oracle_tips_cost_adj.htm">optimizer_index_cost_adj</a>.
</td>
</tr>
</tbody>
</table>
<h3>Suspicious SQL</h3>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td><b>LOAD</b></td>
<td><b>EXECUTES</b></td>
<td><b>SQL_TEXT</b></td>
</tr>
<tr>
<td align="right"> .73%</td>
<td align="right">89</td>
<td>select u.name, o.name, t.spare1, t.pctfree$ from sys.obj$ o,
sys.user$ u, sys.tab$ t where (bitand(t.trigflag, 1048576) = 1048576)
and o.obj#=t.obj# and o.owner# = u.user# select i.obj#, i.flags,
u.name, o.name from sys.obj$ o, sys.user$ u, sys.ind$ i where
(bitand(i.flags, 256) = 256 or bitand(i.flags, 512) = 512) and
(not((i.type# = 9) and bitand(i.flags,8) = 8)) and o.obj#=i.obj# and
o.owner# = u.user# </td>
</tr>
<tr>
<td align="right"> .84%</td>
<td align="right">3</td>
<td>select /*+ RULE */ distinct tabs.table_name, tabs.owner ,
partitioned, iot_type , TEMPORARY, table_type, table_type_owner from
DBA_ALL_TABLES tabs where tabs.owner = :own </td>
</tr>
<tr>
<td align="right"> 3.95%</td>
<td align="right">6</td>
<td>SELECT round(count(1)*avg(buf.block_size)/1048576) FROM
DBA_OBJECTS obj, V$BH bh, dba_segments seg, v$buffer_pool buf WHERE
obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner =
seg.owner and obj.object_name = seg.segment_name and obj.object_type =
seg.segment_type and seg.buffer_pool = buf.name and buf.name =
'DEFAULT' </td>
</tr>
<tr>
<td align="right"> 4.50%</td>
<td align="right">6</td>
<td>SELECT round(count(1)*avg(tsp.block_size)/1048576) FROM
DBA_OBJECTS obj, V$BH bh, dba_segments seg, dba_tablespaces tsp WHERE
obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner =
seg.owner and obj.object_name = seg.segment_name and obj.object_type =
seg.segment_type and seg.tablespace_name = tsp.tablespace_name </td>
</tr>
<tr>
<td align="right">57.34%</td>
<td align="right">9267</td>
<td>select t.schema, t.name, t.flags, q.name from
system.aq$_queue_tables t, sys.aq$_queue_table_affinities aft,
system.aq$_queues q where aft.table_objno = t.objno and
aft.owner_instance = :1 and q.table_objno = t.objno and q.usage = 0 and
bitand(t.flags, 4+16+32+64+128+256) = 0 for update of t.name,
aft.table_objno skip locked </td>
</tr>
</tbody>
</table>
<h3>Expensive SQL</h3>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td><b>LOAD</b></td>
<td><b>EXECUTES</b></td>
<td><b>SQL_TEXT</b></td>
</tr>
<tr>
<td align="right"> 5.24%</td>
<td align="right">1</td>
<td>select round(sum(bytes)/1048576) from dba_segments </td>
</tr>
<tr>
<td align="right"> 6.89%</td>
<td align="right">6</td>
<td>SELECT round(count(1)*avg(buf.block_size)/1048576) FROM
DBA_OBJECTS obj, V$BH bh, dba_segments seg, v$buffer_pool buf WHERE
obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner =
seg.owner and obj.object_name = seg.segment_name and obj.object_type =
seg.segment_type and seg.buffer_pool = buf.name and buf.name =
'DEFAULT' </td>
</tr>
<tr>
<td align="right"> 7.85%</td>
<td align="right">6</td>
<td>SELECT round(count(1)*avg(tsp.block_size)/1048576) FROM
DBA_OBJECTS obj, V$BH bh, dba_segments seg, dba_tablespaces tsp WHERE
obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner =
seg.owner and obj.object_name = seg.segment_name and obj.object_type =
seg.segment_type and seg.tablespace_name = tsp.tablespace_name </td>
</tr>
<tr>
<td align="right">33.69%</td>
<td align="right">89</td>
<td>select u.name, o.name, t.spare1, t.pctfree$ from sys.obj$ o,
sys.user$ u, sys.tab$ t where (bitand(t.trigflag, 1048576) = 1048576)
and o.obj#=t.obj# and o.owner# = u.user# </td>
</tr>
<tr>
<td align="right">36.44%</td>
<td align="right">89</td>
<td>select i.obj#, i.flags, u.name, o.name from sys.obj$ o,
sys.user$ u, sys.ind$ i where (bitand(i.flags, 256) = 256 or
bitand(i.flags, 512) = 512) and (not((i.type# = 9) and
bitand(i.flags,8) = 8)) and o.obj#=i.obj# and o.owner# = u.user# </td>
</tr>
</tbody>
</table>
<p><a name="postgres" id="postgres"></a></p>
<table bgcolor="white" border="1">
<tbody>
<tr>
<td colspan="3">
<h3>postgres7</h3>
</td>
</tr>
<tr>
<td><b>Parameter</b></td>
<td><b>Value</b></td>
<td><b>Description</b></td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Ratios</i> &nbsp;</td>
</tr>
<tr>
<td>statistics collector</td>
<td>FALSE</td>
<td>Must be set to TRUE to enable hit ratio statistics (<i>stats_start_collector</i>,<i>stats_row_level</i>
and <i>stats_block_level</i> must be set to true in postgresql.conf)</td>
</tr>
<tr>
<td>data cache hit ratio</td>
<td>99.9666031916603</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>IO</i> &nbsp;</td>
</tr>
<tr>
<td>data reads</td>
<td>15</td>
<td>&nbsp; </td>
</tr>
<tr>
<td>data writes</td>
<td>0.000000000000000000</td>
<td>Count of inserts/updates/deletes * coef</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Data Cache</i> &nbsp;</td>
</tr>
<tr>
<td>data cache buffers</td>
<td>1280</td>
<td>Number of cache buffers. <a
href="http://www.varlena.com/GeneralBits/Tidbits/perf.html#basic">Tuning</a></td>
</tr>
<tr>
<td>cache blocksize</td>
<td>8192</td>
<td>(estimate)</td>
</tr>
<tr>
<td>data cache size</td>
<td>10M</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>operating system cache size</td>
<td>80000K</td>
<td>(effective cache size)</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Memory Pools</i> &nbsp;</td>
</tr>
<tr>
<td>sort buffer size</td>
<td>1M</td>
<td>Size of sort buffer (per query)</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Connections</i> &nbsp;</td>
</tr>
<tr>
<td>current connections</td>
<td>13</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>max connections</td>
<td>32</td>
<td>&nbsp;</td>
</tr>
<tr bgcolor="#f0f0f0">
<td colspan="3"><i>Parameters</i> &nbsp;</td>
</tr>
<tr>
<td>rollback buffers</td>
<td>8</td>
<td>WAL buffers</td>
</tr>
<tr>
<td>random page cost</td>
<td>4</td>
<td>Cost of doing a seek (default=4). See <a
href="http://www.varlena.com/GeneralBits/Tidbits/perf.html#less">random_page_cost</a></td>
</tr>
</tbody>
</table>
</body>
</html>
/web/kaklik's_web/torrentflux/adodb/docs/docs-session.htm
0,0 → 1,247
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ADODB Session Management Manual</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<style type="text/css">
body, td {
/*font-family: Arial, Helvetica, sans-serif;*/
font-size: 11pt;
}
pre {
font-size: 9pt;
background-color: #EEEEEE; padding: .5em; margin: 0px;
}
.toplink {
font-size: 8pt;
}
</style>
</head>
<body style="background-color: rgb(255, 255, 255);">
<h3>ADODB Session Management Manual</h3>
<p>
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)
</p>
<p> <font size="1">This software is dual licensed using BSD-Style and
LGPL. This means you can use it in compiled proprietary and commercial
products. </font>
<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a>
&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a>
</p>
<h3>Introduction</h3>
<p> We store state information specific to a user or web client in
session variables. These session variables persist throughout a
session, as the user moves from page to page. </p>
<p>To use session variables, call session_start() at the beginning of
your web page, before your HTTP headers are sent. Then for every
variable you want to keep alive for the duration of the session, call
session_register($variable_name). By default, the session handler will
keep track of the session by using a cookie. You can save objects or
arrays in session variables also.
</p>
<p>The default method of storing sessions is to store it in a file.
However if you have special needs such as you:
</p>
<ul>
<li>Have multiple web servers that need to share session info</li>
<li>Need to do special processing of each session</li>
<li>Require notification when a session expires</li>
</ul>
<p>The ADOdb session handler provides you with the above
additional capabilities by storing the session information as records
in a database table that can be shared across multiple servers. </p>
<p>These records will be garbage collected based on the php.ini [session] timeout settings.
You can register a notification function to notify you when the record has expired and
is about to be freed by the garbage collector.</p>
<p><b>Important Upgrade Notice:</b> Since ADOdb 4.05, the session files
have been moved to its own folder, adodb/session. This is a rewrite
of the session code by Ross Smith. The old session code is in
adodb/session/old. </p>
<h4>ADOdb Session Handler Features</h4>
<ul>
<li>Ability to define a notification function that is called when a
session expires. Typically
used to detect session logout and release global resources. </li>
<li>Optimization of database writes. We crc32 the session data and
only perform an update
to the session data if there is a data change. </li>
<li>Support for large amounts of session data with CLOBs (see
adodb-session-clob.php). Useful
for Oracle. </li>
<li>Support for encrypted session data, see
adodb-cryptsession.inc.php. Enabling encryption is simply a matter of
including adodb-cryptsession.inc.php instead of adodb-session.inc.php. </li>
</ul>
<h3>Setup</h3>
<p>There are 3 session management files that you can use:
</p>
<pre>adodb-session.php : The default<br>adodb-session-clob.php : Use this if you are storing DATA in clobs<br>adodb-cryptsession.php : Use this if you want to store encrypted session data in the database<br><br>
</pre>
<p><strong>Examples</strong>
<p><pre>
<font
color="#004040"> include('adodb/adodb.inc.php');<br> <br><b> $ADODB_SESSION_DRIVER='mysql';<br> $ADODB_SESSION_CONNECT='localhost';<br> $ADODB_SESSION_USER ='scott';<br> $ADODB_SESSION_PWD ='tiger';<br> $ADODB_SESSION_DB ='sessiondb';</b><br> <br> <b>include('adodb/session/adodb-session.php');</b><br> session_start();<br> <br> #<br> # Test session vars, the following should increment on refresh<br> #<br> $_SESSION['AVAR'] += 1;<br> print "&lt;p&gt;\$_SESSION['AVAR']={$_SESSION['AVAR']}&lt;/p&gt;";<br></font></pre>
<p>To force non-persistent connections, call adodb_session_open() first before session_start():
<p>
<pre>
<font color="#004040"><br> include('adodb/adodb.inc.php');<br> <br><b> $ADODB_SESSION_DRIVER='mysql';<br> $ADODB_SESSION_CONNECT='localhost';<br> $ADODB_SESSION_USER ='scott';<br> $ADODB_SESSION_PWD ='tiger';<br> $ADODB_SESSION_DB ='sessiondb';</b><br> <br> <b>include('adodb/session/adodb-session.php');<br> adodb_sess_open(false,false,false);</b><br> session_start();<br> </font>
</pre>
<p> The 3rd parameter to adodb_sess_open($path, $sessname, $connectMode) sets the connection method. You can pass in the following:</p>
<table width="50%" border="1">
<tr>
<td><b>$connectMode</b></td>
<td><b>Connection Method</b></td>
</tr>
<tr>
<td>true</td>
<td><p>PConnect( )</p></td>
</tr>
<tr>
<td>false</td>
<td>Connect( )</td>
</tr>
<tr>
<td>'N'</td>
<td>NConnect( )</td>
</tr>
<tr>
<td>'P'</td>
<td>PConnect( )</td>
</tr>
<tr>
<td>'C'</td>
<td>Connect( )</td>
</tr>
</table>
<p>To use a encrypted sessions, simply replace the file adodb-session.php:</p>
<pre> <font
color="#004040"><br> include('adodb/adodb.inc.php');<br> <br><b> $ADODB_SESSION_DRIVER='mysql';<br> $ADODB_SESSION_CONNECT='localhost';<br> $ADODB_SESSION_USER ='scott';<br> $ADODB_SESSION_PWD ='tiger';<br> $ADODB_SESSION_DB ='sessiondb';<br> <br> include('adodb/session/adodb-cryptsession.php');</b><br> session_start();</font><br>
</pre>
<p>And the same technique for adodb-session-clob.php:</p>
<pre> <font
color="#004040"><br> include('adodb/adodb.inc.php');<br> <br><b> $ADODB_SESSION_DRIVER='mysql';<br> $ADODB_SESSION_CONNECT='localhost';<br> $ADODB_SESSION_USER ='scott';<br> $ADODB_SESSION_PWD ='tiger';<br> $ADODB_SESSION_DB ='sessiondb';<br> <br> include('adodb/session/adodb-session-clob.php');</b><br> session_start();</font>
</pre>
<h4>Installation</h4>
<p>1. Create this table in your database (syntax might vary depending on your db):
<p><pre> <a
name="sessiontab"></a> <font color="#004040"><br> create table sessions (<br> SESSKEY char(32) not null,<br> EXPIRY int(11) unsigned not null,<br> EXPIREREF varchar(64),<br> DATA text not null,<br> primary key (sesskey)<br> );</font><br>
</pre>
<p>You may want to rename the 'data' field to 'session_data' as
'data' appears to be a reserved word for one or more of the following:
<ul>
<li> ANSI SQL
<li> IBM DB2
<li> MS SQL Server
<li> Postgres
<li> SAP
</ul>
<p>
If you do, then execute:
<pre>
ADODB_Session::dataFieldName('session_data');
</pre>
<p> For the adodb-session-clob.php version, create this:
<p> <pre>
<font
color="#004040"><br> create table sessions (<br> SESSKEY char(32) not null,<br> EXPIRY int(11) unsigned not null,<br> EXPIREREF varchar(64),<br> DATA CLOB,<br> primary key (sesskey)<br> );</font>
</pre>
<p>2. Then define the following parameters. You can either modify this file, or define them before this file is included:
<pre> <font
color="#004040"><br> $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';<br> $ADODB_SESSION_CONNECT='server to connect to';<br> $ADODB_SESSION_USER ='user';<br> $ADODB_SESSION_PWD ='password';<br> $ADODB_SESSION_DB ='database';<br> $ADODB_SESSION_TBL = 'sessions'; # setting this is optional<br> </font>
</pre><p>
When the session is created, $<b>ADODB_SESS_CONN</b> holds the connection object.<br> <br> 3. Recommended is PHP 4.0.6 or later. There are documented session bugs in earlier versions of PHP.
<h3>Notifications</h3>
<p>You can receive notification when your session is cleaned up by the session garbage collector or
when you call session_destroy().
<p>PHP's session extension will automatically run a special garbage collection function based on
your php.ini session.cookie_lifetime and session.gc_probability settings. This will in turn call
adodb's garbage collection function, which can be setup to do notification.
<p>
<pre>
PHP Session --> ADOdb Session --> Find all recs --> Send --> Delete queued
GC Function GC Function to be deleted notification records
executed at called by for all recs
random time Session Extension queued for deletion
</pre>
<p>When a session is created, we need to store a value in the session record (in the EXPIREREF field), typically
the userid of the session. Later when the session has expired, just before the record is deleted,
we reload the EXPIREREF field and call the notification function with the value of EXPIREREF, which
is the userid of the person being logged off.
<p>ADOdb use a global variable $ADODB_SESSION_EXPIRE_NOTIFY that you must predefine before session
start to store the notification configuratioin.
$ADODB_SESSION_EXPIRE_NOTIFY is an array with 2 elements, the
first being the name of the session variable you would like to store in
the EXPIREREF field, and the 2nd is the notification function's name. </p>
<p>For example, suppose we want to be notified when a user's session has expired,
based on the userid. When the user logs in, we store the id in the global session variable
$USERID. The function name is 'NotifyFn'.
<p>
So we define (before session_start() is called): </p>
<pre> <font color="#004040"><br> $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');<br> </font></pre>
And when the NotifyFn is called (when the session expires), the
$USERID is passed in as the first parameter, eg. NotifyFn($userid, $sesskey). The
session key (which is the primary key of the record in the sessions
table) is the 2nd parameter.
<p> Here is an example of a Notification function that deletes some
records in the database and temporary files: </p>
<pre><font color="#004040"><br> function NotifyFn($expireref, $sesskey)<br> {<br> global $ADODB_SESS_CONN; # the session connection object<br><br> $user = $ADODB_SESS_CONN-&gt;qstr($expireref);<br> $ADODB_SESS_CONN-&gt;Execute("delete from shopping_cart where user=$user");<br> system("rm /work/tmpfiles/$expireref/*");<br> }</font><br> </pre>
<p> NOTE 1: If you have register_globals disabled in php.ini, then you
will have to manually set the EXPIREREF. E.g. </p>
<pre> <font color="#004040">
$GLOBALS['USERID'] = GetUserID();
$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');</font>
</pre>
<p> NOTE 2: If you want to change the EXPIREREF after the session
record has been created, you will need to modify any session variable
to force a database record update.
</p>
<h4>Neat Notification Tricks</h4>
<p><i>ExpireRef</i> normally holds the user id of the current session.
</p>
<p>1. You can then write a session monitor, scanning expireref to see
who is currently logged on.
</p>
<p>2. If you delete the sessions record for a specific user, eg.
</p>
<pre>delete from sessions where expireref = '$USER'<br></pre>
then the user is logged out. Useful for ejecting someone from a
site.
<p>3. You can scan the sessions table to ensure no user
can be logged in twice. Useful for security reasons.
</p>
<h3>Compression/Encryption Schemes</h3>
Since ADOdb 4.05, thanks to Ross Smith, multiple encryption and
compression schemes are supported. Currently, supported are:
<p>
<pre> MD5Crypt (crypt.inc.php)<br> MCrypt<br> Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)<br> GZip<br> BZip2<br></pre>
<p>These are stackable. E.g.
<p><pre>ADODB_Session::filter(new ADODB_Compress_Bzip2());<br>ADODB_Session::filter(new ADODB_Encrypt_MD5());<br></pre>
will compress and then encrypt the record in the database.
<h3>adodb_session_regenerate_id()</h3>
<p>Dynamically change the current session id with a newly generated one and update database. Currently only
works with cookies. Useful to improve security by reducing the risk of session-hijacking.
See this article on <a href=http://shiflett.org/articles/security-corner-feb2004>Session Fixation</a> for more info
on the theory behind this feature. Usage:
<pre>
$ADODB_SESSION_DRIVER='mysql';
$ADODB_SESSION_CONNECT='localhost';
$ADODB_SESSION_USER ='root';
$ADODB_SESSION_PWD ='abc';
$ADODB_SESSION_DB ='phplens';
include('path/to/adodb/session/adodb-session.php');
session_start();
# Every 10 page loads, reset cookie for safety.
# This is extremely simplistic example, better
# to regenerate only when the user logs in or changes
# user privilege levels.
if ((rand()%10) == 0) adodb_session_regenerate_id(); </pre>
<p>This function calls session_regenerate_id() internally or simulates it if the function does not exist.
<h2>More Info</h2>
<p>Also see the <a href="docs-adodb.htm">core ADOdb documentation</a>.
</p>
</body>
</html>
/web/kaklik's_web/torrentflux/adodb/docs/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/adodb/docs/old-changelog.htm
0,0 → 1,822
<html><title>Old Changelog: ADOdb</title><body>
<h3>Old Changelog</h3>
 
</p><p><b>3.92 22 Sept 2003</b>
</p><p>Added GetAssoc and CacheGetAssoc to connection object.
</p><p>Removed TextMax and CharMax functions from adodb.inc.php.
</p><p>HasFailedTrans() returned false when trans failed. Fixed.
</p><p>Moved perf driver classes into adodb/perf/*.php.
</p><p>Misc improvements to performance monitoring, including UI().
</p><p>RETVAL in mssql Parameter(), we do not append @ now.
</p><p>Added Param($name) to connection class, returns '?' or ":$name", for defining
bind parameters portably.
</p><p>LogSQL traps affected_rows() and saves its value properly now. Also fixed oci8
_stmt and _affectedrows() bugs.
</p><p>Session code timestamp check for oci8 works now. Formerly default NLS_DATE_FORMAT
stripped off time portion. Thx to Tony Blair (tonanbarbarian#hotmail.com). Also
added new $conn-&gt;datetime field to oci8, controls whether MetaType() returns
'D' ($this-&gt;datetime==false) or 'T' ($this-&gt;datetime == true) for DATE type.
</p><p>Fixed bugs in adodb-cryptsession.inc.php and adodb-session-clob.inc.php.
</p><p>Fixed misc bugs in adodb_key_exists, GetInsertSQL() and GetUpdateSQL().
</p><p>Tuned include_once handling to reduce file-system checking overhead.
</p><p><b>3.91 9 Sept 2003</b>
</p><p>Only released to InterAkt
</p><p>Added LogSQL() for sql logging and $ADODB_NEWCONNECTION to override factory
for driver instantiation.
</p><p>Added IfNull($field,$ifNull) function, thx to johnwilk#juno.com
</p><p>Added portable substr support.
</p><p>Now rs2html() has new parameter, $echo. Set to false to return $html instead
of echoing it.
</p><p><b>3.90 5 Sept 2003</b>
</p><p>First beta of performance monitoring released.
</p><p>MySQL supports MetaTable() masking.
</p><p>Fixed key_exists() bug in adodb-lib.inc.php
</p><p>Added sp_executesql Prepare() support to mssql.
</p><p>Added bind support to db2.
</p><p>Added swedish language file - Christian Tiberg" christian#commsoft.nu
</p><p>Bug in drop index for mssql data dict fixed. Thx to Gert-Rainer Bitterlich.
</p><p>Left join setting for oci8 was wrong. Thx to johnwilk#juno.com
</p><p><b>3.80 27 Aug 2003</b>
</p><p>Patch for PHP 4.3.3 cached recordset csv2rs() fread loop incompatibility.
</p><p>Added matching mask for MetaTables. Only for oci8, mssql and postgres currently.
</p><p>Rewrite of "oracle" driver connection code, merging with "oci8", by Gaetano.
</p><p>Added better debugging for Smart Transactions.
</p><p>Postgres DBTimeStamp() was wrongly using TO_DATE. Changed to TO_TIMESTAMP.
</p><p>ADODB_FETCH_CASE check pushed to ADONewConnection to allow people to define
it after including adodb.inc.php.
</p><p>Added portugese (brazilian) to languages. Thx to "Levi Fukumori".
</p><p>Removed arg3 parameter from Execute/SelectLimit/Cache* functions.
</p><p>Execute() now accepts 2-d array as $inputarray. Also changed docs of fnExecute()
to note change in sql query counting with 2-d arrays.
</p><p>Added MONEY to MetaType in PostgreSQL.
</p><p>Added more debugging output to CacheFlush().
</p><p><b>3.72 9 Aug 2003</b>
</p><p>Added qmagic($str), which is a qstr($str) that auto-checks for magic quotes
and does the right thing...
</p><p>Fixed CacheFlush() bug - Thx to martin#gmx.de
</p><p>Walt Boring contributed MetaForeignKeys for postgres7.
</p><p>_fetch() called _BlobDecode() wrongly in interbase. Fixed.
</p><p>adodb_time bug fixed with dates after 2038 fixed by Jason Pell. http://phplens.com/lens/lensforum/msgs.php?id=6980
</p><p><b>3.71 4 Aug 2003</b>
</p><p>The oci8 driver, MetaPrimaryKeys() did not check the owner correctly when $owner
== false.
</p><p>Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru.
</p><p>Spanish language file contributed by "Horacio Degiorgi" horaciod#codigophp.com.
</p><p>Error handling in oci8 bugfix - if there was an error in Execute(), then when
calling ErrorNo() and/or ErrorMsg(), the 1st call would return the error, but
the 2nd call would return no error.
</p><p>Error handling in odbc bugfix. ODBC would always return the last error, even
if it happened 5 queries ago. Now we reset the errormsg to '' and errorno to
0 everytime before CacheExecute() and Execute().
</p><p><b>3.70 29 July 2003</b>
</p><p>Added new SQLite driver. Tested on PHP 4.3 and PHP 5.
</p><p>Added limited "sapdb" driver support - mainly date support.
</p><p>The oci8 driver did not identify NUMBER with no defined precision correctly.
</p><p>Added ADODB_FORCE_NULLS, if set, then PHP nulls are converted to SQL nulls
in GetInsertSQL/GetUpdateSQL.
</p><p>DBDate() and DBTimeStamp() format for postgresql had problems. Fixed.
</p><p>Added tableoptions to ChangeTableSQL(). Thx to Mike Benoit.
</p><p>Added charset support to postgresql. Thx to Julian Tarkhanov.
</p><p>Changed OS check for MS-Windows to prevent confusion with darWIN (MacOS)
</p><p>Timestamp format for db2 was wrong. Changed to yyyy-mm-dd-hh.mm.ss.nnnnnn.
</p><p>adodb-cryptsession.php includes wrong. Fixed.
</p><p>Added MetaForeignKeys(). Supported by mssql, odbc_mssql and oci8.
</p><p>Fixed some oci8 MetaColumns/MetaPrimaryKeys bugs. Thx to Walt Boring.
</p><p>adodb_getcount() did not init qryRecs to 0. Missing "WHERE" clause checking
in GetUpdateSQL fixed. Thx to Sebastiaan van Stijn.
</p><p>Added support for only 'VIEWS' and "TABLES" in MetaTables. From Walt Boring.
</p><p>Upgraded to adodb-xmlschema.inc.php 0.0.2.
</p><p>NConnect for mysql now returns value. Thx to Dennis Verspuij.
</p><p>ADODB_FETCH_BOTH support added to interbase/firebird.
</p><p>Czech language file contributed by Kamil Jakubovic jake#host.sk.
</p><p>PostgreSQL BlobDecode did not use _connectionID properly. Thx to Juraj Chlebec.
</p><p>Added some new initialization stuff for Informix. Thx to "Andrea Pinnisi" pinnisi#sysnet.it
</p><p>ADODB_ASSOC_CASE constant wrong in sybase _fetch(). Fixed.
</p><p><b>3.60 16 June 2003</b>
</p><p>We now SET CONCAT_NULL_YIELDS_NULL OFF for odbc_mssql driver to be compat with
mssql driver.
</p><p>The property $emptyDate missing from connection class. Also changed 1903 to
constant (TIMESTAMP_FIRST_YEAR=100). Thx to Sebastiaan van Stijn.
</p><p>ADOdb speedup optimization - we now return all arrays by reference.
</p><p>Now DBDate() and DBTimeStamp() now accepts the string 'null' as a parameter.
Suggested by vincent.
</p><p>Added GetArray() to connection class.
</p><p>Added not_null check in informix metacolumns().
</p><p>Connection parameters for postgresql did not work correctly when port was defined.
</p><p>DB2 is now a tested driver, making adodb 100% compatible. Extensive changes
to odbc driver for DB2, including implementing serverinfo() and SQLDate(), switching
to SQL_CUR_USE_ODBC as the cursor mode, and lastAffectedRows and SelectLimit()
fixes.
</p><p>The odbc driver's FetchField() field names did not obey ADODB_ASSOC_CASE. Fixed.
</p><p>Some bugs in adodb_backtrace() fixed.
</p><p>Added "INT IDENTITY" type to adorecordset::MetaType() to support odbc_mssql
properly.
</p><p>MetaColumns() for oci8, mssql, odbc revised to support scale. Also minor revisions
to odbc MetaColumns() for vfp and db2 compat.
</p><p>Added unsigned support to mysql datadict class. Thx to iamsure.
</p><p>Infinite loop in mssql MoveNext() fixed when ADODB_FETCH_ASSOC used. Thx to
Josh R, Night_Wulfe#hotmail.com.
</p><p>ChangeTableSQL contributed by Florian Buzin.
</p><p>The odbc_mssql driver now sets CONCAT_NULL_YIELDS_NULL OFF for compat with
mssql driver.
</p>
 
<p><b>3.50 19 May 2003</b></p>
<p>Fixed mssql compat with FreeTDS. FreeTDS does not implement mssql_fetch_assoc().
<p>Merged back connection and recordset code into adodb.inc.php.
<p>ADOdb sessions using oracle clobs contributed by achim.gosse#ddd.de. See adodb-session-clob.php.
<p>Added /s modifier to preg_match everywhere, which ensures that regex does not
stop at /n. Thx Pao-Hsi Huang.
<p>Fixed error in metacolumns() for mssql.
<p>Added time format support for SQLDate.
<p>Image => B added to metatype.
<p>MetaType now checks empty($this->blobSize) instead of empty($this).
<p>Datadict has beta support for informix, sybase (mapped to mssql), db2 and generic
(which is a fudge).
<p>BlobEncode for postgresql uses pg_escape_bytea, if available. Needed for compat
with 7.3.
<p>Added $ADODB_LANG, to support multiple languages in MetaErrorMsg().
<p>Datadict can now parse table definition as declarative text.
<p>For DataDict, oci8 autoincrement trigger missing semi-colon. Fixed.
<p>For DataDict, when REPLACE flag enabled, drop sequence in datadict for autoincrement
field in postgres and oci8.s
<p>Postgresql defaults to template1 database if no database defined in connect/pconnect.
<p>We now clear _resultid in postgresql if query fails.
<p><b>3.40 19 May 2003</b></p>
<p>Added insert_id for odbc_mssql.
<p>Modified postgresql UpdateBlobFile() because it did not work in safe mode.
<p>Now connection object is passed to raiseErrorFn as last parameter. Needed by
StartTrans().
<p>Added StartTrans() and CompleteTrans(). It is recommended that you do not modify
transOff, but use the above functions.
<p>oci8po now obeys ADODB_ASSOC_CASE settings.
<p>Added virtualized error codes, using PEAR DB equivalents. Requires you to manually
include adodb-error.inc.php yourself, with MetaError() and MetaErrorMsg($errno).
<p>GetRowAssoc for mysql and pgsql were flawed. Fix by Ross Smith.
<p>Added to datadict types I1, I2, I4 and I8. Changed datadict type 'T' to map
to timestamp instead of datetime for postgresql.
<p>Error handling in ExecuteSQLArray(), adodb-datadict.inc.php did not work.
<p>We now auto-quote postgresql connection parameters when building connection
string.
<p>Added session expiry notification.
<p>We now test with odbc mysql - made some changes to odbc recordset constructor.
<p>MetaColumns now special cases access and other databases for odbc.
<p><b>3.31 17 March 2003</b></p>
<p>Added row checking for _fetch in postgres.
<p>Added Interval type to MetaType for postgres.
<p>Remapped postgres driver to call postgres7 driver internally.
<p>Adorecordset_array::getarray() did not return array when nRows >= 0.
<p>Postgresql: at times, no error message returned by pg_result_error() but error
message returned in pg_last_error(). Recoded again.
<p>Interbase blob's now use chunking for updateblob.
<p>Move() did not set EOF correctly. Reported by Jorma T.
<p>We properly support mysql timestamp fields when we are creating mysql tables
using the data-dict interface.
<p>Table regex includes backticks character now.
<p><b>3.30 3 March 2003</b></p>
<p>Added $ADODB_EXTENSION and $ADODB_COMPAT_FETCH constant.
<p>Made blank1stItem configurable using syntax "value:text" in GetMenu/GetMenu2.
Thx to Gabriel Birke.
<p>Previously ADOdb differed from the Microsoft standard because it did not define
what to set $this->fields when EOF was reached. Now at EOF, ADOdb sets $this->fields
to false for all databases, which is consist with Microsoft's implementation.
Postgresql and mysql have always worked this way (in 3.11 and earlier). If you
are experiencing compatibility problems (and you are not using postgresql nor
mysql) on upgrading to 3.30, try setting the global variables $ADODB_COUNTRECS
= true (which is the default) and $ADODB_FETCH_COMPAT = true (this is a new
global variable).
<p>We now check both pg_result_error and pg_last_error as sometimes pg_result_error
does not display anything. Iman Mayes
<p> We no longer check for magic quotes gpc in Quote().
<p> Misc fixes for table creation in adodb-datadict.inc.php. Thx to iamsure.
<p> Time calculations use adodb_time library for all negative timestamps due to
problems in Red Hat 7.3 or later. Formerly, only did this for Windows.
<p> In mssqlpo, we now check if $sql in _query is a string before we change ||
to +. This is to support prepared stmts.
<p> Move() and MoveLast() internals changed to support to support EOF and $this->fields
change.
<p> Added ADODB_FETCH_BOTH support to mssql. Thx to Angel Fradejas afradejas#mediafusion.es
<p> We now check if link resource exists before we run mysql_escape_string in
qstr().
<p> Before we flock in csv code, we check that it is not a http url.
<p><b>3.20 17 Feb 2003</b></p>
<p>Added new Data Dictionary classes for creating tables and indexes. Warning
- this is very much alpha quality code. The API can still change. See adodb/tests/test-datadict.php
for more info.
<p>We now ignore $ADODB_COUNTRECS for mysql, because PHP truncates incomplete
recordsets when mysql_unbuffered_query() is called a second time.
<p>Now postgresql works correctly when $ADODB_COUNTRECS = false.
<p>Changed _adodb_getcount to properly support SELECT DISTINCT.
<p>Discovered that $ADODB_COUNTRECS=true has some problems with prepared queries
- suspect PHP bug.
<p>Now GetOne and GetRow run in $ADODB_COUNTRECS=false mode for better performance.
<p>Added support for mysql_real_escape_string() and pg_escape_string() in qstr().
<p>Added an intermediate variable for mysql _fetch() and MoveNext() to store fields,
to prevent overwriting field array with boolean when mysql_fetch_array() returns
false.
<p>Made arrays for getinsertsql and getupdatesql case-insensitive. Suggested by
Tim Uckun" tim#diligence.com
<p><b>3.11 11 Feb 2003</b></p>
<p>Added check for ADODB_NEVER_PERSIST constant in PConnect(). If defined, then
PConnect() will actually call non-persistent Connect().
<p>Modified interbase to properly work with Prepare().
<p>Added $this->ibase_timefmt to allow you to change the date and time format.
<p>Added support for $input_array parameter in CacheFlush().
<p>Added experimental support for dbx, which was then removed when i found that
it was slower than using native calls.
<p>Added MetaPrimaryKeys for mssql and ibase/firebird.
<p>Added new $trim parameter to GetCol and CacheGetCol
<p>Uses updated adodb-time.inc.php 0.06.
<p><b>3.10 27 Jan 2003</b>
<p>Added adodb_date(), adodb_getdate(), adodb_mktime() and adodb-time.inc.php.
<p>For interbase, added code to handle unlimited number of bind parameters. From
Daniel Hasan daniel#hasan.cl.
<p>Added BlobDecode and UpdateBlob for informix. Thx to Fernando Ortiz.
<p>Added constant ADODB_WINDOWS. If defined, means that running on Windows.
<p>Added constant ADODB_PHPVER which stores php version as a hex num. Removed
$ADODB_PHPVER variable.
<p>Felho Bacsi reported a minor white-space regular expression problem in GetInsertSQL.
<p>Modified ADO to use variant to store _affectedRows
<p>Changed ibase to use base class Replace(). Modified base class Replace() to
support ibase.
<p>Changed odbc to auto-detect when 0 records returned is wrong due to bad odbc
drivers.
<p>Changed mssql to use datetimeconvert ini setting only when 4.30 or later (does
not work in 4.23).
<p>ExecuteCursor($stmt, $cursorname, $params) now accepts a new $params array
of additional bind parameters -- William Lovaton walovaton#yahoo.com.mx.
<p>Added support for sybase_unbuffered_query if ADODB_COUNTRECS == false. Thx
to chuck may.
<p>Fixed FetchNextObj() bug. Thx to Jorma Tuomainen.
<p>We now use SCOPE_IDENTITY() instead of @@IDENTITY for mssql - thx to marchesini#eside.it
<p>Changed postgresql movenext logic to prevent illegal row number from being
passed to pg_fetch_array().
<p>Postgresql initrs bug found by "Bogdan RIPA" bripa#interakt.ro $f1 accidentally
named $f
<p><b>3.00 6 Jan 2003</b>
<p>Fixed adodb-pear.inc.php syntax error.
<p>Improved _adodb_getcount() to use SELECT COUNT(*) FROM ($sql) for languages
that accept it.
<p>Fixed _adodb_getcount() caching error.
<p>Added sql to retrive table and column info for odbc_mssql.
<p><strong>2.91 3 Jan 2003</strong>
<p>Revised PHP version checking to use $ADODB_PHPVER with legal values 0x4000,
0x4050, 0x4200, 0x4300.
<p>Added support for bytea fields and oid blobs in postgres by allowing BlobDecode()
to detect and convert non-oid fields. Also added BlobEncode to postgres when
you want to encode oid blobs.
<p>Added blobEncodeType property for connections to inform phpLens what encoding
method to use for blobs.
<p>Added BlobDecode() and BlobEncode() to base ADOConnection class.
<p>Added umask() to _gencachename() when creating directories.
<p>Added charPage for ado drivers, so you can set the code page.
<pre>
$conn->charPage = CP_UTF8;
$conn->Connect($dsn);
</pre>
<p>Modified _seek in mysql to check for num rows=0.
<p>Added to metatypes new informix types for IDS 9.30. Thx Fernando Ortiz.
<p>_maxrecordcount returned in CachePageExecute $rsreturn
<p>Fixed sybase cacheselectlimit( ) problems
<p>MetaColumns() max_length should use precision for types X and C for ms access.
Fixed.
<p>Speedup of odbc non-SELECT sql statements.
<p>Added support in MetaColumns for Wide Char types for ODBC. We halve max_length
if unicode/wide char.
<p>Added 'B' to types handled by GetUpdateSQL/GetInsertSQL.
<p>Fixed warning message in oci8 driver with $persist variable when using PConnect.
<p><b>2.90 11 Dec 2002</b>
<p>Mssql and mssqlpo and oci8po now support ADODB_ASSOC_CASE.
<p>Now MetaType() can accept a field object as the first parameter.
<p>New $arr = $db-&gt;ServerInfo( ) function. Returns $arr['description'] which
is the string description, and $arr['version'].
<p>PostgreSQL and MSSQL speedups for insert/updates.
<p> Implemented new SetFetchMode() that removes the need to use $ADODB_FETCH_MODE.
Each connection has independant fetchMode.
<p>ADODB_ASSOC_CASE now defaults to 2, use native defaults. This is because we
would break backward compat for too many applications otherwise.
<p>Patched encrypted sessions to use replace()
<p>The qstr function supports quoting of nulls when escape character is \
<p>Rewrote bits and pieces of session code to check for time synch and improve
reliability.
<p>Added property ADOConnection::hasTransactions = true/false;
<p>Added CreateSequence and DropSequence functions
<p>Found misplaced MoveNext() in adodb-postgres.inc.php. Fixed.
<p>Sybase SelectLimit not reliable because 'set rowcount' not cached - fixed.
<p>Moved ADOConnection to adodb-connection.inc.php and ADORecordSet to adodb-recordset.inc.php.
This allows us to use doxygen to generate documentation. Doxygen doesn't like
the classes in the main adodb.inc.php file for some mysterious reason.
<p><b>2.50, 14 Nov 2002</b>
<p>Added transOff and transCnt properties for disabling (transOff = true) and
tracking transaction status (transCnt>0).
<p>Added inputarray handling into _adodb_pageexecute_all_rows - "Ross Smith" RossSmith#bnw.com.
<p>Fixed postgresql inconsistencies in date handling.
<p>Added support for mssql_fetch_assoc.
<p>Fixed $ADODB_FETCH_MODE bug in odbc MetaTables() and MetaPrimaryKeys().
<p>Accidentally declared UnixDate() twice, making adodb incompatible with php
4.3.0. Fixed.
<p>Fixed pager problems with some databases that returned -1 for _currentRow on
MoveLast() by switching to MoveNext() in adodb-lib.inc.php.
<p>Also fixed uninited $discard in adodb-lib.inc.php.
<p><b>2.43, 25 Oct 2002</b></p>
Added ADODB_ASSOC_CASE constant to better support ibase and odbc field names.
<p>Added support for NConnect() for oracle OCINLogin.
<p>Fixed NumCols() bug.
<p>Changed session handler to use Replace() on write.
<p>Fixed oci8 SelectLimit aggregate function bug again.
<p>Rewrote pivoting code.
<p><b>2.42, 4 Oct 2002</b></p>
<p>Fixed ibase_fetch() problem with nulls. Also interbase now does automatic blob
decoding, and is backward compatible. Suggested by Heinz Hombergs heinz#hhombergs.de.
<p>Fixed postgresql MoveNext() problems when called repeatedly after EOF. Also
suggested by Heinz Hombergs.
<p>PageExecute() does not rewrite queries if SELECT DISTINCT is used. Requested
by hans#velum.net
<p>Added additional fixes to oci8 SelectLimit handling with aggregate functions
- thx to Christian Bugge for reporting the problem.
<p><b>2.41, 2 Oct 2002</b></p>
<p>Fixed ADODB_COUNTRECS bug in odbc. Thx to Joshua Zoshi jzoshi#hotmail.com.
<p>Increased buffers for adodb-csvlib.inc.php for extremely long sql from 8192
to 32000.
<p>Revised pivottable.inc.php code. Added better support for aggregate fields.
<p>Fixed mysql text/blob types problem in MetaTypes base class - thx to horacio
degiorgi.
<p>Added SQLDate($fmt,$date) function, which allows an sql date format string
to be generated - useful for group by's.
<p>Fixed bug in oci8 SelectLimit when offset>100.
<p><b>2.40 4 Sept 2002</b></p>
<p>Added new NLS_DATE_FORMAT property to oci8. Suggested by Laurent NAVARRO ln#altidev.com
<p>Now use bind parameters in oci8 selectlimit for better performance.
<p>Fixed interbase replaceQuote for dialect != 1. Thx to "BEGUIN Pierre-Henri
- INFOCOB" phb#infocob.com.
<p>Added white-space check to QA.
<p>Changed unixtimestamp to support fractional seconds (we always round down/floor
the seconds). Thanks to beezly#beezly.org.uk.
<p>Now you can set the trigger_error type your own user-defined type in adodb-errorhandler.inc.php.
Suggested by Claudio Bustos clbustos#entelchile.net.
<p>Added recordset filters with rsfilter.inc.php.
<p>$conn->_rs2rs does not create a new recordset when it detects it is of type
array. Some trickery there as there seems to be a bug in Zend Engine
<p>Added render_pagelinks to adodb-pager.inc.php. Code by "Pablo Costa" pablo#cbsp.com.br.
<p>MetaType() speedup in adodb.inc.php by using hashing instead of switch. Best
performance if constant arrays are supported, as they are in PHP5.
<p>adodb-session.php now updates only the expiry date if the crc32 check indicates
that the data has not been modified.
<p><b>2.31 20 Aug 2002</b></p>
<p>Made changes to pivottable.inc.php due to daniel lucuzaeu's suggestions (we sum the pivottable column if desired).
<p>Fixed ErrorNo() in postgres so it does not depend on _errorMsg property.
<p>Robert Tuttle added support for oracle cursors. See ExecuteCursor().
<p>Fixed Replace() so it works with mysql when updating record where data has not changed. Reported by
Cal Evans (cal#calevans.com).
<p><b>2.30 1 Aug 2002</b></p>
<p>Added pivottable.inc.php. Thanks to daniel.lucazeau#ajornet.com for the original
concept.
<p>Added ADOConnection::outp($msg,$newline) to output error and debugging messages. Now
you can override this using the ADODB_OUTP constant and use your own output handler.
<p>Changed == to === for 'null' comparison. Reported by ericquil#yahoo.com
<p>Fixed mssql SelectLimit( ) bug when distinct used.
<p><b>2.30 1 Aug 2002</b></p>
<p>New GetCol() and CacheGetCol() from ross#bnw.com that returns the first field as a 1 dim array.
<p>We have an empty recordset, but RecordCount() could return -1. Fixed. Reported by "Jonathan Polansky" jonathan#polansky.com.
<p>We now check for session variable changes using strlen($sessval).crc32($sessval).
Formerly we only used crc32().
<p>Informix SelectLimit() problem with $ADODB_COUNTRECS fixed.
<p>Fixed informix SELECT FIRST x DISTINCT, and not SELECT DISTINCT FIRST x - reported by F Riosa
<p>Now default adodb error handlers ignores error if @ used.
<p>If you set $conn->autoRollback=true, we auto-rollback persistent connections for odbc, mysql, oci8, mssql.
Default for autoRollback is false. No need to do so for postgres.
As interbase requires a transaction id (what a flawed api), we don't do it for interbase.
<p>Changed PageExecute() to use non-greedy preg_match when searching for "FROM" keyword.
<p><b>2.20 9 July 2002</b></p>
<p>Added CacheGetOne($secs2cache,$sql), CacheGetRow($secs2cache,$sql), CacheGetAll($secs2cache,$sql).
<p>Added $conn->OffsetDate($dayFraction,$date=false) to generate sql that calcs
date offsets. Useful for scheduling appointments.
<p>Added connection properties: leftOuter, rightOuter that hold left and right
outer join operators.
<p>Added connection property: ansiOuter to indicate whether ansi outer joins supported.
<p>New driver <i>mssqlpo</i>, the portable mssql driver, which converts string
concat operator from || to +.
<p>Fixed ms access bug - SelectLimit() did not support ties - fixed.
<p>Karsten Kraus (Karsten.Kraus#web.de), contributed error-handling code to ADONewConnection.
Unfortunately due to backward compat problems, had to rollback most of the changes.
<p>Added new parameter to GetAssoc() to allow returning an array of key-value pairs,
ignoring any additional columns in the recordset. Off by default.
<p>Corrected mssql $conn->sysDate to return only date using convert().
<p>CacheExecute() improved debugging output.
<p>Changed rs2html() so newlines are converted to BR tags. Also optimized rs2html() based
on feedback by "Jerry Workman" jerry#mtncad.com.
<p>Added support for Replace() with Interbase, using DELETE and INSERT.
<p>Some minor optimizations (mostly removing & references when passing arrays).
<p>Changed GenID() to allows id's larger than the size of an integer.
<p>Added force_session property to oci8 for better updateblob() support.
<p>Fixed PageExecute() which did not work properly with sql containing GROUP BY.
<p><b>2.12 12 June 2002</b></p>
<p>Added toexport.inc.php to export recordsets in CSV and tab-delimited format.
<p>CachePageExecute() does not work - fixed - thx John Huong.
<p>Interbase aliases not set properly in FetchField() - fixed. Thx Stefan Goethals.
<p>Added cache property to adodb pager class. The number of secs to cache recordsets.
<p>SQL rewriting bug in pageexecute() due to skipping of newlines due to missing /s modifier. Fixed.
<p>Max size of cached recordset due to a bug was 256000 bytes. Fixed.
<p>Speedup of 1st invocation of CacheExecute() by tuning code.
<p>We compare $rewritesql with $sql in pageexecute code in case of rewrite failure.
<p><b>2.11 7 June 2002</b></p>
<p>Fixed PageExecute() rewrite sql problem - COUNT(*) and ORDER BY don't go together with
mssql, access and postgres. Thx to Alexander Zhukov alex#unipack.ru
<p>DB2 support for CHARACTER type added - thx John Huong huongch#bigfoot.com
<p>For ado, $argProvider not properly checked. Fixed - kalimero#ngi.it
<p>Added $conn->Replace() function for update with automatic insert if the record does not exist.
Supported by all databases except interbase.
<p><b>2.10 4 June 2002</b></p>
<p>Added uniqueSort property to indicate mssql ORDER BY cols must be unique.
<p>Optimized session handler by crc32 the data. We only write if session data has changed.
<p>adodb_sess_read in adodb-session.php now returns ''correctly - thanks to Jorma Tuomainen, webmaster#wizactive.com
<p>Mssql driver did not throw EXECUTE errors correctly because ErrorMsg() and ErrorNo() called in wrong order.
Pointed out by Alexios Fakos. Fixed.
<p>Changed ado to use client cursors. This fixes BeginTran() problems with ado.
<p>Added handling of timestamp type in ado.
<p>Added to ado_mssql support for insert_id() and affected_rows().
<p>Added support for mssql.datetimeconvert=0, available since php 4.2.0.
<p>Made UnixDate() less strict, so that the time is ignored if present.
<p>Changed quote() so that it checks for magic_quotes_gpc.
<p>Changed maxblobsize for odbc to default to 64000.
<p><b>2.00 13 May 2002</b></p>
<p>Added drivers <i>informix72</i> for pre-7.3 versions, and <i>oci805</i> for
oracle 8.0.5, and postgres64 for postgresql 6.4 and earlier. The postgres and postgres7 drivers
are now identical.
<p>Interbase now partially supports ADODB_FETCH_BOTH, by defaulting to ASSOC mode.
<p>Proper support for blobs in mssql. Also revised blob support code
is base class. Now UpdateBlobFile() calls UpdateBlob() for consistency.
<p>Added support for changed odbc_fetch_into api in php 4.2.0
with $conn-&gt;_has_stupid_odbc_fetch_api_change.
<p>Fixed spelling of tablock locking hint in GenID( ) for mssql.
<p>Added RowLock( ) to several databases, including oci8, informix, sybase, etc.
Fixed where error in mssql RowLock().
<p>Added sysDate and sysTimeStamp properties to most database drivers. These are the sql
functions/constants for that database that return the current date and current timestamp, and
are useful for portable inserts and updates.
<p>Support for RecordCount() caused date handling in sybase and mssql to break.
Fixed, thanks to Toni Tunkkari, by creating derived classes for ADORecordSet_array for
both databases. Generalized using arrayClass property. Also to support RecordCount(),
changed metatype handling for ado drivers. Now the type returned in FetchField
is no longer a number, but the 1-char data type returned by MetaType.
At the same time, fixed a lot of date handling. Now mssql support dmy and mdy date formats.
Also speedups in sybase and mssql with preg_match and ^ in date/timestamp handling.
Added support in sybase and mssql for 24 hour clock in timestamps (no AM/PM).
<p>Extensive revisions to informix driver - thanks to Samuel CARRIERE samuel_carriere#hotmail.com
<p>Added $ok parameter to CommitTrans($ok) for easy rollbacks.
<p>Fixed odbc MetaColumns and MetaTables to save and restore $ADODB_FETCH_MODE.
<p>Some odbc drivers did not call the base connection class constructor. Fixed.
<p>Fixed regex for GetUpdateSQL() and GetInsertSQL() to support more legal character combinations.
 
<p><b>1.99 21 April 2002</b></p>
<p>Added emulated RecordCount() to all database drivers if $ADODB_COUNTRECS = true
(which it is by default). Inspired by Cristiano Duarte (cunha17#uol.com.br).
<p>Unified stored procedure support for mssql and oci8. Parameter() and PrepareSP()
functions implemented.
<p>Added support for SELECT FIRST in informix, modified hasTop property to support
this.
<p>Changed csv driver to handle updates/deletes/inserts properly (when Execute() returns true).
Bind params also work now, and raiseErrorFn with csv driver. Added csv driver to QA process.
<p>Better error checking in oci8 UpdateBlob() and UpdateBlobFile().
<p>Added TIME type to MySQL - patch by Manfred h9125297#zechine.wu-wien.ac.at
<p>Prepare/Execute implemented for Interbase/Firebird
<p>Changed some regular expressions to be anchored by /^ $/ for speed.
<p>Added UnixTimeStamp() and UnixDate() to ADOConnection(). Now these functions
are in both ADOConnection and ADORecordSet classes.
<p>Empty recordsets were not cached - fixed.
<p>Thanks to Gaetano Giunta (g.giunta#libero.it) for the oci8 code review. We
didn't agree on everything, but i hoped we agreed to disagree!
<p><b>1.90 6 April 2002</b></p>
<p>Now all database drivers support fetch modes ADODB_FETCH_NUM and ADODB_FETCH_ASSOC, though
still not fully tested. Eg. Frontbase, Sybase, Informix.
<p>NextRecordSet() support for mssql. Contributed by "Sven Axelsson" sven.axelsson#bokochwebb.se
<p>Added blob support for SQL Anywhere. Contributed by Wade Johnson wade#wadejohnson.de
<p>Fixed some security loopholes in server.php. Server.php also supports fetch mode.
<p>Generalized GenID() to support odbc and mssql drivers. Mssql no longer generates GUID's.
<p>Experimental RowLock($table,$where) for mssql.
<p>Properly implemented Prepare() in oci8 and ODBC.
<p>Added Bind() support to oci8 to support Prepare().
<p>Improved error handler. Catches CacheExecute() and GenID() errors now.
<p>Now if you are running php from the command line, debugging messages do not output html formating.
Not 100% complete, but getting there.
<p><b>1.81 22 March 2002</b></p>
<p>Restored default $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT for backward compatibility.
<p>SelectLimit for oci8 improved - Our FIRST_ROWS optimization now does not overwrite existing hint.
<p>New Sybase SQL Anywhere driver. Contributed by Wade Johnson wade#wadejohnson.de
<p><b>1.80 15 March 2002</b></p>
<p>Redesigned directory structure of ADOdb files. Added new driver directory where
all database drivers reside.
<p>Changed caching algorithm to create subdirectories. Now we scale better.
<p>Informix driver now supports insert_id(). Contribution by "Andrea Pinnisi" pinnisi#sysnet.it
<p>Added experimental ISO date and FetchField support for informix.
<p>Fixed a quoting bug in Execute() with bind parameters, causing problems with blobs.
<p>Mssql driver speedup by 10-15%.
<p>Now in CacheExecute($secs2cache,$sql,...), $secs2cache is optional. If missing, it will
take the value defined in $connection->cacheSecs (default is 3600 seconds). Note that
CacheSelectLimit(), the secs2cache is still compulsory - sigh.
<p>Sybase SQL Anywhere driver (using ODBC) contributed by Wade Johnson wade#wadejohnson.de
<p><b>1.72 8 March 2002</b></p>
<p>Added @ when returning Fields() to prevent spurious error - "Michael William Miller" mille562#pilot.msu.edu
<p>MetaDatabases() for postgres contributed by Phil pamelant#nerim.net
<p>Mitchell T. Young (mitch#youngfamily.org) contributed informix driver.
<p>Fixed rs2html() problem. I cannot reproduce, so probably a problem with pre PHP 4.1.0 versions,
when supporting new ADODB_FETCH_MODEs.
<p>Mattia Rossi (mattia#technologist.com) contributed BlobDecode() and UpdateBlobFile() for postgresql
using the postgres specific pg_lo_import()/pg_lo_open() - i don't use them but hopefully others will
find this useful. See <a href="http://phplens.com/lens/lensforum/msgs.php?id=1262">this posting</a>
for an example of usage.
<p>Added UpdateBlobFile() for uploading files to a database.
<p>Made UpdateBlob() compatible with oci8po driver.
<p>Added noNullStrings support to oci8 driver. Oracle changes all ' ' strings to nulls,
so you need to set strings to ' ' to prevent the nullifying of strings. $conn->noNullStrings = true;
will do this for you automatically. This is useful when you define a char column as NOT NULL.
<p>Fixed UnixTimeStamp() bug - wasn't setting minutes and seconds properly. Patch from Agusti Fita i Borrell agusti#anglatecnic.com.
<p>Toni Tunkkari added patch for sybase dates. Problem with spaces in day part of date fixed.
<p><b>1.71 18 Jan 2002</b></p>
<p>Sequence start id support. Now $conn->Gen_ID('seqname', 50) to start sequence from 50.
<p>CSV driver fix for selectlimit, from Andreas - akaiser#vocote.de.
<P>Gam3r spotted that a global variable was undefined in the session handler.
<p>Mssql date regex had error. Fixed - reported by Minh Hoang vb_user#yahoo.com.
<p>DBTimeStamp() and DBDate() now accept iso dates and unix timestamps. This means
that the PostgreSQL handling of dates in GetInsertSQL() and GetUpdateSQL() can
be removed. Also if these functions are passed '' or null or false, we return a SQL null.
<p>GetInsertSQL() and GetUpdateSQL() now accept a new parameter, $magicq to
indicate whether quotes should be inserted based on magic quote settings - suggested by
dj#4ict.com.
<p>Reformated docs slightly based on suggestions by Chris Small.
<p><b>1.65 28 Dec 2001</b></p>
<p>Fixed borland_ibase class naming bug.
<p>Now instead of using $rs->fields[0] internally, we use reset($rs->fields) so
that we are compatible with ADODB_FETCH_ASSOC mode. Reported by Nico S.
<p>Changed recordset constructor and _initrs() for oci8 so that it returns the field definitions even
if no rows in the recordset. Reported by Rick Hickerson (rhickers#mv.mv.com).
<p>Improved support for postgresql in GetInsertSQL and GetUpdateSQL by
"mike" mike#partner2partner.com and "Ryan Bailey" rebel#windriders.com
<p><b>1.64 20 Dec 2001</b></p>
<p>Danny Milosavljevic &lt;danny.milo#gmx.net> added some patches for MySQL error handling
and displaying default values.
<p>Fixed some ADODB_FETCH_BOTH inconsistencies in odbc and interbase.
<p>Added more tests to test suite to cover ADODB_FETCH_* and ADODB_ERROR_HANDLER.
<p>Added firebird (ibase) driver
<p>Added borland_ibase driver for interbase 6.5
<p><b>1.63 13 Dec 2001</b></p>
Absolute to the adodb-lib.inc.php file not set properly. Fixed.<p>
 
<p><b>1.62 11 Dec 2001</b></p>
<p>Major speedup of ADOdb for low-end web sites by reducing the php code loading and compiling
cycle. We conditionally compile not so common functions.
Moved csv code to adodb-csvlib.inc.php to reduce adodb.inc.php parsing. This file
is loaded only when the csv/proxy driver is used, or CacheExecute() is run.
Also moved PageExecute(), GetSelectSQL() and GetUpdateSQL() core code to adodb-lib.inc.php.
This reduced the 70K main adodb.inc.php file to 55K, and since at least 20K of the file
is comments, we have reduced 50K of code in adodb.inc.php to 35K. There
should be 35% reduction in memory and thus 35% speedup in compiling the php code for the
main adodb.inc.php file.
<p>Highly tuned SelectLimit() for oci8 for massive speed improvements on large files.
Selecting 20 rows starting from the 20,000th row of a table is now 7 times faster.
Thx to Tomas V V Cox.
<p>Allow . and # in table definitions in GetInsertSQL and GetUpdateSQL.
See ADODB_TABLE_REGEX constant. Thx to Ari Kuorikoski.
<p>Added ADODB_PREFETCH_ROWS constant, defaulting to 10. This determines the number
of records to prefetch in a SELECT statement. Only used by oci8.</p>
<p>Added high portability Oracle class called oci8po. This uses ? for bind variables, and
lower cases column names.</p>
<p>Now all database drivers support $ADODB_FETCH_MODE, including interbase, ado, and odbc:
ADODB_FETCH_NUM and ADODB_FETCH_ASSOC. ADODB_FETCH_BOTH is not fully implemented for all
database drivers.
<p><b>1.61 Nov 2001</b></p>
<p>Added PO_RecordCount() and PO_Insert_ID(). PO stands for portable. Pablo Roca
[pabloroca#mvps.org]</p>
<p>GenID now returns 0 if not available. Safer is that you should check $conn->hasGenID
for availability.</p>
<p>M'soft ADO we now correctly close recordset in _close() peterd#telephonetics.co.uk</p>
<p>MSSQL now supports GenID(). It generates a 16-byte GUID from mssql newid()
function.</p>
<p>Changed ereg_replace to preg_replace in SelectLimit. This is a fix for mssql.
Ereg doesn't support t or n! Reported by marino Carlos xaplo#postnuke-espanol.org</p>
<p>Added $recordset->connection. This is the ADOConnection object for the recordset.
Works with cached and normal recordsets. Surprisingly, this had no affect on performance!</p>
<p><b>1.54 15 Nov 2001</b></p>
Fixed some more bugs in PageExecute(). I am getting sick of bug in this and will have to
reconsider my QA here. The main issue is that I don't use PageExecute() and
to check whether it is working requires a visual inspection of the html generated currently.
It is possible to write a test script but it would be quite complicated :(
<p> More speedups of SelectLimit() for DB2, Oci8, access, vfp, mssql.
<p>
 
<p><b>1.53 7 Nov 2001</b></p>
Added support for ADODB_FETCH_ASSOC for ado and odbc drivers.<p>
Tuned GetRowAssoc(false) in postgresql and mysql.<p>
Stephen Van Dyke contributed ADOdb icon, accepted with some minor mods.<p>
Enabled Affected_Rows() for postgresql<p>
Speedup for Concat() using implode() - Benjamin Curtis ben_curtis#yahoo.com<p>
Fixed some more bugs in PageExecute() to prevent infinite loops<p>
<p><b>1.52 5 Nov 2001</b></p>
Spelling error in CacheExecute() caused it to fail. $ql should be $sql in line 625!<p>
Added fixes for parsing [ and ] in GetUpdateSQL().
<p><b>1.51 5 Nov 2001</b></p>
<p>Oci8 SelectLimit() speedup by using OCIFetch().
<p>Oci8 was mistakenly reporting errors when $db->debug = true.
<p>If a connection failed with ODBC, it was not correctly reported - fixed.
<p>_connectionID was inited to -1, changed to false.
<p>Added $rs->FetchRow(), to simplify API, ala PEAR DB
<p>Added PEAR DB compat mode, which is still faster than PEAR! See adodb-pear.inc.php.
<p>Removed postgres pconnect debugging statement.
<p><b>1.50 31 Oct 2001</b></p>
<p>ADOdbConnection renamed to ADOConnection, and ADOdbFieldObject to ADOFieldObject.
<p>PageExecute() now checks for empty $rs correctly, and the errors in the docs on this subject have been fixed.
<p>odbc_error() does not return 6 digit error correctly at times. Implemented workaround.
<p>Added ADORecordSet_empty class. This will speedup INSERTS/DELETES/UPDATES because the return
object created is much smaller.
<p>Added Prepare() to odbc, and oci8 (but doesn't work properly for oci8 still).
<p>Made pgsql a synonym for postgre7, and changed SELECT LIMIT to use OFFSET for compat with
postgres 7.2.
<p>Revised adodb-cryptsession.php thanks to Ari.
<p>Set resources to false on _close, to force freeing of resources.
<p>Added adodb-errorhandler.inc.php, adodb-errorpear.inc.php and raiseErrorFn on Freek's urging.
<p>GetRowAssoc($toUpper=true): $toUpper added as default.
<p>Errors when connecting to a database were not captured formerly. Now we do it correctly.
<p><b>1.40 19 September 2001</b></p>
<p>PageExecute() to implement page scrolling added. Code and idea by Iv&aacute;n Oliva.</p>
<p>Some minor postgresql fixes.</p>
<p>Added sequence support using GenID() for postgresql, oci8, mysql, interbase.</p>
<p>Added UpdateBlob support for interbase (untested).</p>
<p>Added encrypted sessions (see adodb-cryptsession.php). By Ari Kuorikoski &lt;kuoriari#finebyte.com></p>
<p><b>1.31 21 August 2001</b></p>
<p>Many bug fixes thanks to "GaM3R (Cameron)" &lt;gamr#outworld.cx>. Some session changes due to Gam3r.
<p>Fixed qstr() to quote also.
<p>rs2html() now pretty printed.
<p>Jonathan Younger jyounger#unilab.com contributed the great idea GetUpdateSQL() and GetInsertSQL() which
generates SQL to update and insert into a table from a recordset. Modify the recordset fields
array, then can this function to generate the SQL (the SQL is not executed).
<p>"Nicola Fankhauser" &lt;nicola.fankhauser#couniq.com> found some bugs in date handling for mssql.</p>
<p>Added minimal Oracle support for LOBs. Still under development.</p>
Added $ADODB_FETCH_MODE so you can control whether recordsets return arrays which are
numeric, associative or both. This is a global variable you set. Currently only MySQL, Oci8, Postgres
drivers support this.
<p>PostgreSQL properly closes recordsets now. Reported by several people.
<p>
Added UpdateBlob() for Oracle. A hack to make it easier to save blobs.
<p>
Oracle timestamps did not display properly. Fixed.
<p><b>1.20 6 June 2001</b></p>
<p>Now Oracle can connect using tnsnames.ora or server and service name</p>
<p>Extensive Oci8 speed optimizations.
Oci8 code revised to support variable binding, and /*+ FIRST_ROWS */ hint.</p>
<p>Worked around some 4.0.6 bugs in odbc_fetch_into().</p>
<p>Paolo S. Asioli paolo.asioli#libero.it suggested GetRowAssoc().</p>
<p>Escape quotes for oracle wrongly set to '. Now '' is used.</p>
<p>Variable binding now works in ODBC also.</p>
<p>Jumped to version 1.20 because I don't like 13 :-)</p>
<p><b>1.12 6 June 2001</b></p>
<p>Changed $ADODB_DIR to ADODB_DIR constant to plug a security loophole.</p>
<p>Changed _close() to close persistent connections also. Prevents connection leaks.</p>
<p>Major revision of oracle and oci8 drivers.
Added OCI_RETURN_NULLS and OCI_RETURN_LOBS to OCIFetchInto(). BLOB, CLOB and VARCHAR2 recognition
in MetaType() improved. MetaColumns() returns columns in correct sort order.</p>
<p>Interbase timestamp input format was wrong. Fixed.</p>
<p><b>1.11 20 May 2001</b></p>
<p>Improved file locking for Windows.</p>
<p>Probabilistic flushing of cache to avoid avalanche updates when cache timeouts.</p>
<p>Cached recordset timestamp not saved in some scenarios. Fixed.</p>
<p><b>1.10 19 May 2001</b></p>
<p>Added caching. CacheExecute() and CacheSelectLimit().
<p>Added csv driver. See <a href="http://php.weblogs.com/adodb_csv">http://php.weblogs.com/ADODB_csv</a>.
<p>Fixed SelectLimit(), SELECT TOP not working under certain circumstances.
<p>Added better Frontbase support of MetaTypes() by Frank M. Kromann.
<p><b>1.01 24 April 2001</b></p>
<p>Fixed SelectLimit bug. not quoted properly.
<p>SelectLimit: SELECT TOP -1 * FROM TABLE not support by Microsoft. Fixed.</p>
<p>GetMenu improved by glen.davies#cce.ac.nz to support multiple hilited items<p>
<p>FetchNextObject() did not work with only 1 record returned. Fixed bug reported by $tim#orotech.net</p>
<p>Fixed mysql field max_length problem. Fix suggested by Jim Nicholson (jnich#att.com)</p>
<p><b>1.00 16 April 2001</b></p>
<p>Given some brilliant suggestions on how to simplify ADOdb by akul. You no longer need to
setup $ADODB_DIR yourself, and ADOLoadCode() is automatically called by ADONewConnection(),
simplifying the startup code.</p>
<p>FetchNextObject() added. Suggested by Jakub Marecek. This makes FetchObject() obsolete, as
this is more flexible and powerful.</p>
<p>Misc fixes to SelectLimit() to support Access (top must follow distinct) and Fields()
in the array recordset. From Reinhard Balling.</p>
<p><b>0.96 27 Mar 2001</b></p>
<p>ADOConnection Close() did not return a value correctly. Thanks to akul#otamedia.com.</p>
<p>When the horrible magic_quotes is enabled, back-slash () is changed to double-backslash (\).
This doesn't make sense for Microsoft/Sybase databases. We fix this in qstr().</p>
<p>Fixed Sybase date problem in UnixDate() thanks to Toni Tunkkari. Also fixed MSSQL problem
in UnixDate() - thanks to milhouse31#hotmail.com.</p>
<p>MoveNext() moved to leaf classes for speed in MySQL/PostgreSQL. 10-15% speedup.</p>
<p>Added null handling in bindInputArray in Execute() -- Ron Baldwin suggestion.</p>
<p>Fixed some option tags. Thanks to john#jrmstudios.com.</p>
<p><b>0.95 13 Mar 2001</b></p>
<p>Added postgres7 database driver which supports LIMIT and other version 7 stuff in the future.</p>
<p>Added SelectLimit to ADOConnection to simulate PostgreSQL's "select * from table limit 10 offset 3".
Added helper function GetArrayLimit() to ADORecordSet.</p>
<p>Fixed mysql metacolumns bug. Thanks to Freek Dijkstra (phpeverywhere#macfreek.com).</p>
<p>Also many PostgreSQL changes by Freek. He almost rewrote the whole PostgreSQL driver!</p>
<p>Added fix to input parameters in Execute for non-strings by Ron Baldwin.</p>
<p>Added new metatype, X for TeXt. Formerly, metatype B for Blob also included
text fields. Now 'B' is for binary/image data. 'X' for textual data.</p>
<p>Fixed $this->GetArray() in GetRows().</p>
<p>Oracle and OCI8: 1st parameter is always blank -- now warns if it is filled.</p>
<p>Now <i>hasLimit</i> and <i>hasTop</i> added to indicate whether
SELECT * FROM TABLE LIMIT 10 or SELECT TOP 10 * FROM TABLE are supported.</p>
<p><b>0.94 04 Feb 2001</b></p>
<p>Added ADORecordSet::GetRows() for compatibility with Microsoft ADO. Synonym for GetArray().</p>
<p>Added new metatype 'R' to represent autoincrement numbers.</p>
<p>Added ADORecordSet.FetchObject() to return a row as an object.</p>
<p>Finally got a Linux box to test PostgreSql. Many fixes.</p>
<p>Fixed copyright misspellings in 0.93.</p>
<p>Fixed mssql MetaColumns type bug.</p>
<p>Worked around odbc bug in PHP4 for sessions.</p>
<p>Fixed many documentation bugs (affected_rows, metadatabases, qstr).</p>
<p>Fixed MySQL timestamp format (removed comma).</p>
<p>Interbase driver did not call ibase_pconnect(). Fixed.</p>
<p><b>0.93 18 Jan 2002</b></p>
<p>Fixed GetMenu bug.</p>
<p>Simplified Interbase commit and rollback.</p>
<p>Default behaviour on closing a connection is now to rollback all active transactions.</p>
<p>Added field object handling for array recordset for future XML compatibility.</p>
<p>Added arr2html() to convert array to html table.</p>
<p><b>0.92 2 Jan 2002</b></p>
<p>Interbase Commit and Rollback should be working again.</p>
<p>Changed initialisation of ADORecordSet. This is internal and should not affect users. We
are doing this to support cached recordsets in the future.</p>
 
<p>Implemented ADORecordSet_array class. This allows you to simulate a database recordset
with an array.</p>
<p>Added UnixDate() and UnixTimeStamp() to ADORecordSet.</p>
<p><b>0.91 21 Dec 2000</b></p>
<p>Fixed ODBC so ErrorMsg() is working.</p>
<p>Worked around ADO unrecognised null (0x1) value problem in COM.</p>
<p>Added Sybase support for FetchField() type</p>
<p>Removed debugging code and unneeded html from various files</p>
<p>Changed to javadoc style comments to adodb.inc.php.</p>
<p>Added maxsql as synonym for mysqlt</p>
<p>Now ODBC downloads first 8K of blob by default
<p><b>0.90 15 Nov 2000</b></p>
<p>Lots of testing of Microsoft ADO. Should be more stable now.</p>
<p>Added $ADODB_COUNTREC. Set to false for high speed selects.</p>
<p>Added Sybase support. Contributed by Toni Tunkkari (toni.tunkkari#finebyte.com). Bug in Sybase
API: GetFields is unable to determine date types.</p>
<p>Changed behaviour of RecordSet.GetMenu() to support size parameter (listbox) properly.</p>
<p>Added emptyDate and emptyTimeStamp to RecordSet class that defines how to represent
empty dates.</p>
<p>Added MetaColumns($table) that returns an array of ADOFieldObject's listing
the columns of a table.</p>
<p>Added transaction support for PostgresSQL -- thanks to "Eric G. Werk" egw#netguide.dk.</p>
<p>Added adodb-session.php for session support.</p>
<p><b>0.80 30 Nov 2000</b></p>
<p>Added support for charSet for interbase. Implemented MetaTables for most databases.
PostgreSQL more extensively tested.</p>
<p><b>0.71 22 Nov 2000</b></p>
<p>Switched from using require_once to include/include_once for backward compatability with PHP 4.02 and earlier.</p>
<p><b>0.70 15 Nov 2000</b></p>
<p>Calls by reference have been removed (call_time_pass_reference=Off) to ensure compatibility with future versions of PHP,
except in Oracle 7 driver due to a bug in php_oracle.dll.</p>
<p>PostgreSQL database driver contributed by Alberto Cerezal (acerezalp#dbnet.es).
</p>
<p>Oci8 driver for Oracle 8 contributed by George Fourlanos (fou#infomap.gr).</p>
<p>Added <i>mysqlt</i> database driver to support MySQL 3.23 which has transaction
support. </p>
<p>Oracle default date format (DD-MON-YY) did not match ADOdb default date format (which is YYYY-MM-DD). Use ALTER SESSION to force the default date.</p>
<p>Error message checking is now included in test suite.</p>
<p>MoveNext() did not check EOF properly -- fixed.</p>
<p><b>0.60 Nov 8 2000</b></p>
<p>Fixed some constructor bugs in ODBC and ADO. Added ErrorNo function to ADOConnection
class. </p>
<p><b>0.51 Oct 18 2000</b></p>
<p>Fixed some interbase bugs.</p>
<p><b>0.50 Oct 16 2000</b></p>
<p>Interbase commit/rollback changed to be compatible with PHP 4.03. </p>
<p>CommitTrans( ) will now return true if transactions not supported. </p>
<p>Conversely RollbackTrans( ) will return false if transactions not supported.
</p>
<p><b>0.46 Oct 12</b></p>
Many Oracle compatibility issues fixed.
<p><b>0.40 Sept 26</b></p>
<p>Many bug fixes</p>
<p>Now Code for BeginTrans, CommitTrans and RollbackTrans is working. So is the Affected_Rows
and Insert_ID. Added above functions to test.php.</p>
<p>ADO type handling was busted in 0.30. Fixed.</p>
<p>Generalised Move( ) so it works will all databases, including ODBC.</p>
<p><b>0.30 Sept 18</b></p>
<p>Renamed ADOLoadDB to ADOLoadCode. This is clearer.</p>
<p>Added BeginTrans, CommitTrans and RollbackTrans functions.</p>
<p>Added Affected_Rows() and Insert_ID(), _affectedrows() and _insertID(), ListTables(),
ListDatabases(), ListColumns().</p>
<p>Need to add New_ID() and hasInsertID and hasAffectedRows, autoCommit </p>
<p><b>0.20 Sept 12</b></p>
<p>Added support for Microsoft's ADO.</p>
<p>Added new field to ADORecordSet -- canSeek</p>
<p>Added new parameter to _fetch($ignore_fields = false). Setting to true will
not update fields array for faster performance.</p>
<p>Added new field to ADORecordSet/ADOConnection -- dataProvider to indicate whether
a class is derived from odbc or ado.</p>
<p>Changed class ODBCFieldObject to ADOFieldObject -- not documented currently.</p>
<p>Added benchmark.php and testdatabases.inc.php to the test suite.</p>
<p>Added to ADORecordSet FastForward( ) for future high speed scrolling. Not documented.</p>
<p>Realised that ADO's Move( ) uses relative positioning. ADOdb uses absolute.
</p>
<p><b>0.10 Sept 9 2000</b></p>
<p>First release</p>
</body></html>
/web/kaklik's_web/torrentflux/adodb/docs/readme.htm
0,0 → 1,68
<html>
<head>
<title>ADODB Manual</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<XSTYLE
body,td {font-family:Arial,Helvetica,sans-serif;font-size:11pt}
pre {font-size:9pt}
.toplink {font-size:8pt}
/>
</head>
<body bgcolor="#FFFFFF">
 
<h3>ADOdb Library for PHP</h3>
<p>ADOdb is a suite of database libraries that allow you to connect to multiple
databases in a portable manner. Download from <a href=http://adodb.sourceforge.net/>http://adodb.sourceforge.net/</a>.
<ul><li>The ADOdb documentation has moved to <a href=docs-adodb.htm>docs-adodb.htm</a>
This allows you to query, update and insert records using a portable API.
<p><li>The ADOdb data dictionary docs are at <a href=docs-datadict.htm>docs-datadict.htm</a>.
This allows you to create database tables and indexes in a portable manner.
<p><li>The ADOdb database performance monitoring docs are at <a href=docs-perf.htm>docs-perf.htm</a>.
This allows you to perform health checks, tune and monitor your database.
<p><li>The ADOdb database-backed session docs are at <a href=docs-session.htm>docs-session.htm</a>.
</ul>
<p>
<h3>Installation</h3>
Make sure you are running PHP4.0.4 or later. Unpack all the files into a directory accessible by your webserver.
<p>
To test, try modifying some of the tutorial examples. Make sure you customize the connection settings correctly. You can debug using:
<pre>
&lt;?php
include('adodb/adodb.inc.php');
 
$db = <b>ADONewConnection</b>($driver); # eg. 'mysql' or 'oci8'
$db->debug = true;
$db-><b>Connect</b>($server, $user, $password, $database);
$rs = $db-><b>Execute</b>('select * from some_small_table');
print "&lt;pre>";
print_r($rs-><b>GetRows</b>());
print "&lt;/pre>";
?>
</pre>
<h3>How are people using ADOdb</h3>
Here are some examples of how people are using ADOdb:
<ul>
<li> <strong>PhpLens</strong> is a commercial data grid component that allows
both cool Web designers and serious unshaved programmers to develop and
maintain databases on the Web easily. Developed by the author of ADOdb.
</li>
<li> <strong>PHAkt</strong>: PHP Extension for DreamWeaver Ultradev allows
you to script PHP in the popular Web page editor. Database handling provided
by ADOdb. </li>
<li> <strong>Analysis Console for Intrusion Databases (ACID)</strong>: PHP-based
analysis engine to search and process a database of security incidents
generated by security-related software such as IDSes and firewalls (e.g.
Snort, ipchains). By Roman Danyliw. </li>
<li> <strong>PostNuke</strong> is a very popular free content management system
and weblog system. It offers full CSS support, HTML 4.01 transitional
compliance throughout, an advanced blocks system, and is fully multi-lingual
enabled. </li>
<li><strong> EasyPublish CMS</strong> is another free content management system
for managing information and integrated modules on your internet, intranet-
and extranet-sites. From Norway. </li>
<li> <strong>NOLA</strong> is a full featured accounting, inventory, and job
tracking application. It is licensed under the GPL, and developed by Noguska.
</li>
</ul>
</body>
</html>
/web/kaklik's_web/torrentflux/adodb/docs/tips_portable_sql.htm
0,0 → 1,362
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 
<html>
<head>
<title>Tips on Writing Portable SQL for Multiple Databases for PHP</title>
</head>
 
<body bgcolor=white>
<table width=100% border=0><tr><td><h2>Tips on Writing Portable SQL &nbsp;</h2></td><td>
<div align=right><img src="cute_icons_for_site/adodb.gif"></div></td></tr></table>
<p>Updated 18 Sep 2003. Added Portable Native SQL section.
<p>
 
If you are writing an application that is used in multiple environments and
operating systems, you need to plan to support multiple databases. This article
is based on my experiences with multiple database systems, stretching from 4th
Dimension in my Mac days, to the databases I currently use, which are: Oracle,
FoxPro, Access, MS SQL Server and MySQL. Although most of the advice here applies
to using SQL with Perl, Python and other programming languages, I will focus on PHP and how
the <a href="http://adodb.sourceforge.net/">ADOdb</a> database abstraction library
offers some solutions.<p></p>
<p>Most database vendors practice product lock-in. The best or fastest way to
do things is often implemented using proprietary extensions to SQL. This makes
it extremely hard to write portable SQL code that performs well under all conditions.
When the first ANSI committee got together in 1984 to standardize SQL, the database
vendors had such different implementations that they could only agree on the
core functionality of SQL. Many important application specific requirements
were not standardized, and after so many years since the ANSI effort began,
it looks as if much useful database functionality will never be standardized.
Even though ANSI-92 SQL has codified much more, we still have to implement portability
at the application level.</p>
<h3><b>Selects</b></h3>
<p>The SELECT statement has been standardized to a great degree. Nearly every
database supports the following:</p>
<p>SELECT [cols] FROM [tables]<br>
&nbsp;&nbsp;[WHERE conditions]<br>
&nbsp; [GROUP BY cols]<br>
&nbsp; [HAVING conditions] <br>
&nbsp; [ORDER BY cols]</p>
<p>But so many useful techniques can only be implemented by using proprietary
extensions. For example, when writing SQL to retrieve the first 10 rows for
paging, you could write...</p>
<table width="80%" border="1" cellspacing="0" cellpadding="0" align="center">
<tr>
<td><b>Database</b></td>
<td><b>SQL Syntax</b></td>
</tr>
<tr>
<td>DB2</td>
<td>select * from table fetch first 10 rows only</td>
</tr>
<tr>
<td>Informix</td>
<td>select first 10 * from table</td>
</tr>
<tr>
<td>Microsoft SQL Server and Access</td>
<td>select top 10 * from table</td>
</tr>
<tr>
<td>MySQL and PostgreSQL</td>
<td>select * from table limit 10</td>
</tr>
<tr>
<td>Oracle 8i</td>
<td>select * from (select * from table) where rownum &lt;= 10</td>
</tr>
</table>
<p>This feature of getting a subset of data is so useful that in the PHP class
library ADOdb, we have a SelectLimit( ) function that allows you to hide the
implementation details within a function that will rewrite your SQL for you:</p>
<pre>$connection-&gt;SelectLimit('select * from table', 10);
</pre>
<p><b>Selects: Fetch Modes</b></p>
<p>PHP allows you to retrieve database records as arrays. You can choose to have
the arrays indexed by field name or number. However different low-level PHP
database drivers are inconsistent in their indexing efforts. ADOdb allows you
to determine your prefered mode. You set this by setting the variable $ADODB_FETCH_MODE
to either of the constants ADODB_FETCH_NUM (for numeric indexes) or ADODB_FETCH_ASSOC
(using field names as an associative index).</p>
<p>The default behaviour of ADOdb varies depending on the database you are using.
For consistency, set the fetch mode to either ADODB_FETCH_NUM (for speed) or
ADODB_FETCH_ASSOC (for convenience) at the beginning of your code. </p>
<p><b>Selects: Counting Records</b></p>
<p>Another problem with SELECTs is that some databases do not return the number
of rows retrieved from a select statement. This is because the highest performance
databases will return records to you even before the last record has been found.
</p>
<p>In ADOdb, RecordCount( ) returns the number of rows returned, or will emulate
it by buffering the rows and returning the count after all rows have been returned.
This can be disabled for performance reasons when retrieving large recordsets
by setting the global variable $ADODB_COUNTRECS = false. This variable is checked
every time a query is executed, so you can selectively choose which recordsets
to count.</p>
<p>If you prefer to set $ADODB_COUNTRECS = false, ADOdb still has the PO_RecordCount(
) function. This will return the number of rows, or if it is not found, it will
return an estimate using SELECT COUNT(*):</p>
<pre>$rs = $db-&gt;Execute(&quot;select * from table where state=$state&quot;);
$numrows = $rs-&gt;PO_RecordCount('table', &quot;state=$state&quot;);</pre>
<p><b>Selects: Locking</b> </p>
<p>SELECT statements are commonly used to implement row-level locking of tables.
Other databases such as Oracle, Interbase, PostgreSQL and MySQL with InnoDB
do not require row-level locking because they use versioning to display data
consistent with a specific point in time.</p>
<p>Currently, I recommend encapsulating the row-level locking in a separate function,
such as RowLock($table, $where):</p>
<pre>$connection-&gt;BeginTrans( );
$connection-&gt;RowLock($table, $where); </pre>
<pre><font color=green># some operation</font></pre>
<pre>if ($ok) $connection-&gt;CommitTrans( );
else $connection-&gt;RollbackTrans( );
</pre>
<p><b>Selects: Outer Joins</b></p>
<p>Not all databases support outer joins. Furthermore the syntax for outer joins
differs dramatically between database vendors. One portable (and possibly slower)
method of implementing outer joins is using UNION.</p>
<p>For example, an ANSI-92 left outer join between two tables t1 and t2 could
look like:</p>
<pre>SELECT t1.col1, t1.col2, t2.cola <br> FROM t1 <i>LEFT JOIN</i> t2 ON t1.col = t2.col</pre>
<p>This can be emulated using:</p>
<pre>SELECT t1.col1, t1.col2, t2.cola FROM t1, t2 <br> WHERE t1.col = t2.col
UNION ALL
SELECT col1, col2, null FROM t1 <br> WHERE t1.col not in (select distinct col from t2)
</pre>
<p>Since ADOdb 2.13, we provide some hints in the connection object as to legal
join variations. This is still incomplete and sometimes depends on the database
version you are using, but is useful as a general guideline:</p>
<p><font face="Courier New, Courier, mono">$conn-&gt;leftOuter</font>: holds the
operator used for left outer joins (eg. '*='), or false if not known or not
available.<br>
<font face="Courier New, Courier, mono">$conn-&gt;rightOuter</font>: holds the
operator used for right outer joins (eg '=*'), or false if not known or not
available.<br>
<font face="Courier New, Courier, mono">$conn-&gt;ansiOuter</font>: boolean
that if true means that ANSI-92 style outer joins are supported, or false if
not known.</p>
<h3><b>Inserts</b> </h3>
<p>When you create records, you need to generate unique id's for each record.
There are two common techniques: (1) auto-incrementing columns and (2) sequences.
</p>
<p>Auto-incrementing columns are supported by MySQL, Sybase and Microsoft Access
and SQL Server. However most other databases do not support this feature. So
for portability, you have little choice but to use sequences. Sequences are
special functions that return a unique incrementing number every time you call
it, suitable to be used as database keys. In ADOdb, we use the GenID( ) function.
It has takes a parameter, the sequence name. Different tables can have different
sequences. </p>
<pre>$id = $connection-&gt;GenID('sequence_name');<br>$connection-&gt;Execute(&quot;insert into table (id, firstname, lastname) <br> values ($id, $firstname, $lastname)&quot;);</pre>
<p>For databases that do not support sequences natively, ADOdb emulates sequences
by creating a table for every sequence.</p>
<h3><b>Binding</b></h3>
<p>Binding variables in an SQL statement is another tricky feature. Binding is
useful because it allows pre-compilation of SQL. When inserting multiple records
into a database in a loop, binding can offer a 50% (or greater) speedup. However
many databases such as Access and MySQL do not support binding natively and
there is some overhead in emulating binding. Furthermore, different databases
(specificly Oracle!) implement binding differently. My recommendation is to
use binding if your database queries are too slow, but make sure you are using
a database that supports it like Oracle. </p>
<p>ADOdb supports portable Prepare/Execute with:</p>
<pre>$stmt = $db-&gt;Prepare('select * from customers where custid=? and state=?');
$rs = $db-&gt;Execute($stmt, array($id,'New York'));</pre>
<p>Oracle uses named bind placeholders, not "?", so to support portable binding, we have Param() that generates
the correct placeholder (available since ADOdb 3.92):
<pre><font color="#000000">$sql = <font color="#993300">'insert into table (col1,col2) values ('</font>.$DB-&gt;Param('a').<font color="#993300">','</font>.$DB-&gt;Param('b').<font color="#993300">')'</font>;
<font color="#006600"># generates 'insert into table (col1,col2) values (?,?)'
# or 'insert into table (col1,col2) values (:a,:b)</font>'
$stmt = $DB-&gt;Prepare($sql);
$stmt = $DB-&gt;Execute($stmt,array('one','two'));
</font></pre>
<a name="native"></a>
<h2>Portable Native SQL</h2>
<p>ADOdb provides the following functions for portably generating SQL functions
as strings to be merged into your SQL statements (some are only available since
ADOdb 3.92): </p>
<table width="75%" border="1" align=center>
<tr>
<td width=30%><b>Function</b></td>
<td><b>Description</b></td>
</tr>
<tr>
<td>DBDate($date)</td>
<td>Pass in a UNIX timestamp or ISO date and it will convert it to a date
string formatted for INSERT/UPDATE</td>
</tr>
<tr>
<td>DBTimeStamp($date)</td>
<td>Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp
string formatted for INSERT/UPDATE</td>
</tr>
<tr>
<td>SQLDate($date, $fmt)</td>
<td>Portably generate a date formatted using $fmt mask, for use in SELECT
statements.</td>
</tr>
<tr>
<td>OffsetDate($date, $ndays)</td>
<td>Portably generate a $date offset by $ndays.</td>
</tr>
<tr>
<td>Concat($s1, $s2, ...)</td>
<td>Portably concatenate strings. Alternatively, for mssql use mssqlpo driver,
which allows || operator.</td>
</tr>
<tr>
<td>IfNull($fld, $replaceNull)</td>
<td>Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.</td>
</tr>
<tr>
<td>Param($name)</td>
<td>Generates bind placeholders, using ? or named conventions as appropriate.</td>
</tr>
<tr><td>$db->sysDate</td><td>Property that holds the SQL function that returns today's date</td>
</tr>
<tr><td>$db->sysTimeStamp</td><td>Property that holds the SQL function that returns the current
timestamp (date+time).
</td>
</tr>
<tr>
<td>$db->concat_operator</td><td>Property that holds the concatenation operator
</td>
</tr>
<tr><td>$db->length</td><td>Property that holds the name of the SQL strlen function.
</td></tr>
 
<tr><td>$db->upperCase</td><td>Property that holds the name of the SQL strtoupper function.
</td></tr>
<tr><td>$db->random</td><td>Property that holds the SQL to generate a random number between 0.00 and 1.00.
</td>
</tr>
<tr><td>$db->substr</td><td>Property that holds the name of the SQL substring function.
</td></tr>
</table>
<p>&nbsp; </p>
<h2>DDL and Tuning</h2>
There are database design tools such as ERWin or Dezign that allow you to generate data definition language commands such as ALTER TABLE or CREATE INDEX from Entity-Relationship diagrams.
<p>
However if you prefer to use a PHP-based table creation scheme, adodb provides you with this feature. Here is the code to generate the SQL to create a table with:
<ol>
<li> Auto-increment primary key 'ID', </li>
<li>The person's 'NAME' VARCHAR(32) NOT NULL and defaults to '', </li>
<li>The date and time of record creation 'CREATED', </li>
<li> The person's 'AGE', defaulting to 0, type NUMERIC(16). </li>
</ol>
<p>
Also create a compound index consisting of 'NAME' and 'AGE':
<pre>
$datadict = <strong>NewDataDictionary</strong>($connection);
$flds = "
<font color="#660000"> ID I AUTOINCREMENT PRIMARY,
NAME C(32) DEFAULT '' NOTNULL,
CREATED T DEFTIMESTAMP,
AGE N(16) DEFAULT 0</font>
";
$sql1 = $datadict-><strong>CreateTableSQL</strong>('tabname', $flds);
$sql2 = $datadict-><strong>CreateIndexSQL</strong>('idx_name_age', 'tabname', 'NAME,AGE');
</pre>
 
<h3>Data Types</h3>
<p>Stick to a few data types that are available in most databases. Char, varchar
and numeric/number are supported by most databases. Most other data types (including
integer, boolean and float) cannot be relied on being available. I recommend
using char(1) or number(1) to hold booleans. </p>
<p>Different databases have different ways of representing dates and timestamps/datetime.
ADOdb attempts to display all dates in ISO (YYYY-MM-DD) format. ADOdb also provides
DBDate( ) and DBTimeStamp( ) to convert dates to formats that are acceptable
to that database. Both functions accept Unix integer timestamps and date strings
in ISO format.</p>
<pre>$date1 = $connection-&gt;DBDate(time( ));<br>$date2 = $connection-&gt;DBTimeStamp('2002-02-23 13:03:33');</pre>
<p>We also provide functions to convert database dates to Unix timestamps:</p>
<pre>$unixts = $recordset-&gt;UnixDate('#2002-02-30#'); <font color="green"># MS Access date =&gt; unix timestamp</font></pre>
<p>The maximum length of a char/varchar field is also database specific. You can
only assume that field lengths of up to 250 characters are supported. This is
normally impractical for web based forum or content management systems. You
will need to be familiar with how databases handle large objects (LOBs). ADOdb
implements two functions, UpdateBlob( ) and UpdateClob( ) that allow you to
update fields holding Binary Large Objects (eg. pictures) and Character Large
Objects (eg. HTML articles):</p>
<pre><font color=green># for oracle </font>
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1,empty_blob())');
$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
<font color=green># non-oracle databases</font>
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
</pre>
<p>Null handling is another area where differences can occur. This is a mine-field,
because 3-value logic is tricky.
<p>In general, I avoid using nulls except for dates and default all my numeric
and character fields to 0 or the empty string. This maintains consistency with
PHP, where empty strings and zero are treated as equivalent, and avoids SQL
ambiguities when you use the ANY and EXISTS operators. However if your database
has significant amounts of missing or unknown data, using nulls might be a good
idea.
<p>
ADOdb also supports a portable <a href=http://phplens.com/adodb/reference.functions.concat.html#ifnull>IfNull</a> function, so you can define what to display
if the field contains a null.
<h3><b>Stored Procedures</b></h3>
<p>Stored procedures are another problem area. Some databases allow recordsets
to be returned in a stored procedure (Microsoft SQL Server and Sybase), and
others only allow output parameters to be returned. Stored procedures sometimes
need to be wrapped in special syntax. For example, Oracle requires such code
to be wrapped in an anonymous block with BEGIN and END. Also internal sql operators
and functions such as +, ||, TRIM( ), SUBSTR( ) or INSTR( ) vary between vendors.
</p>
<p>An example of how to call a stored procedure with 2 parameters and 1 return
value follows:</p>
<pre> switch ($db->databaseType) {
case '<font color="#993300">mssql</font>':
$sql = <font color="#000000"><font color="#993333">'<font color="#993300">SP_RUNSOMETHING</font>'</font></font>; break;
case '<font color="#993300">oci8</font>':
$sql =
<font color="#993300"> </font><font color="#000000"><font color="#993300">&quot;declare RETVAL integer;begin :RETVAL := </font><font color="#000000"><font color="#993333"><font color="#993300">SP_RUNSOMETHING</font></font></font><font color="#993300">(:myid,:group);end;&quot;;
</font> break;</font>
default:
die('<font color="#993300">Unsupported feature</font>');
}
<font color="#000000"><font color="green"> # @RETVAL = SP_RUNSOMETHING @myid,@group</font>
$stmt = $db-&gt;PrepareSP($sql); <br> $db-&gt;Parameter($stmt,$id,'<font color="#993300">myid</font>');
$db-&gt;Parameter($stmt,$group,'<font color="#993300">group</font>');
<font color="green"># true indicates output parameter<br> </font>$db-&gt;Parameter($stmt,$ret,'<font color="#993300">RETVAL</font>',true);
$db-&gt;Execute($stmt); </font></pre>
<p>As you can see, the ADOdb API is the same for both databases. But the stored
procedure SQL syntax is quite different between databases and is not portable,
so be forewarned! However sometimes you have little choice as some systems only
allow data to be accessed via stored procedures. This is when the ultimate portability
solution might be the only solution: <i>treating portable SQL as a localization
exercise...</i></p>
<h3><b>SQL as a Localization Exercise</b></h3>
<p> In general to provide real portability, you will have to treat SQL coding
as a localization exercise. In PHP, it has become common to define separate
language files for English, Russian, Korean, etc. Similarly, I would suggest
you have separate Sybase, Intebase, MySQL, etc files, and conditionally include
the SQL based on the database. For example, each MySQL SQL statement would be
stored in a separate variable, in a file called 'mysql-lang.inc.php'.</p>
<pre>$sqlGetPassword = '<font color="#993300">select password from users where userid=%s</font>';
$sqlSearchKeyword = &quot;<font color="#993300">SELECT * FROM articles WHERE match (title,body) against (%s</font>)&quot;;</pre>
<p>In our main PHP file:</p>
<pre><font color=green># define which database to load...</font>
<b>$database = '<font color="#993300">mysql</font>';
include_once(&quot;<font color="#993300">$database-lang.inc.php</font>&quot;);</b>
 
$db = &amp;NewADOConnection($database);
$db->PConnect(...) or die('<font color="#993300">Failed to connect to database</font>');
 
<font color=green># search for a keyword $word</font>
$rs = $db-&gt;Execute(sprintf($sqlSearchKeyWord,$db-&gt;qstr($word)));</pre>
<p>Note that we quote the $word variable using the qstr( ) function. This is because
each database quotes strings using different conventions.</p>
<p>
<h3>Final Thoughts</h3>
<p>The best way to ensure that you have portable SQL is to have your data tables designed using
sound principles. Learn the theory of normalization and entity-relationship diagrams and model
your data carefully. Understand how joins and indexes work and how they are used to tune performance.
<p> Visit the following page for more references on database theory and vendors:
<a href="http://php.weblogs.com/sql_tutorial">http://php.weblogs.com/sql_tutorial</a>.
Also read this article on <a href=http://phplens.com/lens/php-book/optimizing-debugging-php.php>Optimizing PHP</a>.
<p>
<font size=1>(c) 2002-2003 John Lim.</font>
 
</body>
</html>
/web/kaklik's_web/torrentflux/adodb/docs/tute.htm
0,0 → 1,290
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 
<html>
<head>
<title>Tutorial: Moving from MySQL to ADODB</title>
</head>
 
<body bgcolor=white>
<h1>Tutorial: Moving from MySQL to ADODB</h1>
 
<pre> You say eether and I say eyether,
You say neether and I say nyther;
Eether, eyether, neether, nyther -
Let's call the whole thing off !
<br>
You like potato and I like po-tah-to,
You like tomato and I like to-mah-to;
Potato, po-tah-to, tomato, to-mah-to -
Let's call the whole thing off !
</pre>
<p>I love this song, especially the version with Louis Armstrong and Ella singing
duet. It is all about how hard it is for two people in love to be compatible
with each other. It's about compromise and finding a common ground, and that's
what this article is all about.
<p>PHP is all about creating dynamic web-sites with the least fuss and the most
fun. To create these websites we need to use databases to retrieve login information,
to splash dynamic news onto the web page and store forum postings. So let's
say we were using the popular MySQL database for this. Your company has done
such a fantastic job that the Web site is more popular than your wildest dreams.
You find that MySQL cannot scale to handle the workload; time to switch databases.
<p> Unfortunately in PHP every database is accessed slightly differently. To connect
to MySQL, you would use <i>mysql_connect()</i>; when you decide to upgrade to
Oracle or Microsoft SQL Server, you would use <i>ocilogon() </i>or <i>mssql_connect()</i>
respectively. What is worse is that the parameters you use for the different
connect functions are different also.. One database says po-tato, the other
database says pota-to. Oh-oh.
<h3>Let's NOT call the whole thing off</h3>
<p>A database wrapper library such as ADODB comes in handy when you need to ensure portability. It provides
you with a common API to communicate with any supported database so you don't have to call things off. <p>
 
<p>ADODB stands for Active Data Objects DataBase (sorry computer guys are sometimes
not very original). ADODB currently supports MySQL, PostgreSQL, Oracle, Interbase,
Microsoft SQL Server, Access, FoxPro, Sybase, ODBC and ADO. You can download
ADODB from <a href=http://php.weblogs.com/adodb></a><a href="http://php.weblogs.com/adodb">http://php.weblogs.com/adodb</a>.
<h3>MySQL Example</h3>
<p>The most common database used with PHP is MySQL, so I guess you should be familiar
with the following code. It connects to a MySQL server at <i>localhost</i>,
database <i>mydb</i>, and executes an SQL select statement. The results are
printed, one line per row.
<pre><font color="#666600">$db = <b>mysql_connect</b>(&quot;localhost&quot;, &quot;root&quot;, &quot;password&quot;);
<b>mysql_select_db</b>(&quot;mydb&quot;,$db);</font>
<font color="#660000">$result = <b>mysql_query</b>(&quot;SELECT * FROM employees&quot;,$db)</font><code><font color="#663300">;
if ($result === false) die(&quot;failed&quot;);</font></code>
<font color="#006666"><b>while</b> ($fields =<b> mysql_fetch_row</b>($result)) &#123;
<b>for</b> ($i=0, $max=sizeof($fields); $i &lt; $max; $i++) &#123;
<b>print</b> $fields[$i].' ';
&#125;
<b>print</b> &quot;&lt;br&gt;\n&quot;;
&#125;</font>
</pre>
<p>The above code has been color-coded by section. The first section is the connection
phase. The second is the execution of the SQL, and the last section is displaying
the fields. The <i>while</i> loop scans the rows of the result, while the <i>for</i>
loop scans the fields in one row.</p>
<p>Here is the equivalent code in ADODB</p>
<pre><b><font color="#666600"> include(&quot;adodb.inc.php&quot;);</font></b><font color="#666600">
$db = <b>NewADOConnection</b>('mysql');
$db-&gt;<b>Connect</b>(&quot;localhost&quot;, &quot;root&quot;, &quot;password&quot;, &quot;mydb&quot;);</font>
<font color="#663300">$result = $db-&gt;<b>Execute</b>(&quot;SELECT * FROM employees&quot;);
</font><font color="#663300"></font><code><font color="#663300">if ($result === false) die(&quot;failed&quot;)</font></code><code><font color="#663300">;</font></code>
<font color="#006666"><b>while</b> (!$result-&gt;EOF) &#123;
<b>for</b> ($i=0, $max=$result-&gt;<b>FieldCount</b>(); $i &lt; $max; $i++)
<b>print</b> $result-&gt;fields[$i].' ';
$result-&gt;<b>MoveNext</b>();
<b>print</b> &quot;&lt;br&gt;\n&quot;;
&#125;</font> </pre>
<p></p>
<p>Now porting to Oracle is as simple as changing the second line to <code>NewADOConnection('oracle')</code>.
Let's walk through the code...</p>
<h3>Connecting to the Database</h3>
<p></p>
<pre><b><font color="#666600">include(&quot;adodb.inc.php&quot;);</font></b><font color="#666600">
$db = <b>NewADOConnection</b>('mysql');
$db-&gt;<b>Connect</b>(&quot;localhost&quot;, &quot;root&quot;, &quot;password&quot;, &quot;mydb&quot;);</font></pre>
<p>The connection code is a bit more sophisticated than MySQL's because our needs
are more sophisticated. In ADODB, we use an object-oriented approach to managing
the complexity of handling multiple databases. We have different classes to
handle different databases. If you aren't familiar with object-oriented programing,
don't worry -- the complexity is all hidden away in the<code> NewADOConnection()</code>
function.</p>
<p>To conserve memory, we only load the PHP code specific to the database you
are connecting to. We do this by calling <code>NewADOConnection(databasedriver)</code>.
Legal database drivers include <i>mysql, mssql, oracle, oci8, postgres, sybase,
vfp, access, ibase </i>and many others.</p>
<p>Then we create a new instance of the connection class by calling <code>NewADOConnection()</code>.
Finally we connect to the database using <code>$db-&gt;Connect(). </code></p>
<h3>Executing the SQL</h3>
<p><code><font color="#663300">$result = $db-&gt;<b>Execute</b>(&quot;SELECT *
FROM employees&quot;);<br>
if ($result === false) die(&quot;failed&quot;)</font></code><code><font color="#663300">;</font></code>
<br>
</p>
<p>Sending the SQL statement to the server is straight forward. Execute() will
return a recordset object on successful execution. You should check $result
as we do above.
<p>An issue that confuses beginners is the fact that we have two types of objects
in ADODB, the connection object and the recordset object. When do we use each?
<p>The connection object ($db) is responsible for connecting to the database,
formatting your SQL and querying the database server. The recordset object ($result)
is responsible for retrieving the results and formatting the reply as text or
as an array.
<p>The only thing I need to add is that ADODB provides several helper functions
for making INSERT and UPDATE statements easier, which we will cover in the Advanced
section.
<h3>Retrieving the Data<br>
</h3>
<pre><font color="#006666"><b>while</b> (!$result-&gt;EOF) &#123;
<b>for</b> ($i=0, $max=$result-&gt;<b>FieldCount</b>(); $i &lt; $max; $i++)
<b>print</b> $result-&gt;fields[$i].' ';
$result-&gt;<b>MoveNext</b>();
<b>print</b> &quot;&lt;br&gt;\n&quot;;
&#125;</font></pre>
<p>The paradigm for getting the data is that it's like reading a file. For every
line, we check first whether we have reached the end-of-file (EOF). While not
end-of-file, loop through each field in the row. Then move to the next line
(MoveNext) and repeat.
<p>The <code>$result-&gt;fields[]</code> array is generated by the PHP database
extension. Some database extensions do not index the array by field name.
To force indexing by name - that is associative arrays -
use the $ADODB_FETCH_MODE global variable.
<pre>
$<b>ADODB_FETCH_MODE</b> = ADODB_FETCH_NUM;
$rs1 = $db->Execute('select * from table');
$<b>ADODB_FETCH_MODE</b> = ADODB_FETCH_ASSOC;
$rs2 = $db->Execute('select * from table');
print_r($rs1->fields); // shows <i>array([0]=>'v0',[1] =>'v1')</i>
print_r($rs2->fields); // shows <i>array(['col1']=>'v0',['col2'] =>'v1')</i>
</pre>
<p>
As you can see in the above example, both recordsets store and use different fetch modes
based on the $ADODB_FETCH_MODE setting when the recordset was created by Execute().</p>
<h2>ADOConnection<a name="ADOConnection"></a></h2>
<p>Object that performs the connection to the database, executes SQL statements
and has a set of utility functions for standardising the format of SQL statements
for issues such as concatenation and date formats.</p>
<h3>Other Useful Functions</h3>
<p><code>$recordset-&gt;Move($pos)</code> scrolls to that particular row. ADODB supports forward
scrolling for all databases. Some databases will not support backwards scrolling.
This is normally not a problem as you can always cache records to simulate backwards
scrolling.
<p><code>$recordset-&gt;RecordCount()</code> returns the number of records accessed by the
SQL statement. Some databases will return -1 because it is not supported.
<p><code>$recordset-&gt;GetArray()</code> returns the result as an array.
<p><code>rs2html($recordset)</code> is a function that is generates a HTML table based on the
$recordset passed to it. An example with the relevant lines in bold:
<pre> include('adodb.inc.php');
<b>include('tohtml.inc.php');</b> /* includes the rs2html function */
$conn = &amp;ADONewConnection('mysql');
$conn-&gt;PConnect('localhost','userid','password','database');
$rs = $conn-&gt;Execute('select * from table');
<b> rs2html($rs)</b>; /* recordset to html table */ </pre>
<p>There are many other helper functions that are listed in the documentation available at <a href="http://php.weblogs.com/adodb_manual"></a><a href="http://php.weblogs.com/adodb_manual">http://php.weblogs.com/adodb_manual</a>.
<h2>Advanced Material</h2>
<h3>Inserts and Updates </h3>
<p>Let's say you want to insert the following data into a database.
<p><b>ID</b> = 3<br>
<b>TheDate</b>=mktime(0,0,0,8,31,2001) /* 31st August 2001 */<br>
<b>Note</b>= sugar why don't we call it off
<p>When you move to another database, your insert might no longer work.</p>
<p>The first problem is that each database has a different default date format.
MySQL expects YYYY-MM-DD format, while other databases have different defaults.
ADODB has a function called DBDate() that addresses this issue by converting
converting the date to the correct format.</p>
<p>The next problem is that the <b>don't</b> in the Note needs to be quoted. In
MySQL, we use <b>don\'t</b> but in some other databases (Sybase, Access, Microsoft
SQL Server) we use <b>don''t. </b>The qstr() function addresses this issue.</p>
<p>So how do we use the functions? Like this:</p>
<pre>$sql = &quot;INSERT INTO table (id, thedate,note) values (&quot;
. $<b>ID</b> . ','
. $db-&gt;DBDate($<b>TheDate</b>) .','
. $db-&gt;qstr($<b>Note</b>).&quot;)&quot;;
$db-&gt;Execute($sql);</pre>
<p>ADODB also supports <code>$connection-&gt;Affected_Rows()</code> (returns the
number of rows affected by last update or delete) and <code>$recordset-&gt;Insert_ID()</code>
(returns last autoincrement number generated by an insert statement). Be forewarned
that not all databases support the two functions.<br>
</p>
<h3>MetaTypes</h3>
<p>You can find out more information about each of the fields (I use the words
fields and columns interchangebly) you are selecting by calling the recordset
method <code>FetchField($fieldoffset)</code>. This will return an object with
3 properties: name, type and max_length.
<pre>For example:</pre>
<pre>$recordset = $conn-&gt;Execute(&quot;select adate from table&quot;);<br>$f0 = $recordset-&gt;FetchField(0);
</pre>
<p>Then <code>$f0-&gt;name</code> will hold <i>'adata'</i>, <code>$f0-&gt;type</code>
will be set to '<i>date'</i>. If the max_length is unknown, it will be set to
-1.
<p>One problem with handling different databases is that each database often calls
the same type by a different name. For example a <i>timestamp</i> type is called
<i>datetime</i> in one database and <i>time</i> in another. So ADODB has a special
<code>MetaType($type, $max_length)</code> function that standardises the types
to the following:
<p>C: character and varchar types<br>
X: text or long character (eg. more than 255 bytes wide).<br>
B: blob or binary image<br>
D: date<br>
T: timestamp<br>
L: logical (boolean)<br>
I: integer<br>
N: numeric (float, double, money)
<p>In the above date example,
<p><code>$recordset = $conn-&gt;Execute(&quot;select adate from table&quot;);<br>
$f0 = $recordset-&gt;FetchField(0);<br>
$type = $recordset-&gt;MetaType($f0-&gt;type, $f0-&gt;max_length);<br>
print $type; /* should print 'D'</code> */
<p>
<p><b>Select Limit and Top Support</b>
<p>ADODB has a function called $connection->SelectLimit($sql,$nrows,$offset) that allows
you to retrieve a subset of the recordset. This will take advantage of native
SELECT TOP on Microsoft products and SELECT ... LIMIT with PostgreSQL and MySQL, and
emulated if the database does not support it.
<p><b>Caching Support</b>
<p>ADODB allows you to cache recordsets in your file system, and only requery the database
server after a certain timeout period with $connection->CacheExecute($secs2cache,$sql) and
$connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset).
<p><b>PHP4 Session Handler Support</b>
<p>ADODB also supports PHP4 session handlers. You can store your session variables
in a database for true scalability using ADODB. For further information, visit
<a href="http://php.weblogs.com/adodb-sessions"></a><a href="http://php.weblogs.com/adodb-sessions">http://php.weblogs.com/adodb-sessions</a>
<h3>Commercial Use Encouraged</h3>
<p>If you plan to write commercial PHP applications that you want to resell, you should consider ADODB. It has been released using the lesser GPL, which means you can legally include it in commercial applications, while keeping your code proprietary. Commercial use of ADODB is strongly encouraged! We are using it internally for this reason.<p>
 
<h2>Conclusion</h2>
<p>As a thank you for finishing this article, here are the complete lyrics for
<i>let's call the whole thing off</i>.<br>
<br>
<pre>
Refrain
<br>
You say eether and I say eyether,
You say neether and I say nyther;
Eether, eyether, neether, nyther -
Let's call the whole thing off !
<br>
You like potato and I like po-tah-to,
You like tomato and I like to-mah-to;
Potato, po-tah-to, tomato, to-mah-to -
Let's call the whole thing off !
<br>
But oh, if we call the whole thing off, then we must part.
And oh, if we ever part, then that might break my heart.
<br>
So, if you like pajamas and I like pa-jah-mas,
I'll wear pajamas and give up pa-jah-mas.
For we know we
Need each other, so we
Better call the calling off off.
Let's call the whole thing off !
<br>
Second Refrain
<br>
You say laughter and I say lawfter,
You say after and I say awfter;
Laughter, lawfter, after, awfter -
Let's call the whole thing off !
<br>
You like vanilla and I like vanella,
You, sa's'parilla and I sa's'parella;
Vanilla, vanella, choc'late, strawb'ry -
Let's call the whole thing off !
<br>
But oh, if we call the whole thing off, then we must part.
And oh, if we ever part, then that might break my heart.
<br>
So, if you go for oysters and I go for ersters,
I'll order oysters and cancel the ersters.
For we know we
Need each other, so we
Better call the calling off off.
Let's call the whole thing off !
</pre>
<p><font size=2>Song and lyrics by George and Ira Gershwin, introduced by Fred Astaire and Ginger Rogers
in the film "Shall We Dance?" </font><p>
<p>
(c)2001-2002 John Lim.
 
</body>
</html>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-access.inc.php
0,0 → 1,86
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Microsoft Access data driver. Requires ODBC. Works only on MS Windows.
*/
if (!defined('_ADODB_ODBC_LAYER')) {
if (!defined('ADODB_DIR')) die();
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
}
if (!defined('_ADODB_ACCESS')) {
define('_ADODB_ACCESS',1);
 
class ADODB_access extends ADODB_odbc {
var $databaseType = 'access';
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
var $fmtDate = "#Y-m-d#";
var $fmtTimeStamp = "#Y-m-d h:i:sA#"; // note not comma
var $_bindInputArray = false; // strangely enough, setting to true does not work reliably
var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
var $sysTimeStamp = 'NOW';
var $hasTransactions = false;
function ADODB_access()
{
global $ADODB_EXTENSION;
$ADODB_EXTENSION = false;
$this->ADODB_odbc();
}
function Time()
{
return time();
}
function BeginTrans() { return false;}
function IfNull( $field, $ifNull )
{
return " IIF(IsNull($field), $ifNull, $field) "; // if Access
}
/*
function &MetaTables()
{
global $ADODB_FETCH_MODE;
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$qid = odbc_tables($this->_connectionID);
$rs = new ADORecordSet_odbc($qid);
$ADODB_FETCH_MODE = $savem;
if (!$rs) return false;
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
$arr = &$rs->GetArray();
//print_pre($arr);
$arr2 = array();
for ($i=0; $i < sizeof($arr); $i++) {
if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE')
$arr2[] = $arr[$i][2];
}
return $arr2;
}*/
}
 
class ADORecordSet_access extends ADORecordSet_odbc {
var $databaseType = "access";
function ADORecordSet_access($id,$mode=false)
{
return $this->ADORecordSet_odbc($id,$mode);
}
}// class
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-ado.inc.php
0,0 → 1,631
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Microsoft ADO data driver. Requires ADO. Works only on MS Windows.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
define("_ADODB_ADO_LAYER", 1 );
/*--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------*/
 
class ADODB_ado extends ADOConnection {
var $databaseType = "ado";
var $_bindInputArray = false;
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
var $replaceQuote = "''"; // string to use to replace quotes
var $dataProvider = "ado";
var $hasAffectedRows = true;
var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary
var $_affectedRows = false;
var $_thisTransactions;
var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic
var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;
var $_lock_type = -1;
var $_execute_option = -1;
var $poorAffectedRows = true;
var $charPage;
function ADODB_ado()
{
$this->_affectedRows = new VARIANT;
}
 
function ServerInfo()
{
if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
return array('description' => $desc, 'version' => '');
}
function _affectedrows()
{
if (PHP_VERSION >= 5) return $this->_affectedRows;
return $this->_affectedRows->value;
}
// you can also pass a connection string like this:
//
// $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL')
{
$u = 'UID';
$p = 'PWD';
if (!empty($this->charPage))
$dbc = new COM('ADODB.Connection',null,$this->charPage);
else
$dbc = new COM('ADODB.Connection');
if (! $dbc) return false;
 
/* special support if provider is mssql or access */
if ($argProvider=='mssql') {
$u = 'User Id'; //User parameter name for OLEDB
$p = 'Password';
$argProvider = "SQLOLEDB"; // SQL Server Provider
// not yet
//if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
//use trusted conection for SQL if username not specified
if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
} else if ($argProvider=='access')
$argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
if ($argProvider) $dbc->Provider = $argProvider;
if ($argUsername) $argHostname .= ";$u=$argUsername";
if ($argPassword)$argHostname .= ";$p=$argPassword";
if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
// @ added below for php 4.0.1 and earlier
@$dbc->Open((string) $argHostname);
$this->_connectionID = $dbc;
$dbc->CursorLocation = $this->_cursor_location;
return $dbc->State > 0;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
{
return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
}
/*
adSchemaCatalogs = 1,
adSchemaCharacterSets = 2,
adSchemaCollations = 3,
adSchemaColumns = 4,
adSchemaCheckConstraints = 5,
adSchemaConstraintColumnUsage = 6,
adSchemaConstraintTableUsage = 7,
adSchemaKeyColumnUsage = 8,
adSchemaReferentialContraints = 9,
adSchemaTableConstraints = 10,
adSchemaColumnsDomainUsage = 11,
adSchemaIndexes = 12,
adSchemaColumnPrivileges = 13,
adSchemaTablePrivileges = 14,
adSchemaUsagePrivileges = 15,
adSchemaProcedures = 16,
adSchemaSchemata = 17,
adSchemaSQLLanguages = 18,
adSchemaStatistics = 19,
adSchemaTables = 20,
adSchemaTranslations = 21,
adSchemaProviderTypes = 22,
adSchemaViews = 23,
adSchemaViewColumnUsage = 24,
adSchemaViewTableUsage = 25,
adSchemaProcedureParameters = 26,
adSchemaForeignKeys = 27,
adSchemaPrimaryKeys = 28,
adSchemaProcedureColumns = 29,
adSchemaDBInfoKeywords = 30,
adSchemaDBInfoLiterals = 31,
adSchemaCubes = 32,
adSchemaDimensions = 33,
adSchemaHierarchies = 34,
adSchemaLevels = 35,
adSchemaMeasures = 36,
adSchemaProperties = 37,
adSchemaMembers = 38
 
*/
function &MetaTables()
{
$arr= array();
$dbc = $this->_connectionID;
$adors=@$dbc->OpenSchema(20);//tables
if ($adors){
$f = $adors->Fields(2);//table/view name
$t = $adors->Fields(3);//table type
while (!$adors->EOF){
$tt=substr($t->value,0,6);
if ($tt!='SYSTEM' && $tt !='ACCESS')
$arr[]=$f->value;
//print $f->value . ' ' . $t->value.'<br>';
$adors->MoveNext();
}
$adors->Close();
}
return $arr;
}
function &MetaColumns($table)
{
$table = strtoupper($table);
$arr = array();
$dbc = $this->_connectionID;
$adors=@$dbc->OpenSchema(4);//tables
if ($adors){
$t = $adors->Fields(2);//table/view name
while (!$adors->EOF){
if (strtoupper($t->Value) == $table) {
$fld = new ADOFieldObject();
$c = $adors->Fields(3);
$fld->name = $c->Value;
$fld->type = 'CHAR'; // cannot discover type in ADO!
$fld->max_length = -1;
$arr[strtoupper($fld->name)]=$fld;
}
$adors->MoveNext();
}
$adors->Close();
}
$false = false;
return empty($arr) ? $false : $arr;
}
 
 
/* returns queryID or false */
function &_query($sql,$inputarr=false)
{
$dbc = $this->_connectionID;
$false = false;
// return rs
if ($inputarr) {
if (!empty($this->charPage))
$oCmd = new COM('ADODB.Command',null,$this->charPage);
else
$oCmd = new COM('ADODB.Command');
$oCmd->ActiveConnection = $dbc;
$oCmd->CommandText = $sql;
$oCmd->CommandType = 1;
 
foreach($inputarr as $val) {
// name, type, direction 1 = input, len,
$this->adoParameterType = 130;
$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
//print $p->Type.' '.$p->value;
$oCmd->Parameters->Append($p);
}
$p = false;
$rs = $oCmd->Execute();
$e = $dbc->Errors;
if ($dbc->Errors->Count > 0) return $false;
return $rs;
}
$rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
 
if ($dbc->Errors->Count > 0) return $false;
if (! $rs) return $false;
if ($rs->State == 0) {
$true = true;
return $true; // 0 = adStateClosed means no records returned
}
return $rs;
}
 
function BeginTrans()
{
if ($this->transOff) return true;
if (isset($this->_thisTransactions))
if (!$this->_thisTransactions) return false;
else {
$o = $this->_connectionID->Properties("Transaction DDL");
$this->_thisTransactions = $o ? true : false;
if (!$o) return false;
}
@$this->_connectionID->BeginTrans();
$this->transCnt += 1;
return true;
}
function CommitTrans($ok=true)
{
if (!$ok) return $this->RollbackTrans();
if ($this->transOff) return true;
@$this->_connectionID->CommitTrans();
if ($this->transCnt) @$this->transCnt -= 1;
return true;
}
function RollbackTrans() {
if ($this->transOff) return true;
@$this->_connectionID->RollbackTrans();
if ($this->transCnt) @$this->transCnt -= 1;
return true;
}
/* Returns: the last error message from previous database operation */
 
function ErrorMsg()
{
$errc = $this->_connectionID->Errors;
if ($errc->Count == 0) return '';
$err = $errc->Item($errc->Count-1);
return $err->Description;
}
function ErrorNo()
{
$errc = $this->_connectionID->Errors;
if ($errc->Count == 0) return 0;
$err = $errc->Item($errc->Count-1);
return $err->NativeError;
}
 
// returns true or false
function _close()
{
if ($this->_connectionID) $this->_connectionID->Close();
$this->_connectionID = false;
return true;
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_ado extends ADORecordSet {
var $bind = false;
var $databaseType = "ado";
var $dataProvider = "ado";
var $_tarr = false; // caches the types
var $_flds; // and field objects
var $canSeek = true;
var $hideErrors = true;
function ADORecordSet_ado($id,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
$this->fetchMode = $mode;
return $this->ADORecordSet($id,$mode);
}
 
 
// returns the field object
function &FetchField($fieldOffset = -1) {
$off=$fieldOffset+1; // offsets begin at 1
$o= new ADOFieldObject();
$rs = $this->_queryID;
$f = $rs->Fields($fieldOffset);
$o->name = $f->Name;
$t = $f->Type;
$o->type = $this->MetaType($t);
$o->max_length = $f->DefinedSize;
$o->ado_type = $t;
 
//print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";
return $o;
}
/* Use associative array to get fields array */
function Fields($colname)
{
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
 
function _initrs()
{
$rs = $this->_queryID;
$this->_numOfRows = $rs->RecordCount;
$f = $rs->Fields;
$this->_numOfFields = $f->Count;
}
// should only be used to move forward as we normally use forward-only cursors
function _seek($row)
{
$rs = $this->_queryID;
// absoluteposition doesn't work -- my maths is wrong ?
// $rs->AbsolutePosition->$row-2;
// return true;
if ($this->_currentRow > $row) return false;
@$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
return true;
}
/*
OLEDB types
enum DBTYPEENUM
{ DBTYPE_EMPTY = 0,
DBTYPE_NULL = 1,
DBTYPE_I2 = 2,
DBTYPE_I4 = 3,
DBTYPE_R4 = 4,
DBTYPE_R8 = 5,
DBTYPE_CY = 6,
DBTYPE_DATE = 7,
DBTYPE_BSTR = 8,
DBTYPE_IDISPATCH = 9,
DBTYPE_ERROR = 10,
DBTYPE_BOOL = 11,
DBTYPE_VARIANT = 12,
DBTYPE_IUNKNOWN = 13,
DBTYPE_DECIMAL = 14,
DBTYPE_UI1 = 17,
DBTYPE_ARRAY = 0x2000,
DBTYPE_BYREF = 0x4000,
DBTYPE_I1 = 16,
DBTYPE_UI2 = 18,
DBTYPE_UI4 = 19,
DBTYPE_I8 = 20,
DBTYPE_UI8 = 21,
DBTYPE_GUID = 72,
DBTYPE_VECTOR = 0x1000,
DBTYPE_RESERVED = 0x8000,
DBTYPE_BYTES = 128,
DBTYPE_STR = 129,
DBTYPE_WSTR = 130,
DBTYPE_NUMERIC = 131,
DBTYPE_UDT = 132,
DBTYPE_DBDATE = 133,
DBTYPE_DBTIME = 134,
DBTYPE_DBTIMESTAMP = 135
ADO Types
adEmpty = 0,
adTinyInt = 16,
adSmallInt = 2,
adInteger = 3,
adBigInt = 20,
adUnsignedTinyInt = 17,
adUnsignedSmallInt = 18,
adUnsignedInt = 19,
adUnsignedBigInt = 21,
adSingle = 4,
adDouble = 5,
adCurrency = 6,
adDecimal = 14,
adNumeric = 131,
adBoolean = 11,
adError = 10,
adUserDefined = 132,
adVariant = 12,
adIDispatch = 9,
adIUnknown = 13,
adGUID = 72,
adDate = 7,
adDBDate = 133,
adDBTime = 134,
adDBTimeStamp = 135,
adBSTR = 8,
adChar = 129,
adVarChar = 200,
adLongVarChar = 201,
adWChar = 130,
adVarWChar = 202,
adLongVarWChar = 203,
adBinary = 128,
adVarBinary = 204,
adLongVarBinary = 205,
adChapter = 136,
adFileTime = 64,
adDBFileTime = 137,
adPropVariant = 138,
adVarNumeric = 139
*/
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
if (!is_numeric($t)) return $t;
switch ($t) {
case 0:
case 12: // variant
case 8: // bstr
case 129: //char
case 130: //wc
case 200: // varc
case 202:// varWC
case 128: // bin
case 204: // varBin
case 72: // guid
if ($len <= $this->blobSize) return 'C';
case 201:
case 203:
return 'X';
case 128:
case 204:
case 205:
return 'B';
case 7:
case 133: return 'D';
case 134:
case 135: return 'T';
case 11: return 'L';
case 16:// adTinyInt = 16,
case 2://adSmallInt = 2,
case 3://adInteger = 3,
case 4://adBigInt = 20,
case 17://adUnsignedTinyInt = 17,
case 18://adUnsignedSmallInt = 18,
case 19://adUnsignedInt = 19,
case 20://adUnsignedBigInt = 21,
return 'I';
default: return 'N';
}
}
// time stamp not supported yet
function _fetch()
{
$rs = $this->_queryID;
if (!$rs or $rs->EOF) {
$this->fields = false;
return false;
}
$this->fields = array();
if (!$this->_tarr) {
$tarr = array();
$flds = array();
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
$f = $rs->Fields($i);
$flds[] = $f;
$tarr[] = $f->Type;
}
// bind types and flds only once
$this->_tarr = $tarr;
$this->_flds = $flds;
}
$t = reset($this->_tarr);
$f = reset($this->_flds);
if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
//echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
switch($t) {
case 135: // timestamp
if (!strlen((string)$f->value)) $this->fields[] = false;
else {
if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
// VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00
$val=(float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
else
$val = $f->value;
$this->fields[] = adodb_date('Y-m-d H:i:s',$val);
}
break;
case 133:// A date value (yyyymmdd)
if ($val = $f->value) {
$this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
} else
$this->fields[] = false;
break;
case 7: // adDate
if (!strlen((string)$f->value)) $this->fields[] = false;
else {
if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
else $val = $f->value;
if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
}
break;
case 1: // null
$this->fields[] = false;
break;
case 6: // currency is not supported properly;
ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
$this->fields[] = (float) $f->value;
break;
default:
$this->fields[] = $f->value;
break;
}
//print " $f->value $t, ";
$f = next($this->_flds);
$t = next($this->_tarr);
} // for
if ($this->hideErrors) error_reporting($olde);
@$rs->MoveNext(); // @ needed for some versions of PHP!
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
$this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
}
return true;
}
function NextRecordSet()
{
$rs = $this->_queryID;
$this->_queryID = $rs->NextRecordSet();
//$this->_queryID = $this->_QueryId->NextRecordSet();
if ($this->_queryID == null) return false;
$this->_currentRow = -1;
$this->_currentPage = -1;
$this->bind = false;
$this->fields = false;
$this->_flds = false;
$this->_tarr = false;
$this->_inited = false;
$this->Init();
return true;
}
 
function _close() {
$this->_flds = false;
@$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
$this->_queryID = false;
}
 
}
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-ado5.inc.php
0,0 → 1,639
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Microsoft ADO data driver. Requires ADO. Works only on MS Windows. PHP5 compat version.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
define("_ADODB_ADO_LAYER", 1 );
/*--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------*/
 
class ADODB_ado extends ADOConnection {
var $databaseType = "ado";
var $_bindInputArray = false;
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
var $replaceQuote = "''"; // string to use to replace quotes
var $dataProvider = "ado";
var $hasAffectedRows = true;
var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary
var $_affectedRows = false;
var $_thisTransactions;
var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic
var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;
var $_lock_type = -1;
var $_execute_option = -1;
var $poorAffectedRows = true;
var $charPage;
function ADODB_ado()
{
$this->_affectedRows = new VARIANT;
}
 
function ServerInfo()
{
if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
return array('description' => $desc, 'version' => '');
}
function _affectedrows()
{
if (PHP_VERSION >= 5) return $this->_affectedRows;
return $this->_affectedRows->value;
}
// you can also pass a connection string like this:
//
// $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL')
{
try {
$u = 'UID';
$p = 'PWD';
if (!empty($this->charPage))
$dbc = new COM('ADODB.Connection',null,$this->charPage);
else
$dbc = new COM('ADODB.Connection');
if (! $dbc) return false;
 
/* special support if provider is mssql or access */
if ($argProvider=='mssql') {
$u = 'User Id'; //User parameter name for OLEDB
$p = 'Password';
$argProvider = "SQLOLEDB"; // SQL Server Provider
// not yet
//if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
//use trusted conection for SQL if username not specified
if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
} else if ($argProvider=='access')
$argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
if ($argProvider) $dbc->Provider = $argProvider;
if ($argUsername) $argHostname .= ";$u=$argUsername";
if ($argPassword)$argHostname .= ";$p=$argPassword";
if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
// @ added below for php 4.0.1 and earlier
@$dbc->Open((string) $argHostname);
$this->_connectionID = $dbc;
$dbc->CursorLocation = $this->_cursor_location;
return $dbc->State > 0;
} catch (exception $e) {
}
return false;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
{
return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
}
/*
adSchemaCatalogs = 1,
adSchemaCharacterSets = 2,
adSchemaCollations = 3,
adSchemaColumns = 4,
adSchemaCheckConstraints = 5,
adSchemaConstraintColumnUsage = 6,
adSchemaConstraintTableUsage = 7,
adSchemaKeyColumnUsage = 8,
adSchemaReferentialContraints = 9,
adSchemaTableConstraints = 10,
adSchemaColumnsDomainUsage = 11,
adSchemaIndexes = 12,
adSchemaColumnPrivileges = 13,
adSchemaTablePrivileges = 14,
adSchemaUsagePrivileges = 15,
adSchemaProcedures = 16,
adSchemaSchemata = 17,
adSchemaSQLLanguages = 18,
adSchemaStatistics = 19,
adSchemaTables = 20,
adSchemaTranslations = 21,
adSchemaProviderTypes = 22,
adSchemaViews = 23,
adSchemaViewColumnUsage = 24,
adSchemaViewTableUsage = 25,
adSchemaProcedureParameters = 26,
adSchemaForeignKeys = 27,
adSchemaPrimaryKeys = 28,
adSchemaProcedureColumns = 29,
adSchemaDBInfoKeywords = 30,
adSchemaDBInfoLiterals = 31,
adSchemaCubes = 32,
adSchemaDimensions = 33,
adSchemaHierarchies = 34,
adSchemaLevels = 35,
adSchemaMeasures = 36,
adSchemaProperties = 37,
adSchemaMembers = 38
 
*/
function &MetaTables()
{
$arr= array();
$dbc = $this->_connectionID;
$adors=@$dbc->OpenSchema(20);//tables
if ($adors){
$f = $adors->Fields(2);//table/view name
$t = $adors->Fields(3);//table type
while (!$adors->EOF){
$tt=substr($t->value,0,6);
if ($tt!='SYSTEM' && $tt !='ACCESS')
$arr[]=$f->value;
//print $f->value . ' ' . $t->value.'<br>';
$adors->MoveNext();
}
$adors->Close();
}
return $arr;
}
function &MetaColumns($table)
{
$table = strtoupper($table);
$arr= array();
$dbc = $this->_connectionID;
$adors=@$dbc->OpenSchema(4);//tables
if ($adors){
$t = $adors->Fields(2);//table/view name
while (!$adors->EOF){
if (strtoupper($t->Value) == $table) {
$fld = new ADOFieldObject();
$c = $adors->Fields(3);
$fld->name = $c->Value;
$fld->type = 'CHAR'; // cannot discover type in ADO!
$fld->max_length = -1;
$arr[strtoupper($fld->name)]=$fld;
}
$adors->MoveNext();
}
$adors->Close();
}
return $arr;
}
 
 
/* returns queryID or false */
function &_query($sql,$inputarr=false)
{
try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour...
$dbc = $this->_connectionID;
// return rs
if ($inputarr) {
if (!empty($this->charPage))
$oCmd = new COM('ADODB.Command',null,$this->charPage);
else
$oCmd = new COM('ADODB.Command');
$oCmd->ActiveConnection = $dbc;
$oCmd->CommandText = $sql;
$oCmd->CommandType = 1;
 
foreach($inputarr as $val) {
// name, type, direction 1 = input, len,
$this->adoParameterType = 130;
$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
//print $p->Type.' '.$p->value;
$oCmd->Parameters->Append($p);
}
$p = false;
$rs = $oCmd->Execute();
$e = $dbc->Errors;
if ($dbc->Errors->Count > 0) return false;
return $rs;
}
$rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
if ($dbc->Errors->Count > 0) return false;
if (! $rs) return false;
if ($rs->State == 0) return true; // 0 = adStateClosed means no records returned
return $rs;
} catch (exception $e) {
}
return false;
}
 
function BeginTrans()
{
if ($this->transOff) return true;
if (isset($this->_thisTransactions))
if (!$this->_thisTransactions) return false;
else {
$o = $this->_connectionID->Properties("Transaction DDL");
$this->_thisTransactions = $o ? true : false;
if (!$o) return false;
}
@$this->_connectionID->BeginTrans();
$this->transCnt += 1;
return true;
}
function CommitTrans($ok=true)
{
if (!$ok) return $this->RollbackTrans();
if ($this->transOff) return true;
@$this->_connectionID->CommitTrans();
if ($this->transCnt) @$this->transCnt -= 1;
return true;
}
function RollbackTrans() {
if ($this->transOff) return true;
@$this->_connectionID->RollbackTrans();
if ($this->transCnt) @$this->transCnt -= 1;
return true;
}
/* Returns: the last error message from previous database operation */
 
function ErrorMsg()
{
$errc = $this->_connectionID->Errors;
if ($errc->Count == 0) return '';
$err = $errc->Item($errc->Count-1);
return $err->Description;
}
function ErrorNo()
{
$errc = $this->_connectionID->Errors;
if ($errc->Count == 0) return 0;
$err = $errc->Item($errc->Count-1);
return $err->NativeError;
}
 
// returns true or false
function _close()
{
if ($this->_connectionID) $this->_connectionID->Close();
$this->_connectionID = false;
return true;
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_ado extends ADORecordSet {
var $bind = false;
var $databaseType = "ado";
var $dataProvider = "ado";
var $_tarr = false; // caches the types
var $_flds; // and field objects
var $canSeek = true;
var $hideErrors = true;
function ADORecordSet_ado($id,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
$this->fetchMode = $mode;
return $this->ADORecordSet($id,$mode);
}
 
 
// returns the field object
function &FetchField($fieldOffset = -1) {
$off=$fieldOffset+1; // offsets begin at 1
$o= new ADOFieldObject();
$rs = $this->_queryID;
$f = $rs->Fields($fieldOffset);
$o->name = $f->Name;
$t = $f->Type;
$o->type = $this->MetaType($t);
$o->max_length = $f->DefinedSize;
$o->ado_type = $t;
 
//print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";
return $o;
}
/* Use associative array to get fields array */
function Fields($colname)
{
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
 
function _initrs()
{
$rs = $this->_queryID;
$this->_numOfRows = $rs->RecordCount;
$f = $rs->Fields;
$this->_numOfFields = $f->Count;
}
// should only be used to move forward as we normally use forward-only cursors
function _seek($row)
{
$rs = $this->_queryID;
// absoluteposition doesn't work -- my maths is wrong ?
// $rs->AbsolutePosition->$row-2;
// return true;
if ($this->_currentRow > $row) return false;
@$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
return true;
}
/*
OLEDB types
enum DBTYPEENUM
{ DBTYPE_EMPTY = 0,
DBTYPE_NULL = 1,
DBTYPE_I2 = 2,
DBTYPE_I4 = 3,
DBTYPE_R4 = 4,
DBTYPE_R8 = 5,
DBTYPE_CY = 6,
DBTYPE_DATE = 7,
DBTYPE_BSTR = 8,
DBTYPE_IDISPATCH = 9,
DBTYPE_ERROR = 10,
DBTYPE_BOOL = 11,
DBTYPE_VARIANT = 12,
DBTYPE_IUNKNOWN = 13,
DBTYPE_DECIMAL = 14,
DBTYPE_UI1 = 17,
DBTYPE_ARRAY = 0x2000,
DBTYPE_BYREF = 0x4000,
DBTYPE_I1 = 16,
DBTYPE_UI2 = 18,
DBTYPE_UI4 = 19,
DBTYPE_I8 = 20,
DBTYPE_UI8 = 21,
DBTYPE_GUID = 72,
DBTYPE_VECTOR = 0x1000,
DBTYPE_RESERVED = 0x8000,
DBTYPE_BYTES = 128,
DBTYPE_STR = 129,
DBTYPE_WSTR = 130,
DBTYPE_NUMERIC = 131,
DBTYPE_UDT = 132,
DBTYPE_DBDATE = 133,
DBTYPE_DBTIME = 134,
DBTYPE_DBTIMESTAMP = 135
ADO Types
adEmpty = 0,
adTinyInt = 16,
adSmallInt = 2,
adInteger = 3,
adBigInt = 20,
adUnsignedTinyInt = 17,
adUnsignedSmallInt = 18,
adUnsignedInt = 19,
adUnsignedBigInt = 21,
adSingle = 4,
adDouble = 5,
adCurrency = 6,
adDecimal = 14,
adNumeric = 131,
adBoolean = 11,
adError = 10,
adUserDefined = 132,
adVariant = 12,
adIDispatch = 9,
adIUnknown = 13,
adGUID = 72,
adDate = 7,
adDBDate = 133,
adDBTime = 134,
adDBTimeStamp = 135,
adBSTR = 8,
adChar = 129,
adVarChar = 200,
adLongVarChar = 201,
adWChar = 130,
adVarWChar = 202,
adLongVarWChar = 203,
adBinary = 128,
adVarBinary = 204,
adLongVarBinary = 205,
adChapter = 136,
adFileTime = 64,
adDBFileTime = 137,
adPropVariant = 138,
adVarNumeric = 139
*/
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
if (!is_numeric($t)) return $t;
switch ($t) {
case 0:
case 12: // variant
case 8: // bstr
case 129: //char
case 130: //wc
case 200: // varc
case 202:// varWC
case 128: // bin
case 204: // varBin
case 72: // guid
if ($len <= $this->blobSize) return 'C';
case 201:
case 203:
return 'X';
case 128:
case 204:
case 205:
return 'B';
case 7:
case 133: return 'D';
case 134:
case 135: return 'T';
case 11: return 'L';
case 16:// adTinyInt = 16,
case 2://adSmallInt = 2,
case 3://adInteger = 3,
case 4://adBigInt = 20,
case 17://adUnsignedTinyInt = 17,
case 18://adUnsignedSmallInt = 18,
case 19://adUnsignedInt = 19,
case 20://adUnsignedBigInt = 21,
return 'I';
default: return 'N';
}
}
// time stamp not supported yet
function _fetch()
{
$rs = $this->_queryID;
if (!$rs or $rs->EOF) {
$this->fields = false;
return false;
}
$this->fields = array();
if (!$this->_tarr) {
$tarr = array();
$flds = array();
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
$f = $rs->Fields($i);
$flds[] = $f;
$tarr[] = $f->Type;
}
// bind types and flds only once
$this->_tarr = $tarr;
$this->_flds = $flds;
}
$t = reset($this->_tarr);
$f = reset($this->_flds);
if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
//echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
switch($t) {
case 135: // timestamp
if (!strlen((string)$f->value)) $this->fields[] = false;
else {
if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
// VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00
$val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
else
$val = $f->value;
$this->fields[] = adodb_date('Y-m-d H:i:s',$val);
}
break;
case 133:// A date value (yyyymmdd)
if ($val = $f->value) {
$this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
} else
$this->fields[] = false;
break;
case 7: // adDate
if (!strlen((string)$f->value)) $this->fields[] = false;
else {
if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
else $val = $f->value;
if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
}
break;
case 1: // null
$this->fields[] = false;
break;
case 6: // currency is not supported properly;
ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
$this->fields[] = (float) $f->value;
break;
default:
$this->fields[] = $f->value;
break;
}
//print " $f->value $t, ";
$f = next($this->_flds);
$t = next($this->_tarr);
} // for
if ($this->hideErrors) error_reporting($olde);
@$rs->MoveNext(); // @ needed for some versions of PHP!
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
$this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
}
return true;
}
function NextRecordSet()
{
$rs = $this->_queryID;
$this->_queryID = $rs->NextRecordSet();
//$this->_queryID = $this->_QueryId->NextRecordSet();
if ($this->_queryID == null) return false;
$this->_currentRow = -1;
$this->_currentPage = -1;
$this->bind = false;
$this->fields = false;
$this->_flds = false;
$this->_tarr = false;
$this->_inited = false;
$this->Init();
return true;
}
 
function _close() {
$this->_flds = false;
@$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
$this->_queryID = false;
}
 
}
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-ado_access.inc.php
0,0 → 1,54
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Microsoft Access ADO data driver. Requires ADO and ODBC. Works only on MS Windows.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('_ADODB_ADO_LAYER')) {
if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php");
else include(ADODB_DIR."/drivers/adodb-ado.inc.php");
}
 
class ADODB_ado_access extends ADODB_ado {
var $databaseType = 'ado_access';
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
var $fmtDate = "#Y-m-d#";
var $fmtTimeStamp = "#Y-m-d h:i:sA#";// note no comma
var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
var $sysTimeStamp = 'NOW';
var $hasTransactions = false;
function ADODB_ado_access()
{
$this->ADODB_ado();
}
function BeginTrans() { return false;}
function CommitTrans() { return false;}
function RollbackTrans() { return false;}
 
}
 
class ADORecordSet_ado_access extends ADORecordSet_ado {
var $databaseType = "ado_access";
function ADORecordSet_ado_access($id,$mode=false)
{
return $this->ADORecordSet_ado($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-ado_mssql.inc.php
0,0 → 1,98
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Microsoft SQL Server ADO data driver. Requires ADO and MSSQL client.
Works only on MS Windows.
It is normally better to use the mssql driver directly because it is much faster.
This file is only a technology demonstration and for test purposes.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('_ADODB_ADO_LAYER')) {
if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php");
else include(ADODB_DIR."/drivers/adodb-ado.inc.php");
}
 
 
class ADODB_ado_mssql extends ADODB_ado {
var $databaseType = 'ado_mssql';
var $hasTop = 'top';
var $hasInsertID = true;
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
var $sysTimeStamp = 'GetDate()';
var $leftOuter = '*=';
var $rightOuter = '=*';
var $ansiOuter = true; // for mssql7 or later
var $substr = "substring";
var $length = 'len';
//var $_inTransaction = 1; // always open recordsets, so no transaction problems.
function ADODB_ado_mssql()
{
$this->ADODB_ado();
}
function _insertid()
{
return $this->GetOne('select @@identity');
}
function _affectedrows()
{
return $this->GetOne('select @@rowcount');
}
function MetaColumns($table)
{
$table = strtoupper($table);
$arr= array();
$dbc = $this->_connectionID;
$osoptions = array();
$osoptions[0] = null;
$osoptions[1] = null;
$osoptions[2] = $table;
$osoptions[3] = null;
$adors=@$dbc->OpenSchema(4, $osoptions);//tables
 
if ($adors){
while (!$adors->EOF){
$fld = new ADOFieldObject();
$c = $adors->Fields(3);
$fld->name = $c->Value;
$fld->type = 'CHAR'; // cannot discover type in ADO!
$fld->max_length = -1;
$arr[strtoupper($fld->name)]=$fld;
$adors->MoveNext();
}
$adors->Close();
}
$false = false;
return empty($arr) ? $false : $arr;
}
} // end class
class ADORecordSet_ado_mssql extends ADORecordSet_ado {
var $databaseType = 'ado_mssql';
function ADORecordSet_ado_mssql($id,$mode=false)
{
return $this->ADORecordSet_ado($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-borland_ibase.inc.php
0,0 → 1,91
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Support Borland Interbase 6.5 and later
 
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php");
 
class ADODB_borland_ibase extends ADODB_ibase {
var $databaseType = "borland_ibase";
function ADODB_borland_ibase()
{
$this->ADODB_ibase();
}
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
$this->autoCommit = false;
$this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID);
return $this->_transactionID;
}
function ServerInfo()
{
$arr['dialect'] = $this->dialect;
switch($arr['dialect']) {
case '':
case '1': $s = 'Interbase 6.5, Dialect 1'; break;
case '2': $s = 'Interbase 6.5, Dialect 2'; break;
default:
case '3': $s = 'Interbase 6.5, Dialect 3'; break;
}
$arr['version'] = '6.5';
$arr['description'] = $s;
return $arr;
}
// Note that Interbase 6.5 uses ROWS instead - don't you love forking wars!
// SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
// SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
// Firebird uses
// SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
{
if ($nrows > 0) {
if ($offset <= 0) $str = " ROWS $nrows ";
else {
$a = $offset+1;
$b = $offset+$nrows;
$str = " ROWS $a TO $b";
}
} else {
// ok, skip
$a = $offset + 1;
$str = " ROWS $a TO 999999999"; // 999 million
}
$sql .= $str;
return ($secs2cache) ?
$this->CacheExecute($secs2cache,$sql,$inputarr)
:
$this->Execute($sql,$inputarr);
}
};
 
class ADORecordSet_borland_ibase extends ADORecordSet_ibase {
var $databaseType = "borland_ibase";
function ADORecordSet_borland_ibase($id,$mode=false)
{
$this->ADORecordSet_ibase($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-csv.inc.php
0,0 → 1,207
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4.
Currently unsupported: MetaDatabases, MetaTables and MetaColumns, and also inputarr in Execute.
Native types have been converted to MetaTypes.
Transactions not supported yet.
Limitation of url length. For IIS, see MaxClientRequestBuffer registry value.
http://support.microsoft.com/default.aspx?scid=kb;en-us;260694
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (! defined("_ADODB_CSV_LAYER")) {
define("_ADODB_CSV_LAYER", 1 );
 
include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
class ADODB_csv extends ADOConnection {
var $databaseType = 'csv';
var $databaseProvider = 'csv';
var $hasInsertID = true;
var $hasAffectedRows = true;
var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $_affectedrows=0;
var $_insertid=0;
var $_url;
var $replaceQuote = "''"; // string to use to replace quotes
var $hasTransactions = false;
var $_errorNo = false;
function ADODB_csv()
{
}
function _insertid()
{
return $this->_insertid;
}
function _affectedrows()
{
return $this->_affectedrows;
}
function &MetaDatabases()
{
return false;
}
 
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
$this->_url = $argHostname;
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
$this->_url = $argHostname;
return true;
}
function &MetaColumns($table)
{
return false;
}
// parameters use PostgreSQL convention, not MySQL
function &SelectLimit($sql,$nrows=-1,$offset=-1)
{
global $ADODB_FETCH_MODE;
$url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=".
(($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE).
"&offset=$offset";
$err = false;
$rs = csv2rs($url,$err,false);
if ($this->debug) print "$url<br><i>$err</i><br>";
 
$at = strpos($err,'::::');
if ($at === false) {
$this->_errorMsg = $err;
$this->_errorNo = (integer)$err;
} else {
$this->_errorMsg = substr($err,$at+4,1024);
$this->_errorNo = -9999;
}
if ($this->_errorNo)
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,'');
}
if (is_object($rs)) {
$rs->databaseType='csv';
$rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
$rs->connection = &$this;
}
return $rs;
}
// returns queryID or false
function &_Execute($sql,$inputarr=false)
{
global $ADODB_FETCH_MODE;
if (!$this->_bindInputArray && $inputarr) {
$sqlarr = explode('?',$sql);
$sql = '';
$i = 0;
foreach($inputarr as $v) {
 
$sql .= $sqlarr[$i];
if (gettype($v) == 'string')
$sql .= $this->qstr($v);
else if ($v === null)
$sql .= 'NULL';
else
$sql .= $v;
$i += 1;
}
$sql .= $sqlarr[$i];
if ($i+1 != sizeof($sqlarr))
print "Input Array does not match ?: ".htmlspecialchars($sql);
$inputarr = false;
}
$url = $this->_url.'?sql='.urlencode($sql)."&fetch=".
(($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE);
$err = false;
$rs = csv2rs($url,$err,false);
if ($this->debug) print urldecode($url)."<br><i>$err</i><br>";
$at = strpos($err,'::::');
if ($at === false) {
$this->_errorMsg = $err;
$this->_errorNo = (integer)$err;
} else {
$this->_errorMsg = substr($err,$at+4,1024);
$this->_errorNo = -9999;
}
if ($this->_errorNo)
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr);
}
if (is_object($rs)) {
$rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
$this->_affectedrows = $rs->affectedrows;
$this->_insertid = $rs->insertid;
$rs->databaseType='csv';
$rs->connection = &$this;
}
return $rs;
}
 
/* Returns: the last error message from previous database operation */
function ErrorMsg()
{
return $this->_errorMsg;
}
/* Returns: the last error number from previous database operation */
function ErrorNo()
{
return $this->_errorNo;
}
// returns true or false
function _close()
{
return true;
}
} // class
 
class ADORecordset_csv extends ADORecordset {
function ADORecordset_csv($id,$mode=false)
{
$this->ADORecordset($id,$mode);
}
function _close()
{
return true;
}
}
 
} // define
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-db2.inc.php
0,0 → 1,687
<?php
/*
V4.80 8 Mar 2006 (c) 2006 John Lim (jlim@natsoft.com.my). All rights reserved.
 
This is a version of the ADODB driver for DB2. It uses the 'ibm_db2' PECL extension for PHP
(http://pecl.php.net/package/ibm_db2), which in turn requires DB2 V8.2.2.
 
Tested with PHP 5.1.1 and Apache 2.0.55 on Windows XP SP2.
 
This file was ported from "adodb-odbc.inc.php" by Larry Menard, "larry.menard@rogers.com".
I ripped out what I believed to be a lot of redundant or obsolete code, but there are
probably still some remnants of the ODBC support in this file; I'm relying on reviewers
of this code to point out any other things that can be removed.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
define("_ADODB_DB2_LAYER", 2 );
/*--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------*/
 
 
class ADODB_db2 extends ADOConnection {
var $databaseType = "db2";
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
var $replaceQuote = "''"; // string to use to replace quotes
var $dataProvider = "db2";
var $hasAffectedRows = true;
 
var $binmode = DB2_BINARY;
 
var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
// breaking backward-compat
var $_bindInputArray = false;
var $_genSeqSQL = "create table %s (id integer)";
var $_autocommit = true;
var $_haserrorfunctions = true;
var $_lastAffectedRows = 0;
var $uCaseTables = true; // for meta* functions, uppercase table names
function ADODB_db2()
{
$this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
}
// returns true or false
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
{
global $php_errormsg;
if (!function_exists('db2_connect')) {
ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension.");
return null;
}
// This needs to be set before the connect().
// Replaces the odbc_binmode() call that was in Execute()
ini_set('ibm_db2.binmode', $this->binmode);
 
if ($argDatabasename) {
$this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword);
} else {
$this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword);
}
if (isset($php_errormsg)) $php_errormsg = '';
 
// For db2_connect(), there is an optional 4th arg. If present, it must be
// an array of valid options. So far, we don't use them.
 
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
return $this->_connectionID != false;
}
// returns true or false
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
{
global $php_errormsg;
if (!function_exists('db2_connect')) return null;
// This needs to be set before the connect().
// Replaces the odbc_binmode() call that was in Execute()
ini_set('ibm_db2.binmode', $this->binmode);
 
if (isset($php_errormsg)) $php_errormsg = '';
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
if ($argDatabasename) {
$this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword);
} else {
$this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword);
}
if (isset($php_errormsg)) $php_errormsg = '';
 
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID);
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
return $this->_connectionID != false;
}
 
function ServerInfo()
{
if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
$dsn = strtoupper($this->host);
$first = true;
$found = false;
if (!function_exists('db2_data_source')) return false;
while(true) {
$rez = @db2_data_source($this->_connectionID,
$first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
$first = false;
if (!is_array($rez)) break;
if (strtoupper($rez['server']) == $dsn) {
$found = true;
break;
}
}
if (!$found) return ADOConnection::ServerInfo();
if (!isset($rez['version'])) $rez['version'] = '';
return $rez;
} else {
return ADOConnection::ServerInfo();
}
}
 
function CreateSequence($seqname='adodbseq',$start=1)
{
if (empty($this->_genSeqSQL)) return false;
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
if (!$ok) return false;
$start -= 1;
return $this->Execute("insert into $seqname values($start)");
}
var $_dropSeqSQL = 'drop table %s';
function DropSequence($seqname)
{
if (empty($this->_dropSeqSQL)) return false;
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
}
/*
This algorithm is not very efficient, but works even if table locking
is not available.
Will return false if unable to generate an ID after $MAXLOOPS attempts.
*/
function GenID($seq='adodbseq',$start=1)
{
// if you have to modify the parameter below, your database is overloaded,
// or you need to implement generation of id's yourself!
$MAXLOOPS = 100;
while (--$MAXLOOPS>=0) {
$num = $this->GetOne("select id from $seq");
if ($num === false) {
$this->Execute(sprintf($this->_genSeqSQL ,$seq));
$start -= 1;
$num = '0';
$ok = $this->Execute("insert into $seq values($start)");
if (!$ok) return false;
}
$this->Execute("update $seq set id=id+1 where id=$num");
if ($this->affected_rows() > 0) {
$num += 1;
$this->genID = $num;
return $num;
}
}
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
}
return false;
}
 
 
function ErrorMsg()
{
if ($this->_haserrorfunctions) {
if ($this->_errorMsg !== false) return $this->_errorMsg;
if (empty($this->_connectionID)) return @db2_errormsg();
return @db2_errormsg($this->_connectionID);
} else return ADOConnection::ErrorMsg();
}
function ErrorNo()
{
if ($this->_haserrorfunctions) {
if ($this->_errorCode !== false) {
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
}
 
if (empty($this->_connectionID)) $e = @db2_error();
else $e = @db2_error($this->_connectionID);
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
// so we check and patch
if (strlen($e)<=2) return 0;
return $e;
} else return ADOConnection::ErrorNo();
}
 
function BeginTrans()
{
if (!$this->hasTransactions) return false;
if ($this->transOff) return true;
$this->transCnt += 1;
$this->_autocommit = false;
return db2_autocommit($this->_connectionID,false);
}
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
if ($this->transCnt) $this->transCnt -= 1;
$this->_autocommit = true;
$ret = db2_commit($this->_connectionID);
db2_autocommit($this->_connectionID,true);
return $ret;
}
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->_autocommit = true;
$ret = db2_rollback($this->_connectionID);
db2_autocommit($this->_connectionID,true);
return $ret;
}
function MetaPrimaryKeys($table)
{
global $ADODB_FETCH_MODE;
if ($this->uCaseTables) $table = strtoupper($table);
$schema = '';
$this->_findschema($table,$schema);
 
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$qid = @db2_primarykeys($this->_connectionID,'',$schema,$table);
if (!$qid) {
$ADODB_FETCH_MODE = $savem;
return false;
}
$rs = new ADORecordSet_db2($qid);
$ADODB_FETCH_MODE = $savem;
if (!$rs) return false;
$arr =& $rs->GetArray();
$rs->Close();
$arr2 = array();
for ($i=0; $i < sizeof($arr); $i++) {
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
}
return $arr2;
}
function &MetaTables($ttype=false)
{
global $ADODB_FETCH_MODE;
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$qid = db2_tables($this->_connectionID);
$rs = new ADORecordSet_db2($qid);
$ADODB_FETCH_MODE = $savem;
if (!$rs) {
$false = false;
return $false;
}
$arr =& $rs->GetArray();
$rs->Close();
$arr2 = array();
if ($ttype) {
$isview = strncmp($ttype,'V',1) === 0;
}
for ($i=0; $i < sizeof($arr); $i++) {
if (!$arr[$i][2]) continue;
$type = $arr[$i][3];
if ($ttype) {
if ($isview) {
if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
}
return $arr2;
}
/*
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2datetime_data_type_changes.asp
/ SQL data type codes /
#define SQL_UNKNOWN_TYPE 0
#define SQL_CHAR 1
#define SQL_NUMERIC 2
#define SQL_DECIMAL 3
#define SQL_INTEGER 4
#define SQL_SMALLINT 5
#define SQL_FLOAT 6
#define SQL_REAL 7
#define SQL_DOUBLE 8
#if (DB2VER >= 0x0300)
#define SQL_DATETIME 9
#endif
#define SQL_VARCHAR 12
 
 
/ One-parameter shortcuts for date/time data types /
#if (DB2VER >= 0x0300)
#define SQL_TYPE_DATE 91
#define SQL_TYPE_TIME 92
#define SQL_TYPE_TIMESTAMP 93
 
#define SQL_UNICODE (-95)
#define SQL_UNICODE_VARCHAR (-96)
#define SQL_UNICODE_LONGVARCHAR (-97)
*/
function DB2Types($t)
{
switch ((integer)$t) {
case 1:
case 12:
case 0:
case -95:
case -96:
return 'C';
case -97:
case -1: //text
return 'X';
case -4: //image
return 'B';
case 9:
case 91:
return 'D';
case 10:
case 11:
case 92:
case 93:
return 'T';
case 4:
case 5:
case -6:
return 'I';
case -11: // uniqidentifier
return 'R';
case -7: //bit
return 'L';
default:
return 'N';
}
}
function &MetaColumns($table)
{
global $ADODB_FETCH_MODE;
$false = false;
if ($this->uCaseTables) $table = strtoupper($table);
$schema = '';
$this->_findschema($table,$schema);
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$colname = "%";
$qid = db2_columns($this->_connectionID, "", $schema, $table, $colname);
if (empty($qid)) return $false;
$rs =& new ADORecordSet_db2($qid);
$ADODB_FETCH_MODE = $savem;
if (!$rs) return $false;
$rs->_fetch();
$retarr = array();
/*
$rs->fields indices
0 TABLE_QUALIFIER
1 TABLE_SCHEM
2 TABLE_NAME
3 COLUMN_NAME
4 DATA_TYPE
5 TYPE_NAME
6 PRECISION
7 LENGTH
8 SCALE
9 RADIX
10 NULLABLE
11 REMARKS
*/
while (!$rs->EOF) {
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
$fld = new ADOFieldObject();
$fld->name = $rs->fields[3];
$fld->type = $this->DB2Types($rs->fields[4]);
// ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
// access uses precision to store length for char/varchar
if ($fld->type == 'C' or $fld->type == 'X') {
if ($rs->fields[4] <= -95) // UNICODE
$fld->max_length = $rs->fields[7]/2;
else
$fld->max_length = $rs->fields[7];
} else
$fld->max_length = $rs->fields[7];
$fld->not_null = !empty($rs->fields[10]);
$fld->scale = $rs->fields[8];
$retarr[strtoupper($fld->name)] = $fld;
} else if (sizeof($retarr)>0)
break;
$rs->MoveNext();
}
$rs->Close(); //-- crashes 4.03pl1 -- why?
if (empty($retarr)) $retarr = false;
return $retarr;
}
function Prepare($sql)
{
if (! $this->_bindInputArray) return $sql; // no binding
$stmt = db2_prepare($this->_connectionID,$sql);
if (!$stmt) {
// we don't know whether db2 driver is parsing prepared stmts, so just return sql
return $sql;
}
return array($sql,$stmt,false);
}
 
/* returns queryID or false */
function _query($sql,$inputarr=false)
{
GLOBAL $php_errormsg;
if (isset($php_errormsg)) $php_errormsg = '';
$this->_error = '';
if ($inputarr) {
if (is_array($sql)) {
$stmtid = $sql[1];
} else {
$stmtid = db2_prepare($this->_connectionID,$sql);
if ($stmtid == false) {
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
return false;
}
}
if (! db2_execute($stmtid,$inputarr)) {
if ($this->_haserrorfunctions) {
$this->_errorMsg = db2_errormsg();
$this->_errorCode = db2_error();
}
return false;
}
} else if (is_array($sql)) {
$stmtid = $sql[1];
if (!db2_execute($stmtid)) {
if ($this->_haserrorfunctions) {
$this->_errorMsg = db2_errormsg();
$this->_errorCode = db2_error();
}
return false;
}
} else
$stmtid = db2_exec($this->_connectionID,$sql);
$this->_lastAffectedRows = 0;
if ($stmtid) {
if (@db2_num_fields($stmtid) == 0) {
$this->_lastAffectedRows = db2_num_rows($stmtid);
$stmtid = true;
} else {
$this->_lastAffectedRows = 0;
}
if ($this->_haserrorfunctions) {
$this->_errorMsg = '';
$this->_errorCode = 0;
} else
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
} else {
if ($this->_haserrorfunctions) {
$this->_errorMsg = db2_stmt_errormsg();
$this->_errorCode = db2_stmt_error();
} else
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
}
return $stmtid;
}
 
/*
Insert a null into the blob field of the table first.
Then use UpdateBlob to store the blob.
Usage:
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
*/
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{
return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
}
// returns true or false
function _close()
{
$ret = @db2_close($this->_connectionID);
$this->_connectionID = false;
return $ret;
}
 
function _affectedrows()
{
return $this->_lastAffectedRows;
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_db2 extends ADORecordSet {
var $bind = false;
var $databaseType = "db2";
var $dataProvider = "db2";
var $useFetchArray;
function ADORecordSet_db2($id,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
$this->fetchMode = $mode;
$this->_queryID = $id;
}
 
 
// returns the field object
function &FetchField($fieldOffset = -1)
{
$off=$fieldOffset+1; // offsets begin at 1
$o= new ADOFieldObject();
$o->name = @db2_field_name($this->_queryID,$off);
$o->type = @db2_field_type($this->_queryID,$off);
$o->max_length = db2_field_width($this->_queryID,$off);
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
return $o;
}
/* Use associative array to get fields array */
function Fields($colname)
{
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
 
return $this->fields[$this->bind[strtoupper($colname)]];
}
function _initrs()
{
global $ADODB_COUNTRECS;
$this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1;
$this->_numOfFields = @db2_num_fields($this->_queryID);
// some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
if ($this->_numOfRows == 0) $this->_numOfRows = -1;
}
function _seek($row)
{
return false;
}
// speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
function &GetArrayLimit($nrows,$offset=-1)
{
if ($offset <= 0) {
$rs =& $this->GetArray($nrows);
return $rs;
}
$savem = $this->fetchMode;
$this->fetchMode = ADODB_FETCH_NUM;
$this->Move($offset);
$this->fetchMode = $savem;
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
}
$results = array();
$cnt = 0;
while (!$this->EOF && $nrows != $cnt) {
$results[$cnt++] = $this->fields;
$this->MoveNext();
}
return $results;
}
function MoveNext()
{
if ($this->_numOfRows != 0 && !$this->EOF) {
$this->_currentRow++;
$this->fields = @db2_fetch_array($this->_queryID);
if ($this->fields) {
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
}
return true;
}
}
$this->fields = false;
$this->EOF = true;
return false;
}
function _fetch()
{
 
$this->fields = db2_fetch_array($this->_queryID);
if ($this->fields) {
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
}
return true;
}
$this->fields = false;
return false;
}
function _close()
{
return @db2_free_result($this->_queryID);
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-fbsql.inc.php
0,0 → 1,266
<?php
/*
@version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Contribution by Frank M. Kromann <frank@frontbase.com>.
Set tabs to 8.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (! defined("_ADODB_FBSQL_LAYER")) {
define("_ADODB_FBSQL_LAYER", 1 );
 
class ADODB_fbsql extends ADOConnection {
var $databaseType = 'fbsql';
var $hasInsertID = true;
var $hasAffectedRows = true;
var $metaTablesSQL = "SHOW TABLES";
var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $hasLimit = false;
function ADODB_fbsql()
{
}
function _insertid()
{
return fbsql_insert_id($this->_connectionID);
}
function _affectedrows()
{
return fbsql_affected_rows($this->_connectionID);
}
function &MetaDatabases()
{
$qid = fbsql_list_dbs($this->_connectionID);
$arr = array();
$i = 0;
$max = fbsql_num_rows($qid);
while ($i < $max) {
$arr[] = fbsql_tablename($qid,$i);
$i += 1;
}
return $arr;
}
 
// returns concatenated string
function Concat()
{
$s = "";
$arr = func_get_args();
$first = true;
 
$s = implode(',',$arr);
if (sizeof($arr) > 0) return "CONCAT($s)";
else return '';
}
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
$this->_connectionID = fbsql_connect($argHostname,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
$this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
function &MetaColumns($table)
{
if ($this->metaColumnsSQL) {
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
if ($rs === false) return false;
$retarr = array();
while (!$rs->EOF){
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$fld->type = $rs->fields[1];
// split type into type(length):
if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) {
$fld->type = $query_array[1];
$fld->max_length = $query_array[2];
} else {
$fld->max_length = -1;
}
$fld->not_null = ($rs->fields[2] != 'YES');
$fld->primary_key = ($rs->fields[3] == 'PRI');
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
$fld->binary = (strpos($fld->type,'blob') !== false);
$retarr[strtoupper($fld->name)] = $fld;
$rs->MoveNext();
}
$rs->Close();
return $retarr;
}
return false;
}
// returns true or false
function SelectDB($dbName)
{
$this->database = $dbName;
if ($this->_connectionID) {
return @fbsql_select_db($dbName,$this->_connectionID);
}
else return false;
}
// returns queryID or false
function _query($sql,$inputarr)
{
return fbsql_query("$sql;",$this->_connectionID);
}
 
/* Returns: the last error message from previous database operation */
function ErrorMsg()
{
$this->_errorMsg = @fbsql_error($this->_connectionID);
return $this->_errorMsg;
}
/* Returns: the last error number from previous database operation */
function ErrorNo()
{
return @fbsql_errno($this->_connectionID);
}
// returns true or false
function _close()
{
return @fbsql_close($this->_connectionID);
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_fbsql extends ADORecordSet{
var $databaseType = "fbsql";
var $canSeek = true;
function ADORecordSet_fbsql($queryID,$mode=false)
{
if (!$mode) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode) {
case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break;
case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break;
case ADODB_FETCH_BOTH:
default:
$this->fetchMode = FBSQL_BOTH; break;
}
return $this->ADORecordSet($queryID);
}
function _initrs()
{
GLOBAL $ADODB_COUNTRECS;
$this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1;
$this->_numOfFields = @fbsql_num_fields($this->_queryID);
}
 
 
function &FetchField($fieldOffset = -1) {
if ($fieldOffset != -1) {
$o = @fbsql_fetch_field($this->_queryID, $fieldOffset);
//$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable
$f = @fbsql_field_flags($this->_queryID,$fieldOffset);
$o->binary = (strpos($f,'binary')!== false);
}
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
$o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable
//$o->max_length = -1;
}
return $o;
}
function _seek($row)
{
return @fbsql_data_seek($this->_queryID,$row);
}
function _fetch($ignore_fields=false)
{
$this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode);
return ($this->fields == true);
}
function _close() {
return @fbsql_free_result($this->_queryID);
}
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
$len = -1; // fbsql max_length is not accurate
switch (strtoupper($t)) {
case 'CHARACTER':
case 'CHARACTER VARYING':
case 'BLOB':
case 'CLOB':
case 'BIT':
case 'BIT VARYING':
if ($len <= $this->blobSize) return 'C';
// so we have to check whether binary...
case 'IMAGE':
case 'LONGBLOB':
case 'BLOB':
case 'MEDIUMBLOB':
return !empty($fieldobj->binary) ? 'B' : 'X';
case 'DATE': return 'D';
case 'TIME':
case 'TIME WITH TIME ZONE':
case 'TIMESTAMP':
case 'TIMESTAMP WITH TIME ZONE': return 'T';
case 'PRIMARY_KEY':
return 'R';
case 'INTEGER':
case 'SMALLINT':
case 'BOOLEAN':
if (!empty($fieldobj->primary_key)) return 'R';
else return 'I';
default: return 'N';
}
}
 
} //class
} // defined
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-firebird.inc.php
0,0 → 1,77
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
 
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php");
 
class ADODB_firebird extends ADODB_ibase {
var $databaseType = "firebird";
var $dialect = 3;
var $sysTimeStamp = "cast('NOW' as timestamp)";
function ADODB_firebird()
{
$this->ADODB_ibase();
}
function ServerInfo()
{
$arr['dialect'] = $this->dialect;
switch($arr['dialect']) {
case '':
case '1': $s = 'Firebird Dialect 1'; break;
case '2': $s = 'Firebird Dialect 2'; break;
default:
case '3': $s = 'Firebird Dialect 3'; break;
}
$arr['version'] = ADOConnection::_findvers($s);
$arr['description'] = $s;
return $arr;
}
// Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars!
// SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
// SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0)
{
$nrows = (integer) $nrows;
$offset = (integer) $offset;
$str = 'SELECT ';
if ($nrows >= 0) $str .= "FIRST $nrows ";
$str .=($offset>=0) ? "SKIP $offset " : '';
$sql = preg_replace('/^[ \t]*select/i',$str,$sql);
if ($secs)
$rs =& $this->CacheExecute($secs,$sql,$inputarr);
else
$rs =& $this->Execute($sql,$inputarr);
return $rs;
}
};
 
class ADORecordSet_firebird extends ADORecordSet_ibase {
var $databaseType = "firebird";
function ADORecordSet_firebird($id,$mode=false)
{
$this->ADORecordSet_ibase($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-ibase.inc.php
0,0 → 1,861
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
 
Latest version is available at http://adodb.sourceforge.net
Interbase data driver. Requires interbase client. Works on Windows and Unix.
 
3 Jan 2002 -- suggestions by Hans-Peter Oeri <kampfcaspar75@oeri.ch>
changed transaction handling and added experimental blob stuff
Docs to interbase at the website
http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html
To use gen_id(), see
http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen
$rs = $conn->Execute('select gen_id(adodb,1) from rdb$database');
$id = $rs->fields[0];
$conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)");
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB_ibase extends ADOConnection {
var $databaseType = "ibase";
var $dataProvider = "ibase";
var $replaceQuote = "''"; // string to use to replace quotes
var $ibase_datefmt = '%Y-%m-%d'; // For hours,mins,secs change to '%Y-%m-%d %H:%M:%S';
var $fmtDate = "'Y-m-d'";
var $ibase_timestampfmt = "%Y-%m-%d %H:%M:%S";
var $ibase_timefmt = "%H:%M:%S";
var $fmtTimeStamp = "'Y-m-d, H:i:s'";
var $concat_operator='||';
var $_transactionID;
var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'";
//OPN STUFF start
var $metaColumnsSQL = "select a.rdb\$field_name, a.rdb\$null_flag, a.rdb\$default_source, b.rdb\$field_length, b.rdb\$field_scale, b.rdb\$field_sub_type, b.rdb\$field_precision, b.rdb\$field_type from rdb\$relation_fields a, rdb\$fields b where a.rdb\$field_source = b.rdb\$field_name and a.rdb\$relation_name = '%s' order by a.rdb\$field_position asc";
//OPN STUFF end
var $ibasetrans;
var $hasGenID = true;
var $_bindInputArray = true;
var $buffers = 0;
var $dialect = 1;
var $sysDate = "cast('TODAY' as timestamp)";
var $sysTimeStamp = "cast('NOW' as timestamp)";
var $ansiOuter = true;
var $hasAffectedRows = false;
var $poorAffectedRows = true;
var $blobEncodeType = 'C';
var $role = false;
function ADODB_ibase()
{
if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT;
}
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false)
{
if (!function_exists('ibase_pconnect')) return null;
if ($argDatabasename) $argHostname .= ':'.$argDatabasename;
$fn = ($persist) ? 'ibase_pconnect':'ibase_connect';
if ($this->role)
$this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
$this->charSet,$this->buffers,$this->dialect,$this->role);
else
$this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
$this->charSet,$this->buffers,$this->dialect);
if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html
$this->replaceQuote = "''";
}
if ($this->_connectionID === false) {
$this->_handleerror();
return false;
}
// PHP5 change.
if (function_exists('ibase_timefmt')) {
ibase_timefmt($this->ibase_datefmt,IBASE_DATE );
if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP );
else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP );
ibase_timefmt($this->ibase_timefmt,IBASE_TIME );
} else {
ini_set("ibase.timestampformat", $this->ibase_timestampfmt);
ini_set("ibase.dateformat", $this->ibase_datefmt);
ini_set("ibase.timeformat", $this->ibase_timefmt);
}
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true);
}
function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false)
{
if ($internalKey) return array('RDB$DB_KEY');
$table = strtoupper($table);
$sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME
FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME
WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\'
ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION';
 
$a = $this->GetCol($sql,false,true);
if ($a && sizeof($a)>0) return $a;
return false;
}
function ServerInfo()
{
$arr['dialect'] = $this->dialect;
switch($arr['dialect']) {
case '':
case '1': $s = 'Interbase 5.5 or earlier'; break;
case '2': $s = 'Interbase 5.6'; break;
default:
case '3': $s = 'Interbase 6.0'; break;
}
$arr['version'] = ADOConnection::_findvers($s);
$arr['description'] = $s;
return $arr;
}
 
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
$this->autoCommit = false;
$this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID);
return $this->_transactionID;
}
function CommitTrans($ok=true)
{
if (!$ok) return $this->RollbackTrans();
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$ret = false;
$this->autoCommit = true;
if ($this->_transactionID) {
//print ' commit ';
$ret = ibase_commit($this->_transactionID);
}
$this->_transactionID = false;
return $ret;
}
// there are some compat problems with ADODB_COUNTRECS=false and $this->_logsql currently.
// it appears that ibase extension cannot support multiple concurrent queryid's
function &_Execute($sql,$inputarr=false)
{
global $ADODB_COUNTRECS;
if ($this->_logsql) {
$savecrecs = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = true; // force countrecs
$ret =& ADOConnection::_Execute($sql,$inputarr);
$ADODB_COUNTRECS = $savecrecs;
} else {
$ret =& ADOConnection::_Execute($sql,$inputarr);
}
return $ret;
}
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$ret = false;
$this->autoCommit = true;
if ($this->_transactionID)
$ret = ibase_rollback($this->_transactionID);
$this->_transactionID = false;
return $ret;
}
function &MetaIndexes ($table, $primary = FALSE, $owner=false)
{
// save old fetch mode
global $ADODB_FETCH_MODE;
$false = false;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
$table = strtoupper($table);
$sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'";
if (!$primary) {
$sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'";
} else {
$sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'";
}
// get index details
$rs = $this->Execute($sql);
if (!is_object($rs)) {
// restore fetchmode
if (isset($savem)) {
$this->SetFetchMode($savem);
}
$ADODB_FETCH_MODE = $save;
return $false;
}
$indexes = array();
while ($row = $rs->FetchRow()) {
$index = $row[0];
if (!isset($indexes[$index])) {
if (is_null($row[3])) {$row[3] = 0;}
$indexes[$index] = array(
'unique' => ($row[3] == 1),
'columns' => array()
);
}
$sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$index."' ORDER BY RDB\$FIELD_POSITION ASC";
$rs1 = $this->Execute($sql);
while ($row1 = $rs1->FetchRow()) {
$indexes[$index]['columns'][$row1[2]] = $row1[1];
}
}
// restore fetchmode
if (isset($savem)) {
$this->SetFetchMode($savem);
}
$ADODB_FETCH_MODE = $save;
return $indexes;
}
 
// See http://community.borland.com/article/0,1410,25844,00.html
function RowLock($tables,$where,$col)
{
if ($this->autoCommit) $this->BeginTrans();
$this->Execute("UPDATE $table SET $col=$col WHERE $where "); // is this correct - jlim?
return 1;
}
function CreateSequence($seqname,$startID=1)
{
$ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
if (!$ok) return false;
return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
}
function DropSequence($seqname)
{
$seqname = strtoupper($seqname);
$this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'");
}
function GenID($seqname='adodbseq',$startID=1)
{
$getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE");
$rs = @$this->Execute($getnext);
if (!$rs) {
$this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
$this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
$rs = $this->Execute($getnext);
}
if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields);
else $this->genID = 0; // false
if ($rs) $rs->Close();
return $this->genID;
}
 
function SelectDB($dbName)
{
return false;
}
 
function _handleerror()
{
$this->_errorMsg = ibase_errmsg();
}
 
function ErrorNo()
{
if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1];
else return 0;
}
 
function ErrorMsg()
{
return $this->_errorMsg;
}
 
function Prepare($sql)
{
$stmt = ibase_prepare($this->_connectionID,$sql);
if (!$stmt) return false;
return array($sql,$stmt);
}
 
// returns query ID if successful, otherwise false
// there have been reports of problems with nested queries - the code is probably not re-entrant?
function _query($sql,$iarr=false)
{
 
if (!$this->autoCommit && $this->_transactionID) {
$conn = $this->_transactionID;
$docommit = false;
} else {
$conn = $this->_connectionID;
$docommit = true;
}
if (is_array($sql)) {
$fn = 'ibase_execute';
$sql = $sql[1];
if (is_array($iarr)) {
if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4
if ( !isset($iarr[0]) ) $iarr[0] = ''; // PHP5 compat hack
$fnarr =& array_merge( array($sql) , $iarr);
$ret = call_user_func_array($fn,$fnarr);
} else {
switch(sizeof($iarr)) {
case 1: $ret = $fn($sql,$iarr[0]); break;
case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break;
case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break;
case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
default: ADOConnection::outp( "Too many parameters to ibase query $sql");
case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
}
}
} else $ret = $fn($sql);
} else {
$fn = 'ibase_query';
if (is_array($iarr)) {
if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4
if (sizeof($iarr) == 0) $iarr[0] = ''; // PHP5 compat hack
$fnarr =& array_merge( array($conn,$sql) , $iarr);
$ret = call_user_func_array($fn,$fnarr);
} else {
switch(sizeof($iarr)) {
case 1: $ret = $fn($conn,$sql,$iarr[0]); break;
case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break;
case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break;
case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
default: ADOConnection::outp( "Too many parameters to ibase query $sql");
case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
}
}
} else $ret = $fn($conn,$sql);
}
if ($docommit && $ret === true) ibase_commit($this->_connectionID);
 
$this->_handleerror();
return $ret;
}
 
// returns true or false
function _close()
{
if (!$this->autoCommit) @ibase_rollback($this->_connectionID);
return @ibase_close($this->_connectionID);
}
//OPN STUFF start
function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $dialect3)
{
$fscale = abs($fscale);
$fld->max_length = $flen;
$fld->scale = null;
switch($ftype){
case 7:
case 8:
if ($dialect3) {
switch($fsubtype){
case 0:
$fld->type = ($ftype == 7 ? 'smallint' : 'integer');
break;
case 1:
$fld->type = 'numeric';
$fld->max_length = $fprecision;
$fld->scale = $fscale;
break;
case 2:
$fld->type = 'decimal';
$fld->max_length = $fprecision;
$fld->scale = $fscale;
break;
} // switch
} else {
if ($fscale !=0) {
$fld->type = 'decimal';
$fld->scale = $fscale;
$fld->max_length = ($ftype == 7 ? 4 : 9);
} else {
$fld->type = ($ftype == 7 ? 'smallint' : 'integer');
}
}
break;
case 16:
if ($dialect3) {
switch($fsubtype){
case 0:
$fld->type = 'decimal';
$fld->max_length = 18;
$fld->scale = 0;
break;
case 1:
$fld->type = 'numeric';
$fld->max_length = $fprecision;
$fld->scale = $fscale;
break;
case 2:
$fld->type = 'decimal';
$fld->max_length = $fprecision;
$fld->scale = $fscale;
break;
} // switch
}
break;
case 10:
$fld->type = 'float';
break;
case 14:
$fld->type = 'char';
break;
case 27:
if ($fscale !=0) {
$fld->type = 'decimal';
$fld->max_length = 15;
$fld->scale = 5;
} else {
$fld->type = 'double';
}
break;
case 35:
if ($dialect3) {
$fld->type = 'timestamp';
} else {
$fld->type = 'date';
}
break;
case 12:
$fld->type = 'date';
break;
case 13:
$fld->type = 'time';
break;
case 37:
$fld->type = 'varchar';
break;
case 40:
$fld->type = 'cstring';
break;
case 261:
$fld->type = 'blob';
$fld->max_length = -1;
break;
} // switch
}
//OPN STUFF end
// returns array of ADOFieldObjects for current table
function &MetaColumns($table)
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
$ADODB_FETCH_MODE = $save;
$false = false;
if ($rs === false) {
return $false;
}
$retarr = array();
//OPN STUFF start
$dialect3 = ($this->dialect==3 ? true : false);
//OPN STUFF end
while (!$rs->EOF) { //print_r($rs->fields);
$fld = new ADOFieldObject();
$fld->name = trim($rs->fields[0]);
//OPN STUFF start
$this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $dialect3);
if (isset($rs->fields[1]) && $rs->fields[1]) {
$fld->not_null = true;
}
if (isset($rs->fields[2])) {
$fld->has_default = true;
$d = substr($rs->fields[2],strlen('default '));
switch ($fld->type)
{
case 'smallint':
case 'integer': $fld->default_value = (int) $d; break;
case 'char':
case 'blob':
case 'text':
case 'varchar': $fld->default_value = (string) substr($d,1,strlen($d)-2); break;
case 'double':
case 'float': $fld->default_value = (float) $d; break;
default: $fld->default_value = $d; break;
}
// case 35:$tt = 'TIMESTAMP'; break;
}
if ((isset($rs->fields[5])) && ($fld->type == 'blob')) {
$fld->sub_type = $rs->fields[5];
} else {
$fld->sub_type = null;
}
//OPN STUFF end
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[strtoupper($fld->name)] = $fld;
$rs->MoveNext();
}
$rs->Close();
if ( empty($retarr)) return $false;
else return $retarr;
}
function BlobEncode( $blob )
{
$blobid = ibase_blob_create( $this->_connectionID);
ibase_blob_add( $blobid, $blob );
return ibase_blob_close( $blobid );
}
// since we auto-decode all blob's since 2.42,
// BlobDecode should not do any transforms
function BlobDecode($blob)
{
return $blob;
}
// old blobdecode function
// still used to auto-decode all blob's
function _BlobDecode( $blob )
{
$blobid = ibase_blob_open( $blob );
$realblob = ibase_blob_get( $blobid,$this->maxblobsize); // 2nd param is max size of blob -- Kevin Boillet <kevinboillet@yahoo.fr>
while($string = ibase_blob_get($blobid, 8192)){
$realblob .= $string;
}
ibase_blob_close( $blobid );
 
return( $realblob );
}
function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
{
$fd = fopen($path,'rb');
if ($fd === false) return false;
$blob_id = ibase_blob_create($this->_connectionID);
/* fill with data */
while ($val = fread($fd,32768)){
ibase_blob_add($blob_id, $val);
}
/* close and get $blob_id_str for inserting into table */
$blob_id_str = ibase_blob_close($blob_id);
fclose($fd);
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
}
/*
Insert a null into the blob field of the table first.
Then use UpdateBlob to store the blob.
Usage:
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
*/
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{
$blob_id = ibase_blob_create($this->_connectionID);
// ibase_blob_add($blob_id, $val);
// replacement that solves the problem by which only the first modulus 64K /
// of $val are stored at the blob field ////////////////////////////////////
// Thx Abel Berenstein aberenstein#afip.gov.ar
$len = strlen($val);
$chunk_size = 32768;
$tail_size = $len % $chunk_size;
$n_chunks = ($len - $tail_size) / $chunk_size;
for ($n = 0; $n < $n_chunks; $n++) {
$start = $n * $chunk_size;
$data = substr($val, $start, $chunk_size);
ibase_blob_add($blob_id, $data);
}
if ($tail_size) {
$start = $n_chunks * $chunk_size;
$data = substr($val, $start, $tail_size);
ibase_blob_add($blob_id, $data);
}
// end replacement /////////////////////////////////////////////////////////
$blob_id_str = ibase_blob_close($blob_id);
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
}
function OldUpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{
$blob_id = ibase_blob_create($this->_connectionID);
ibase_blob_add($blob_id, $val);
$blob_id_str = ibase_blob_close($blob_id);
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
}
// Format date column in sql string given an input format that understands Y M D
// Only since Interbase 6.0 - uses EXTRACT
// problem - does not zero-fill the day and month yet
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysDate;
$s = '';
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
if ($s) $s .= '||';
$ch = $fmt[$i];
switch($ch) {
case 'Y':
case 'y':
$s .= "extract(year from $col)";
break;
case 'M':
case 'm':
$s .= "extract(month from $col)";
break;
case 'Q':
case 'q':
$s .= "cast(((extract(month from $col)+2) / 3) as integer)";
break;
case 'D':
case 'd':
$s .= "(extract(day from $col))";
break;
case 'H':
case 'h':
$s .= "(extract(hour from $col))";
break;
case 'I':
case 'i':
$s .= "(extract(minute from $col))";
break;
case 'S':
case 's':
$s .= "CAST((extract(second from $col)) AS INTEGER)";
break;
 
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
$s .= $this->qstr($ch);
break;
}
}
return $s;
}
}
 
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordset_ibase extends ADORecordSet
{
 
var $databaseType = "ibase";
var $bind=false;
var $_cacheType;
function ADORecordset_ibase($id,$mode=false)
{
global $ADODB_FETCH_MODE;
$this->fetchMode = ($mode === false) ? $ADODB_FETCH_MODE : $mode;
$this->ADORecordSet($id);
}
 
/* Returns: an object containing field information.
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
fetchField() is retrieved. */
 
function &FetchField($fieldOffset = -1)
{
$fld = new ADOFieldObject;
$ibf = ibase_field_info($this->_queryID,$fieldOffset);
switch (ADODB_ASSOC_CASE) {
case 2: // the default
$fld->name = ($ibf['alias']);
if (empty($fld->name)) $fld->name = ($ibf['name']);
break;
case 0:
$fld->name = strtoupper($ibf['alias']);
if (empty($fld->name)) $fld->name = strtoupper($ibf['name']);
break;
case 1:
$fld->name = strtolower($ibf['alias']);
if (empty($fld->name)) $fld->name = strtolower($ibf['name']);
break;
}
$fld->type = $ibf['type'];
$fld->max_length = $ibf['length'];
/* This needs to be populated from the metadata */
$fld->not_null = false;
$fld->has_default = false;
$fld->default_value = 'null';
return $fld;
}
 
function _initrs()
{
$this->_numOfRows = -1;
$this->_numOfFields = @ibase_num_fields($this->_queryID);
 
// cache types for blob decode check
for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
$f1 = $this->FetchField($i);
$this->_cacheType[] = $f1->type;
}
}
 
function _seek($row)
{
return false;
}
function _fetch()
{
$f = @ibase_fetch_row($this->_queryID);
if ($f === false) {
$this->fields = false;
return false;
}
// OPN stuff start - optimized
// fix missing nulls and decode blobs automatically
global $ADODB_ANSI_PADDING_OFF;
//$ADODB_ANSI_PADDING_OFF=1;
$rtrim = !empty($ADODB_ANSI_PADDING_OFF);
for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
if ($this->_cacheType[$i]=="BLOB") {
if (isset($f[$i])) {
$f[$i] = $this->connection->_BlobDecode($f[$i]);
} else {
$f[$i] = null;
}
} else {
if (!isset($f[$i])) {
$f[$i] = null;
} else if ($rtrim && is_string($f[$i])) {
$f[$i] = rtrim($f[$i]);
}
}
}
// OPN stuff end
$this->fields = $f;
if ($this->fetchMode == ADODB_FETCH_ASSOC) {
$this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
} else if ($this->fetchMode == ADODB_FETCH_BOTH) {
$this->fields =& array_merge($this->fields,$this->GetRowAssoc(ADODB_ASSOC_CASE));
}
return true;
}
 
/* Use associative array to get fields array */
function Fields($colname)
{
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
 
function _close()
{
return @ibase_free_result($this->_queryID);
}
 
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
switch (strtoupper($t)) {
case 'CHAR':
return 'C';
case 'TEXT':
case 'VARCHAR':
case 'VARYING':
if ($len <= $this->blobSize) return 'C';
return 'X';
case 'BLOB':
return 'B';
case 'TIMESTAMP':
case 'DATE': return 'D';
case 'TIME': return 'T';
//case 'T': return 'T';
 
//case 'L': return 'L';
case 'INT':
case 'SHORT':
case 'INTEGER': return 'I';
default: return 'N';
}
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-informix.inc.php
0,0 → 1,35
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://php.weblogs.com
*
* Informix 9 driver that supports SELECT FIRST
*
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR.'/drivers/adodb-informix72.inc.php');
 
class ADODB_informix extends ADODB_informix72 {
var $databaseType = "informix";
var $hasTop = 'FIRST';
var $ansiOuter = true;
}
 
class ADORecordset_informix extends ADORecordset_informix72 {
var $databaseType = "informix";
function ADORecordset_informix($id,$mode=false)
{
$this->ADORecordset_informix72($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-informix72.inc.php
0,0 → 1,475
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim. All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
 
Latest version is available at http://adodb.sourceforge.net
 
Informix port by Mitchell T. Young (mitch@youngfamily.org)
 
Further mods by "Samuel CARRIERE" <samuel_carriere@hotmail.com>
 
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('IFX_SCROLL')) define('IFX_SCROLL',1);
 
class ADODB_informix72 extends ADOConnection {
var $databaseType = "informix72";
var $dataProvider = "informix";
var $replaceQuote = "''"; // string to use to replace quotes
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $hasInsertID = true;
var $hasAffectedRows = true;
var $substr = 'substr';
var $metaTablesSQL="select tabname,tabtype from systables where tabtype in ('T','V') and owner!='informix'"; //Don't get informix tables and pseudo-tables
 
 
var $metaColumnsSQL =
"select c.colname, c.coltype, c.collength, d.default,c.colno
from syscolumns c, systables t,outer sysdefaults d
where c.tabid=t.tabid and d.tabid=t.tabid and d.colno=c.colno
and tabname='%s' order by c.colno";
 
var $metaPrimaryKeySQL =
"select part1,part2,part3,part4,part5,part6,part7,part8 from
systables t,sysconstraints s,sysindexes i where t.tabname='%s'
and s.tabid=t.tabid and s.constrtype='P'
and i.idxname=s.idxname";
 
var $concat_operator = '||';
 
var $lastQuery = false;
var $has_insertid = true;
 
var $_autocommit = true;
var $_bindInputArray = true; // set to true if ADOConnection.Execute() permits binding of array parameters.
var $sysDate = 'TODAY';
var $sysTimeStamp = 'CURRENT';
var $cursorType = IFX_SCROLL; // IFX_SCROLL or IFX_HOLD or 0
function ADODB_informix72()
{
// alternatively, use older method:
//putenv("DBDATE=Y4MD-");
 
// force ISO date format
putenv('GL_DATE=%Y-%m-%d');
if (function_exists('ifx_byteasvarchar')) {
ifx_byteasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content.
ifx_textasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content.
ifx_blobinfile_mode(0); // Mode "0" means save Byte-Blobs in memory, and mode "1" means save Byte-Blobs in a file.
}
}
function ServerInfo()
{
if (isset($this->version)) return $this->version;
$arr['description'] = $this->GetOne("select DBINFO('version','full') from systables where tabid = 1");
$arr['version'] = $this->GetOne("select DBINFO('version','major') || DBINFO('version','minor') from systables where tabid = 1");
$this->version = $arr;
return $arr;
}
 
 
 
function _insertid()
{
$sqlca =ifx_getsqlca($this->lastQuery);
return @$sqlca["sqlerrd1"];
}
 
function _affectedrows()
{
if ($this->lastQuery) {
return @ifx_affected_rows ($this->lastQuery);
}
return 0;
}
 
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
$this->Execute('BEGIN');
$this->_autocommit = false;
return true;
}
 
function CommitTrans($ok=true)
{
if (!$ok) return $this->RollbackTrans();
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->Execute('COMMIT');
$this->_autocommit = true;
return true;
}
 
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->Execute('ROLLBACK');
$this->_autocommit = true;
return true;
}
 
function RowLock($tables,$where,$flds='1 as ignore')
{
if ($this->_autocommit) $this->BeginTrans();
return $this->GetOne("select $flds from $tables where $where for update");
}
 
/* Returns: the last error message from previous database operation
Note: This function is NOT available for Microsoft SQL Server. */
 
function ErrorMsg()
{
if (!empty($this->_logsql)) return $this->_errorMsg;
$this->_errorMsg = ifx_errormsg();
return $this->_errorMsg;
}
 
function ErrorNo()
{
preg_match("/.*SQLCODE=([^\]]*)/",ifx_error(),$parse);
if (is_array($parse) && isset($parse[1])) return (int)$parse[1];
return 0;
}
 
function &MetaColumns($table)
{
global $ADODB_FETCH_MODE;
$false = false;
if (!empty($this->metaColumnsSQL)) {
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rs === false) return $false;
$rspkey = $this->Execute(sprintf($this->metaPrimaryKeySQL,$table)); //Added to get primary key colno items
 
$retarr = array();
while (!$rs->EOF) { //print_r($rs->fields);
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
/* //!eos.
$rs->fields[1] is not the correct adodb type
$rs->fields[2] is not correct max_length, because can include not-null bit
 
$fld->type = $rs->fields[1];
$fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); //Added to set primary key flag
$fld->max_length = $rs->fields[2];*/
$pr=ifx_props($rs->fields[1],$rs->fields[2]); //!eos
$fld->type = $pr[0] ;//!eos
$fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields);
$fld->max_length = $pr[1]; //!eos
$fld->precision = $pr[2] ;//!eos
$fld->not_null = $pr[3]=="N"; //!eos
 
if (trim($rs->fields[3]) != "AAAAAA 0") {
$fld->has_default = 1;
$fld->default_value = $rs->fields[3];
} else {
$fld->has_default = 0;
}
 
$retarr[strtolower($fld->name)] = $fld;
$rs->MoveNext();
}
 
$rs->Close();
$rspKey->Close(); //!eos
return $retarr;
}
 
return $false;
}
function &xMetaColumns($table)
{
return ADOConnection::MetaColumns($table,false);
}
 
function MetaForeignKeys($table, $owner=false, $upper=false) //!Eos
{
$sql = "
select tr.tabname,updrule,delrule,
i.part1 o1,i2.part1 d1,i.part2 o2,i2.part2 d2,i.part3 o3,i2.part3 d3,i.part4 o4,i2.part4 d4,
i.part5 o5,i2.part5 d5,i.part6 o6,i2.part6 d6,i.part7 o7,i2.part7 d7,i.part8 o8,i2.part8 d8
from systables t,sysconstraints s,sysindexes i,
sysreferences r,systables tr,sysconstraints s2,sysindexes i2
where t.tabname='$table'
and s.tabid=t.tabid and s.constrtype='R' and r.constrid=s.constrid
and i.idxname=s.idxname and tr.tabid=r.ptabid
and s2.constrid=r.primary and i2.idxname=s2.idxname";
 
$rs = $this->Execute($sql);
if (!$rs || $rs->EOF) return false;
$arr =& $rs->GetArray();
$a = array();
foreach($arr as $v) {
$coldest=$this->metaColumnNames($v["tabname"]);
$colorig=$this->metaColumnNames($table);
$colnames=array();
for($i=1;$i<=8 && $v["o$i"] ;$i++) {
$colnames[]=$coldest[$v["d$i"]-1]."=".$colorig[$v["o$i"]-1];
}
if($upper)
$a[strtoupper($v["tabname"])] = $colnames;
else
$a[$v["tabname"]] = $colnames;
}
return $a;
}
 
function UpdateBlob($table, $column, $val, $where, $blobtype = 'BLOB')
{
$type = ($blobtype == 'TEXT') ? 1 : 0;
$blobid = ifx_create_blob($type,0,$val);
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blobid));
}
 
function BlobDecode($blobid)
{
return function_exists('ifx_byteasvarchar') ? $blobid : @ifx_get_blob($blobid);
}
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('ifx_connect')) return null;
$dbs = $argDatabasename . "@" . $argHostname;
if ($argHostname) putenv("INFORMIXSERVER=$argHostname");
putenv("INFORMIXSERVER=".trim($argHostname));
$this->_connectionID = ifx_connect($dbs,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
#if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
 
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('ifx_connect')) return null;
$dbs = $argDatabasename . "@" . $argHostname;
putenv("INFORMIXSERVER=".trim($argHostname));
$this->_connectionID = ifx_pconnect($dbs,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
#if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
/*
// ifx_do does not accept bind parameters - weird ???
function Prepare($sql)
{
$stmt = ifx_prepare($sql);
if (!$stmt) return $sql;
else return array($sql,$stmt);
}
*/
// returns query ID if successful, otherwise false
function _query($sql,$inputarr)
{
global $ADODB_COUNTRECS;
// String parameters have to be converted using ifx_create_char
if ($inputarr) {
foreach($inputarr as $v) {
if (gettype($v) == 'string') {
$tab[] = ifx_create_char($v);
}
else {
$tab[] = $v;
}
}
}
 
// In case of select statement, we use a scroll cursor in order
// to be able to call "move", or "movefirst" statements
if (!$ADODB_COUNTRECS && preg_match("/^\s*select/is", $sql)) {
if ($inputarr) {
$this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType, $tab);
}
else {
$this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType);
}
}
else {
if ($inputarr) {
$this->lastQuery = ifx_query($sql,$this->_connectionID, $tab);
}
else {
$this->lastQuery = ifx_query($sql,$this->_connectionID);
}
}
 
// Following line have been commented because autocommit mode is
// not supported by informix SE 7.2
 
//if ($this->_autocommit) ifx_query('COMMIT',$this->_connectionID);
 
return $this->lastQuery;
}
 
// returns true or false
function _close()
{
$this->lastQuery = false;
return ifx_close($this->_connectionID);
}
}
 
 
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordset_informix72 extends ADORecordSet {
 
var $databaseType = "informix72";
var $canSeek = true;
var $_fieldprops = false;
 
function ADORecordset_informix72($id,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
$this->fetchMode = $mode;
return $this->ADORecordSet($id);
}
 
 
 
/* Returns: an object containing field information.
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
fetchField() is retrieved. */
function &FetchField($fieldOffset = -1)
{
if (empty($this->_fieldprops)) {
$fp = ifx_fieldproperties($this->_queryID);
foreach($fp as $k => $v) {
$o = new ADOFieldObject;
$o->name = $k;
$arr = split(';',$v); //"SQLTYPE;length;precision;scale;ISNULLABLE"
$o->type = $arr[0];
$o->max_length = $arr[1];
$this->_fieldprops[] = $o;
$o->not_null = $arr[4]=="N";
}
}
$ret = $this->_fieldprops[$fieldOffset];
return $ret;
}
 
function _initrs()
{
$this->_numOfRows = -1; // ifx_affected_rows not reliable, only returns estimate -- ($ADODB_COUNTRECS)? ifx_affected_rows($this->_queryID):-1;
$this->_numOfFields = ifx_num_fields($this->_queryID);
}
 
function _seek($row)
{
return @ifx_fetch_row($this->_queryID, (int) $row);
}
 
function MoveLast()
{
$this->fields = @ifx_fetch_row($this->_queryID, "LAST");
if ($this->fields) $this->EOF = false;
$this->_currentRow = -1;
 
if ($this->fetchMode == ADODB_FETCH_NUM) {
foreach($this->fields as $v) {
$arr[] = $v;
}
$this->fields = $arr;
}
 
return true;
}
 
function MoveFirst()
{
$this->fields = @ifx_fetch_row($this->_queryID, "FIRST");
if ($this->fields) $this->EOF = false;
$this->_currentRow = 0;
 
if ($this->fetchMode == ADODB_FETCH_NUM) {
foreach($this->fields as $v) {
$arr[] = $v;
}
$this->fields = $arr;
}
 
return true;
}
 
function _fetch($ignore_fields=false)
{
 
$this->fields = @ifx_fetch_row($this->_queryID);
 
if (!is_array($this->fields)) return false;
 
if ($this->fetchMode == ADODB_FETCH_NUM) {
foreach($this->fields as $v) {
$arr[] = $v;
}
$this->fields = $arr;
}
return true;
}
 
/* close() only needs to be called if you are worried about using too much memory while your script
is running. All associated result memory for the specified result identifier will automatically be freed. */
function _close()
{
return ifx_free_result($this->_queryID);
}
 
}
/** !Eos
* Auxiliar function to Parse coltype,collength. Used by Metacolumns
* return: array ($mtype,$length,$precision,$nullable) (similar to ifx_fieldpropierties)
*/
function ifx_props($coltype,$collength){
$itype=fmod($coltype+1,256);
$nullable=floor(($coltype+1) /256) ?"N":"Y";
$mtype=substr(" CIIFFNNDN TBXCC ",$itype,1);
switch ($itype){
case 2:
$length=4;
case 6:
case 9:
case 14:
$length=floor($collength/256);
$precision=fmod($collength,256);
break;
default:
$precision=0;
$length=$collength;
}
return array($mtype,$length,$precision,$nullable);
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-ldap.inc.php
0,0 → 1,406
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
Revision 1: (02/25/2005) Updated codebase to include the _inject_bind_options function. This allows
users to access the options in the ldap_set_option function appropriately. Most importantly
LDAP Version 3 is now supported. See the examples for more information. Also fixed some minor
bugs that surfaced when PHP error levels were set high.
Joshua Eldridge (joshuae74#hotmail.com)
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('LDAP_ASSOC')) {
define('LDAP_ASSOC',ADODB_FETCH_ASSOC);
define('LDAP_NUM',ADODB_FETCH_NUM);
define('LDAP_BOTH',ADODB_FETCH_BOTH);
}
 
class ADODB_ldap extends ADOConnection {
var $databaseType = 'ldap';
var $dataProvider = 'ldap';
# Connection information
var $username = false;
var $password = false;
# Used during searches
var $filter;
var $dn;
var $version;
var $port = 389;
 
# Options configuration information
var $LDAP_CONNECT_OPTIONS;
 
function ADODB_ldap()
{
}
// returns true or false
function _connect( $host, $username, $password, $ldapbase)
{
global $LDAP_CONNECT_OPTIONS;
if ( !function_exists( 'ldap_connect' ) ) return null;
$conn_info = array( $host,$this->port);
if ( strstr( $host, ':' ) ) {
$conn_info = split( ':', $host );
}
$this->_connectionID = ldap_connect( $conn_info[0], $conn_info[1] );
if (!$this->_connectionID) {
$e = 'Could not connect to ' . $conn_info[0];
$this->_errorMsg = $e;
if ($this->debug) ADOConnection::outp($e);
return false;
}
if( count( $LDAP_CONNECT_OPTIONS ) > 0 ) {
$this->_inject_bind_options( $LDAP_CONNECT_OPTIONS );
}
if ($username) {
$bind = ldap_bind( $this->_connectionID, $username, $password );
} else {
$username = 'anonymous';
$bind = ldap_bind( $this->_connectionID );
}
if (!$bind) {
$e = 'Could not bind to ' . $conn_info[0] . " as ".$username;
$this->_errorMsg = $e;
if ($this->debug) ADOConnection::outp($e);
return false;
}
$this->_errorMsg = '';
$this->database = $ldapbase;
return $this->_connectionID;
}
/*
Valid Domain Values for LDAP Options:
 
LDAP_OPT_DEREF (integer)
LDAP_OPT_SIZELIMIT (integer)
LDAP_OPT_TIMELIMIT (integer)
LDAP_OPT_PROTOCOL_VERSION (integer)
LDAP_OPT_ERROR_NUMBER (integer)
LDAP_OPT_REFERRALS (boolean)
LDAP_OPT_RESTART (boolean)
LDAP_OPT_HOST_NAME (string)
LDAP_OPT_ERROR_STRING (string)
LDAP_OPT_MATCHED_DN (string)
LDAP_OPT_SERVER_CONTROLS (array)
LDAP_OPT_CLIENT_CONTROLS (array)
 
Make sure to set this BEFORE calling Connect()
 
Example:
 
$LDAP_CONNECT_OPTIONS = Array(
Array (
"OPTION_NAME"=>LDAP_OPT_DEREF,
"OPTION_VALUE"=>2
),
Array (
"OPTION_NAME"=>LDAP_OPT_SIZELIMIT,
"OPTION_VALUE"=>100
),
Array (
"OPTION_NAME"=>LDAP_OPT_TIMELIMIT,
"OPTION_VALUE"=>30
),
Array (
"OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION,
"OPTION_VALUE"=>3
),
Array (
"OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER,
"OPTION_VALUE"=>13
),
Array (
"OPTION_NAME"=>LDAP_OPT_REFERRALS,
"OPTION_VALUE"=>FALSE
),
Array (
"OPTION_NAME"=>LDAP_OPT_RESTART,
"OPTION_VALUE"=>FALSE
)
);
*/
 
function _inject_bind_options( $options ) {
foreach( $options as $option ) {
ldap_set_option( $this->_connectionID, $option["OPTION_NAME"], $option["OPTION_VALUE"] )
or die( "Unable to set server option: " . $option["OPTION_NAME"] );
}
}
/* returns _queryID or false */
function _query($sql,$inputarr)
{
$rs = ldap_search( $this->_connectionID, $this->database, $sql );
$this->_errorMsg = ($rs) ? '' : 'Search error on '.$sql;
return $rs;
}
 
/* closes the LDAP connection */
function _close()
{
@ldap_close( $this->_connectionID );
$this->_connectionID = false;
}
function SelectDB($db) {
$this->database = $db;
return true;
} // SelectDB
 
function ServerInfo()
{
if( !empty( $this->version ) ) return $this->version;
$version = array();
/*
Determines how aliases are handled during search.
LDAP_DEREF_NEVER (0x00)
LDAP_DEREF_SEARCHING (0x01)
LDAP_DEREF_FINDING (0x02)
LDAP_DEREF_ALWAYS (0x03)
The LDAP_DEREF_SEARCHING value means aliases are dereferenced during the search but
not when locating the base object of the search. The LDAP_DEREF_FINDING value means
aliases are dereferenced when locating the base object but not during the search.
Default: LDAP_DEREF_NEVER
*/
ldap_get_option( $this->_connectionID, LDAP_OPT_DEREF, $version['LDAP_OPT_DEREF'] ) ;
switch ( $version['LDAP_OPT_DEREF'] ) {
case 0:
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_NEVER';
case 1:
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_SEARCHING';
case 2:
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_FINDING';
case 3:
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_ALWAYS';
}
/*
A limit on the number of entries to return from a search.
LDAP_NO_LIMIT (0) means no limit.
Default: LDAP_NO_LIMIT
*/
ldap_get_option( $this->_connectionID, LDAP_OPT_SIZELIMIT, $version['LDAP_OPT_SIZELIMIT'] );
if ( $version['LDAP_OPT_SIZELIMIT'] == 0 ) {
$version['LDAP_OPT_SIZELIMIT'] = 'LDAP_NO_LIMIT';
}
/*
A limit on the number of seconds to spend on a search.
LDAP_NO_LIMIT (0) means no limit.
Default: LDAP_NO_LIMIT
*/
ldap_get_option( $this->_connectionID, LDAP_OPT_TIMELIMIT, $version['LDAP_OPT_TIMELIMIT'] );
if ( $version['LDAP_OPT_TIMELIMIT'] == 0 ) {
$version['LDAP_OPT_TIMELIMIT'] = 'LDAP_NO_LIMIT';
}
/*
Determines whether the LDAP library automatically follows referrals returned by LDAP servers or not.
LDAP_OPT_ON
LDAP_OPT_OFF
Default: ON
*/
ldap_get_option( $this->_connectionID, LDAP_OPT_REFERRALS, $version['LDAP_OPT_REFERRALS'] );
if ( $version['LDAP_OPT_REFERRALS'] == 0 ) {
$version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_OFF';
} else {
$version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_ON';
}
/*
Determines whether LDAP I/O operations are automatically restarted if they abort prematurely.
LDAP_OPT_ON
LDAP_OPT_OFF
Default: OFF
*/
ldap_get_option( $this->_connectionID, LDAP_OPT_RESTART, $version['LDAP_OPT_RESTART'] );
if ( $version['LDAP_OPT_RESTART'] == 0 ) {
$version['LDAP_OPT_RESTART'] = 'LDAP_OPT_OFF';
} else {
$version['LDAP_OPT_RESTART'] = 'LDAP_OPT_ON';
}
/*
This option indicates the version of the LDAP protocol used when communicating with the primary LDAP server.
LDAP_VERSION2 (2)
LDAP_VERSION3 (3)
Default: LDAP_VERSION2 (2)
*/
ldap_get_option( $this->_connectionID, LDAP_OPT_PROTOCOL_VERSION, $version['LDAP_OPT_PROTOCOL_VERSION'] );
if ( $version['LDAP_OPT_PROTOCOL_VERSION'] == 2 ) {
$version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION2';
} else {
$version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION3';
}
/* The host name (or list of hosts) for the primary LDAP server. */
ldap_get_option( $this->_connectionID, LDAP_OPT_HOST_NAME, $version['LDAP_OPT_HOST_NAME'] );
ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_NUMBER, $version['LDAP_OPT_ERROR_NUMBER'] );
ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_STRING, $version['LDAP_OPT_ERROR_STRING'] );
ldap_get_option( $this->_connectionID, LDAP_OPT_MATCHED_DN, $version['LDAP_OPT_MATCHED_DN'] );
return $this->version = $version;
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_ldap extends ADORecordSet{
var $databaseType = "ldap";
var $canSeek = false;
var $_entryID; /* keeps track of the entry resource identifier */
function ADORecordSet_ldap($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM:
$this->fetchMode = LDAP_NUM;
break;
case ADODB_FETCH_ASSOC:
$this->fetchMode = LDAP_ASSOC;
break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:
default:
$this->fetchMode = LDAP_BOTH;
break;
}
$this->ADORecordSet($queryID);
}
function _initrs()
{
/*
This could be teaked to respect the $COUNTRECS directive from ADODB
It's currently being used in the _fetch() function and the
GetAssoc() function
*/
$this->_numOfRows = ldap_count_entries( $this->connection->_connectionID, $this->_queryID );
 
}
 
/*
Return whole recordset as a multi-dimensional associative array
*/
function &GetAssoc($force_array = false, $first2cols = false)
{
$records = $this->_numOfRows;
$results = array();
for ( $i=0; $i < $records; $i++ ) {
foreach ( $this->fields as $k=>$v ) {
if ( is_array( $v ) ) {
if ( $v['count'] == 1 ) {
$results[$i][$k] = $v[0];
} else {
array_shift( $v );
$results[$i][$k] = $v;
}
}
}
}
return $results;
}
function &GetRowAssoc()
{
$results = array();
foreach ( $this->fields as $k=>$v ) {
if ( is_array( $v ) ) {
if ( $v['count'] == 1 ) {
$results[$k] = $v[0];
} else {
array_shift( $v );
$results[$k] = $v;
}
}
}
return $results;
}
function GetRowNums()
{
$results = array();
foreach ( $this->fields as $k=>$v ) {
static $i = 0;
if (is_array( $v )) {
if ( $v['count'] == 1 ) {
$results[$i] = $v[0];
} else {
array_shift( $v );
$results[$i] = $v;
}
$i++;
}
}
return $results;
}
function _fetch()
{
if ( $this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0 )
return false;
if ( $this->_currentRow == 0 ) {
$this->_entryID = ldap_first_entry( $this->connection->_connectionID, $this->_queryID );
} else {
$this->_entryID = ldap_next_entry( $this->connection->_connectionID, $this->_entryID );
}
$this->fields = ldap_get_attributes( $this->connection->_connectionID, $this->_entryID );
$this->_numOfFields = $this->fields['count'];
switch ( $this->fetchMode ) {
case LDAP_ASSOC:
$this->fields = $this->GetRowAssoc();
break;
case LDAP_NUM:
$this->fields = array_merge($this->GetRowNums(),$this->GetRowAssoc());
break;
case LDAP_BOTH:
default:
$this->fields = $this->GetRowNums();
break;
}
return ( is_array( $this->fields ) );
}
function _close() {
@ldap_free_result( $this->_queryID );
$this->_queryID = false;
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-mssql.inc.php
0,0 → 1,1024
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Native mssql driver. Requires mssql client. Works on Windows.
To configure for Unix, see
http://phpbuilder.com/columns/alberto20000919.php3
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
//----------------------------------------------------------------
// MSSQL returns dates with the format Oct 13 2002 or 13 Oct 2002
// and this causes tons of problems because localized versions of
// MSSQL will return the dates in dmy or mdy order; and also the
// month strings depends on what language has been configured. The
// following two variables allow you to control the localization
// settings - Ugh.
//
// MORE LOCALIZATION INFO
// ----------------------
// To configure datetime, look for and modify sqlcommn.loc,
// typically found in c:\mssql\install
// Also read :
// http://support.microsoft.com/default.aspx?scid=kb;EN-US;q220918
// Alternatively use:
// CONVERT(char(12),datecol,120)
//----------------------------------------------------------------
 
 
// has datetime converstion to YYYY-MM-DD format, and also mssql_fetch_assoc
if (ADODB_PHPVER >= 0x4300) {
// docs say 4.2.0, but testing shows only since 4.3.0 does it work!
ini_set('mssql.datetimeconvert',0);
} else {
global $ADODB_mssql_mths; // array, months must be upper-case
 
 
$ADODB_mssql_date_order = 'mdy';
$ADODB_mssql_mths = array(
'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,
'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
}
 
//---------------------------------------------------------------------------
// Call this to autoset $ADODB_mssql_date_order at the beginning of your code,
// just after you connect to the database. Supports mdy and dmy only.
// Not required for PHP 4.2.0 and above.
function AutoDetect_MSSQL_Date_Order($conn)
{
global $ADODB_mssql_date_order;
$adate = $conn->GetOne('select getdate()');
if ($adate) {
$anum = (int) $adate;
if ($anum > 0) {
if ($anum > 31) {
//ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently");
} else
$ADODB_mssql_date_order = 'dmy';
} else
$ADODB_mssql_date_order = 'mdy';
}
}
 
class ADODB_mssql extends ADOConnection {
var $databaseType = "mssql";
var $dataProvider = "mssql";
var $replaceQuote = "''"; // string to use to replace quotes
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $hasInsertID = true;
var $substr = "substring";
var $length = 'len';
var $hasAffectedRows = true;
var $metaDatabasesSQL = "select name from sysdatabases where name <> 'master'";
var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))";
var $metaColumnsSQL = # xtype==61 is datetime
"select c.name,t.name,c.length,
(case when c.xusertype=61 then 0 else c.xprec end),
(case when c.xusertype=61 then 0 else c.xscale end)
from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
var $hasGenID = true;
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
var $sysTimeStamp = 'GetDate()';
var $_has_mssql_init;
var $maxParameterLen = 4000;
var $arrayClass = 'ADORecordSet_array_mssql';
var $uniqueSort = true;
var $leftOuter = '*=';
var $rightOuter = '=*';
var $ansiOuter = true; // for mssql7 or later
var $poorAffectedRows = true;
var $identitySQL = 'select @@IDENTITY'; // 'select SCOPE_IDENTITY'; # for mssql 2000
var $uniqueOrderBy = true;
var $_bindInputArray = true;
function ADODB_mssql()
{
$this->_has_mssql_init = (strnatcmp(PHP_VERSION,'4.1.0')>=0);
}
 
function ServerInfo()
{
global $ADODB_FETCH_MODE;
$stmt = $this->PrepareSP('sp_server_info');
$val = 2;
if ($this->fetchMode === false) {
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
} else
$savem = $this->SetFetchMode(ADODB_FETCH_NUM);
$this->Parameter($stmt,$val,'attribute_id');
$row = $this->GetRow($stmt);
//$row = $this->GetRow("execute sp_server_info 2");
if ($this->fetchMode === false) {
$ADODB_FETCH_MODE = $savem;
} else
$this->SetFetchMode($savem);
$arr['description'] = $row[2];
$arr['version'] = ADOConnection::_findvers($arr['description']);
return $arr;
}
function IfNull( $field, $ifNull )
{
return " ISNULL($field, $ifNull) "; // if MS SQL Server
}
function _insertid()
{
// SCOPE_IDENTITY()
// Returns the last IDENTITY value inserted into an IDENTITY column in
// the same scope. A scope is a module -- a stored procedure, trigger,
// function, or batch. Thus, two statements are in the same scope if
// they are in the same stored procedure, function, or batch.
return $this->GetOne($this->identitySQL);
}
 
function _affectedrows()
{
return $this->GetOne('select @@rowcount');
}
 
var $_dropSeqSQL = "drop table %s";
function CreateSequence($seq='adodbseq',$start=1)
{
$this->Execute('BEGIN TRANSACTION adodbseq');
$start -= 1;
$this->Execute("create table $seq (id float(53))");
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
if (!$ok) {
$this->Execute('ROLLBACK TRANSACTION adodbseq');
return false;
}
$this->Execute('COMMIT TRANSACTION adodbseq');
return true;
}
 
function GenID($seq='adodbseq',$start=1)
{
//$this->debug=1;
$this->Execute('BEGIN TRANSACTION adodbseq');
$ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1");
if (!$ok) {
$this->Execute("create table $seq (id float(53))");
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
if (!$ok) {
$this->Execute('ROLLBACK TRANSACTION adodbseq');
return false;
}
$this->Execute('COMMIT TRANSACTION adodbseq');
return $start;
}
$num = $this->GetOne("select id from $seq");
$this->Execute('COMMIT TRANSACTION adodbseq');
return $num;
// in old implementation, pre 1.90, we returned GUID...
//return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'");
}
 
function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
{
if ($nrows > 0 && $offset <= 0) {
$sql = preg_replace(
'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql);
$rs =& $this->Execute($sql,$inputarr);
} else
$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
return $rs;
}
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysTimeStamp;
$s = '';
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
if ($s) $s .= '+';
$ch = $fmt[$i];
switch($ch) {
case 'Y':
case 'y':
$s .= "datename(yyyy,$col)";
break;
case 'M':
$s .= "convert(char(3),$col,0)";
break;
case 'm':
$s .= "replace(str(month($col),2),' ','0')";
break;
case 'Q':
case 'q':
$s .= "datename(quarter,$col)";
break;
case 'D':
case 'd':
$s .= "replace(str(day($col),2),' ','0')";
break;
case 'h':
$s .= "substring(convert(char(14),$col,0),13,2)";
break;
case 'H':
$s .= "replace(str(datepart(hh,$col),2),' ','0')";
break;
case 'i':
$s .= "replace(str(datepart(mi,$col),2),' ','0')";
break;
case 's':
$s .= "replace(str(datepart(ss,$col),2),' ','0')";
break;
case 'a':
case 'A':
$s .= "substring(convert(char(19),$col,0),18,2)";
break;
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
$s .= $this->qstr($ch);
break;
}
}
return $s;
}
 
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
$this->Execute('BEGIN TRAN');
return true;
}
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
if ($this->transCnt) $this->transCnt -= 1;
$this->Execute('COMMIT TRAN');
return true;
}
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->Execute('ROLLBACK TRAN');
return true;
}
/*
Usage:
$this->BeginTrans();
$this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables
# some operation on both tables table1 and table2
$this->CommitTrans();
See http://www.swynk.com/friends/achigrik/SQL70Locks.asp
*/
function RowLock($tables,$where,$flds='top 1 null as ignore')
{
if (!$this->transCnt) $this->BeginTrans();
return $this->GetOne("select $flds from $tables with (ROWLOCK,HOLDLOCK) where $where");
}
function &MetaIndexes($table,$primary=false)
{
$table = $this->qstr($table);
 
$sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno,
CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,
CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique
FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id
INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid
INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid
WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table
ORDER BY O.name, I.Name, K.keyno";
 
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
$rs = $this->Execute($sql);
if (isset($savem)) {
$this->SetFetchMode($savem);
}
$ADODB_FETCH_MODE = $save;
 
if (!is_object($rs)) {
return FALSE;
}
 
$indexes = array();
while ($row = $rs->FetchRow()) {
if (!$primary && $row[5]) continue;
$indexes[$row[0]]['unique'] = $row[6];
$indexes[$row[0]]['columns'][] = $row[1];
}
return $indexes;
}
function MetaForeignKeys($table, $owner=false, $upper=false)
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$table = $this->qstr(strtoupper($table));
$sql =
"select object_name(constid) as constraint_name,
col_name(fkeyid, fkey) as column_name,
object_name(rkeyid) as referenced_table_name,
col_name(rkeyid, rkey) as referenced_column_name
from sysforeignkeys
where upper(object_name(fkeyid)) = $table
order by constraint_name, referenced_table_name, keyno";
$constraints =& $this->GetArray($sql);
$ADODB_FETCH_MODE = $save;
$arr = false;
foreach($constraints as $constr) {
//print_r($constr);
$arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3];
}
if (!$arr) return false;
$arr2 = false;
foreach($arr as $k => $v) {
foreach($v as $a => $b) {
if ($upper) $a = strtoupper($a);
$arr2[$a] = $b;
}
}
return $arr2;
}
 
//From: Fernando Moreira <FMoreira@imediata.pt>
function MetaDatabases()
{
if(@mssql_select_db("master")) {
$qry=$this->metaDatabasesSQL;
if($rs=@mssql_query($qry)){
$tmpAr=$ar=array();
while($tmpAr=@mssql_fetch_row($rs))
$ar[]=$tmpAr[0];
@mssql_select_db($this->database);
if(sizeof($ar))
return($ar);
else
return(false);
} else {
@mssql_select_db($this->database);
return(false);
}
}
return(false);
}
 
// "Stein-Aksel Basma" <basma@accelero.no>
// tested with MSSQL 2000
function &MetaPrimaryKeys($table)
{
global $ADODB_FETCH_MODE;
$schema = '';
$this->_findschema($table,$schema);
if (!$schema) $schema = $this->database;
if ($schema) $schema = "and k.table_catalog like '$schema%'";
 
$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,
information_schema.table_constraints tc
where tc.constraint_name = k.constraint_name and tc.constraint_type =
'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$a = $this->GetCol($sql);
$ADODB_FETCH_MODE = $savem;
if ($a && sizeof($a)>0) return $a;
$false = false;
return $false;
}
 
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
if ($mask) {
$save = $this->metaTablesSQL;
$mask = $this->qstr(($mask));
$this->metaTablesSQL .= " AND name like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
if ($mask) {
$this->metaTablesSQL = $save;
}
return $ret;
}
function SelectDB($dbName)
{
$this->database = $dbName;
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
if ($this->_connectionID) {
return @mssql_select_db($dbName);
}
else return false;
}
function ErrorMsg()
{
if (empty($this->_errorMsg)){
$this->_errorMsg = mssql_get_last_message();
}
return $this->_errorMsg;
}
function ErrorNo()
{
if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode;
if (empty($this->_errorMsg)) {
$this->_errorMsg = mssql_get_last_message();
}
$id = @mssql_query("select @@ERROR",$this->_connectionID);
if (!$id) return false;
$arr = mssql_fetch_array($id);
@mssql_free_result($id);
if (is_array($arr)) return $arr[0];
else return -1;
}
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('mssql_pconnect')) return null;
$this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('mssql_pconnect')) return null;
$this->_connectionID = mssql_pconnect($argHostname,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
// persistent connections can forget to rollback on crash, so we do it here.
if ($this->autoRollback) {
$cnt = $this->GetOne('select @@TRANCOUNT');
while (--$cnt >= 0) $this->Execute('ROLLBACK TRAN');
}
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
function Prepare($sql)
{
$sqlarr = explode('?',$sql);
if (sizeof($sqlarr) <= 1) return $sql;
$sql2 = $sqlarr[0];
for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
$sql2 .= '@P'.($i-1) . $sqlarr[$i];
}
return array($sql,$this->qstr($sql2),$max);
}
function PrepareSP($sql)
{
if (!$this->_has_mssql_init) {
ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0");
return $sql;
}
$stmt = mssql_init($sql,$this->_connectionID);
if (!$stmt) return $sql;
return array($sql,$stmt);
}
// returns concatenated string
// MSSQL requires integers to be cast as strings
// automatically cast every datatype to VARCHAR(255)
// @author David Rogers (introspectshun)
function Concat()
{
$s = "";
$arr = func_get_args();
 
// Split single record on commas, if possible
if (sizeof($arr) == 1) {
foreach ($arr as $arg) {
$args = explode(',', $arg);
}
$arr = $args;
}
 
array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";'));
$s = implode('+',$arr);
if (sizeof($arr) > 0) return "$s";
return '';
}
/*
Usage:
$stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group
# note that the parameter does not have @ in front!
$db->Parameter($stmt,$id,'myid');
$db->Parameter($stmt,$group,'group',false,64);
$db->Execute($stmt);
@param $stmt Statement returned by Prepare() or PrepareSP().
@param $var PHP variable to bind to. Can set to null (for isNull support).
@param $name Name of stored procedure variable name to bind to.
@param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8.
@param [$maxLen] Holds an maximum length of the variable.
@param [$type] The data type of $var. Legal values depend on driver.
See mssql_bind documentation at php.net.
*/
function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=4000, $type=false)
{
if (!$this->_has_mssql_init) {
ADOConnection::outp( "Parameter: mssql_bind only available since PHP 4.1.0");
return false;
}
 
$isNull = is_null($var); // php 4.0.4 and above...
if ($type === false)
switch(gettype($var)) {
default:
case 'string': $type = SQLCHAR; break;
case 'double': $type = SQLFLT8; break;
case 'integer': $type = SQLINT4; break;
case 'boolean': $type = SQLINT1; break; # SQLBIT not supported in 4.1.0
}
if ($this->debug) {
$prefix = ($isOutput) ? 'Out' : 'In';
$ztype = (empty($type)) ? 'false' : $type;
ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);");
}
/*
See http://phplens.com/lens/lensforum/msgs.php?id=7231
RETVAL is HARD CODED into php_mssql extension:
The return value (a long integer value) is treated like a special OUTPUT parameter,
called "RETVAL" (without the @). See the example at mssql_execute to
see how it works. - type: one of this new supported PHP constants.
SQLTEXT, SQLVARCHAR,SQLCHAR, SQLINT1,SQLINT2, SQLINT4, SQLBIT,SQLFLT8
*/
if ($name !== 'RETVAL') $name = '@'.$name;
return mssql_bind($stmt[1], $name, $var, $type, $isOutput, $isNull, $maxLen);
}
/*
Unfortunately, it appears that mssql cannot handle varbinary > 255 chars
So all your blobs must be of type "image".
Remember to set in php.ini the following...
; Valid range 0 - 2147483647. Default = 4096.
mssql.textlimit = 0 ; zero to pass through
 
; Valid range 0 - 2147483647. Default = 4096.
mssql.textsize = 0 ; zero to pass through
*/
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{
if (strtoupper($blobtype) == 'CLOB') {
$sql = "UPDATE $table SET $column='" . $val . "' WHERE $where";
return $this->Execute($sql) != false;
}
$sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where";
return $this->Execute($sql) != false;
}
// returns query ID if successful, otherwise false
function _query($sql,$inputarr)
{
$this->_errorMsg = false;
if (is_array($inputarr)) {
# bind input params with sp_executesql:
# see http://www.quest-pipelines.com/newsletter-v3/0402_F.htm
# works only with sql server 7 and newer
if (!is_array($sql)) $sql = $this->Prepare($sql);
$params = '';
$decl = '';
$i = 0;
foreach($inputarr as $v) {
if ($decl) {
$decl .= ', ';
$params .= ', ';
}
if (is_string($v)) {
$len = strlen($v);
if ($len == 0) $len = 1;
if ($len > 4000 ) {
// NVARCHAR is max 4000 chars. Let's use NTEXT
$decl .= "@P$i NTEXT";
} else {
$decl .= "@P$i NVARCHAR($len)";
}
 
$params .= "@P$i=N". (strncmp($v,"'",1)==0? $v : $this->qstr($v));
} else if (is_integer($v)) {
$decl .= "@P$i INT";
$params .= "@P$i=".$v;
} else if (is_float($v)) {
$decl .= "@P$i FLOAT";
$params .= "@P$i=".$v;
} else if (is_bool($v)) {
$decl .= "@P$i INT"; # Used INT just in case BIT in not supported on the user's MSSQL version. It will cast appropriately.
$params .= "@P$i=".(($v)?'1':'0'); # True == 1 in MSSQL BIT fields and acceptable for storing logical true in an int field
} else {
$decl .= "@P$i CHAR"; # Used char because a type is required even when the value is to be NULL.
$params .= "@P$i=NULL";
}
$i += 1;
}
$decl = $this->qstr($decl);
if ($this->debug) ADOConnection::outp("<font size=-1>sp_executesql N{$sql[1]},N$decl,$params</font>");
$rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params");
} else if (is_array($sql)) {
# PrepareSP()
$rez = mssql_execute($sql[1]);
} else {
$rez = mssql_query($sql,$this->_connectionID);
}
return $rez;
}
// returns true or false
function _close()
{
if ($this->transCnt) $this->RollbackTrans();
$rez = @mssql_close($this->_connectionID);
$this->_connectionID = false;
return $rez;
}
// mssql uses a default date like Dec 30 2000 12:00AM
function UnixDate($v)
{
return ADORecordSet_array_mssql::UnixDate($v);
}
function UnixTimeStamp($v)
{
return ADORecordSet_array_mssql::UnixTimeStamp($v);
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordset_mssql extends ADORecordSet {
 
var $databaseType = "mssql";
var $canSeek = true;
var $hasFetchAssoc; // see http://phplens.com/lens/lensforum/msgs.php?id=6083
// _mths works only in non-localised system
function ADORecordset_mssql($id,$mode=false)
{
// freedts check...
$this->hasFetchAssoc = function_exists('mssql_fetch_assoc');
 
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
 
}
$this->fetchMode = $mode;
return $this->ADORecordSet($id,$mode);
}
function _initrs()
{
GLOBAL $ADODB_COUNTRECS;
$this->_numOfRows = ($ADODB_COUNTRECS)? @mssql_num_rows($this->_queryID):-1;
$this->_numOfFields = @mssql_num_fields($this->_queryID);
}
 
//Contributed by "Sven Axelsson" <sven.axelsson@bokochwebb.se>
// get next resultset - requires PHP 4.0.5 or later
function NextRecordSet()
{
if (!mssql_next_result($this->_queryID)) return false;
$this->_inited = false;
$this->bind = false;
$this->_currentRow = -1;
$this->Init();
return true;
}
 
/* Use associative array to get fields array */
function Fields($colname)
{
if ($this->fetchMode != ADODB_FETCH_NUM) return $this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
/* Returns: an object containing field information.
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
fetchField() is retrieved. */
 
function &FetchField($fieldOffset = -1)
{
if ($fieldOffset != -1) {
$f = @mssql_fetch_field($this->_queryID, $fieldOffset);
}
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
$f = @mssql_fetch_field($this->_queryID);
}
$false = false;
if (empty($f)) return $false;
return $f;
}
function _seek($row)
{
return @mssql_data_seek($this->_queryID, $row);
}
 
// speedup
function MoveNext()
{
if ($this->EOF) return false;
$this->_currentRow++;
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
if ($this->fetchMode & ADODB_FETCH_NUM) {
//ADODB_FETCH_BOTH mode
$this->fields = @mssql_fetch_array($this->_queryID);
}
else {
if ($this->hasFetchAssoc) {// only for PHP 4.2.0 or later
$this->fields = @mssql_fetch_assoc($this->_queryID);
} else {
$flds = @mssql_fetch_array($this->_queryID);
if (is_array($flds)) {
$fassoc = array();
foreach($flds as $k => $v) {
if (is_numeric($k)) continue;
$fassoc[$k] = $v;
}
$this->fields = $fassoc;
} else
$this->fields = false;
}
}
if (is_array($this->fields)) {
if (ADODB_ASSOC_CASE == 0) {
foreach($this->fields as $k=>$v) {
$this->fields[strtolower($k)] = $v;
}
} else if (ADODB_ASSOC_CASE == 1) {
foreach($this->fields as $k=>$v) {
$this->fields[strtoupper($k)] = $v;
}
}
}
} else {
$this->fields = @mssql_fetch_row($this->_queryID);
}
if ($this->fields) return true;
$this->EOF = true;
return false;
}
 
// INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4
// also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot!
function _fetch($ignore_fields=false)
{
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
if ($this->fetchMode & ADODB_FETCH_NUM) {
//ADODB_FETCH_BOTH mode
$this->fields = @mssql_fetch_array($this->_queryID);
} else {
if ($this->hasFetchAssoc) // only for PHP 4.2.0 or later
$this->fields = @mssql_fetch_assoc($this->_queryID);
else {
$this->fields = @mssql_fetch_array($this->_queryID);
if (@is_array($$this->fields)) {
$fassoc = array();
foreach($$this->fields as $k => $v) {
if (is_integer($k)) continue;
$fassoc[$k] = $v;
}
$this->fields = $fassoc;
}
}
}
if (!$this->fields) {
} else if (ADODB_ASSOC_CASE == 0) {
foreach($this->fields as $k=>$v) {
$this->fields[strtolower($k)] = $v;
}
} else if (ADODB_ASSOC_CASE == 1) {
foreach($this->fields as $k=>$v) {
$this->fields[strtoupper($k)] = $v;
}
}
} else {
$this->fields = @mssql_fetch_row($this->_queryID);
}
return $this->fields;
}
/* close() only needs to be called if you are worried about using too much memory while your script
is running. All associated result memory for the specified result identifier will automatically be freed. */
 
function _close()
{
$rez = mssql_free_result($this->_queryID);
$this->_queryID = false;
return $rez;
}
// mssql uses a default date like Dec 30 2000 12:00AM
function UnixDate($v)
{
return ADORecordSet_array_mssql::UnixDate($v);
}
function UnixTimeStamp($v)
{
return ADORecordSet_array_mssql::UnixTimeStamp($v);
}
}
 
 
class ADORecordSet_array_mssql extends ADORecordSet_array {
function ADORecordSet_array_mssql($id=-1,$mode=false)
{
$this->ADORecordSet_array($id,$mode);
}
// mssql uses a default date like Dec 30 2000 12:00AM
function UnixDate($v)
{
if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v);
global $ADODB_mssql_mths,$ADODB_mssql_date_order;
//Dec 30 2000 12:00AM
if ($ADODB_mssql_date_order == 'dmy') {
if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
return parent::UnixDate($v);
}
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
$theday = $rr[1];
$themth = substr(strtoupper($rr[2]),0,3);
} else {
if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
return parent::UnixDate($v);
}
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
$theday = $rr[2];
$themth = substr(strtoupper($rr[1]),0,3);
}
$themth = $ADODB_mssql_mths[$themth];
if ($themth <= 0) return false;
// h-m-s-MM-DD-YY
return mktime(0,0,0,$themth,$theday,$rr[3]);
}
function UnixTimeStamp($v)
{
if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v);
global $ADODB_mssql_mths,$ADODB_mssql_date_order;
//Dec 30 2000 12:00AM
if ($ADODB_mssql_date_order == 'dmy') {
if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
,$v, $rr)) return parent::UnixTimeStamp($v);
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
$theday = $rr[1];
$themth = substr(strtoupper($rr[2]),0,3);
} else {
if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
,$v, $rr)) return parent::UnixTimeStamp($v);
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
$theday = $rr[2];
$themth = substr(strtoupper($rr[1]),0,3);
}
$themth = $ADODB_mssql_mths[$themth];
if ($themth <= 0) return false;
switch (strtoupper($rr[6])) {
case 'P':
if ($rr[4]<12) $rr[4] += 12;
break;
case 'A':
if ($rr[4]==12) $rr[4] = 0;
break;
default:
break;
}
// h-m-s-MM-DD-YY
return mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]);
}
}
 
/*
Code Example 1:
 
select object_name(constid) as constraint_name,
object_name(fkeyid) as table_name,
col_name(fkeyid, fkey) as column_name,
object_name(rkeyid) as referenced_table_name,
col_name(rkeyid, rkey) as referenced_column_name
from sysforeignkeys
where object_name(fkeyid) = x
order by constraint_name, table_name, referenced_table_name, keyno
 
Code Example 2:
select constraint_name,
column_name,
ordinal_position
from information_schema.key_column_usage
where constraint_catalog = db_name()
and table_name = x
order by constraint_name, ordinal_position
 
http://www.databasejournal.com/scripts/article.php/1440551
*/
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-mssqlpo.inc.php
0,0 → 1,62
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://php.weblogs.com
*
* Portable MSSQL Driver that supports || instead of +
*
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
 
/*
The big difference between mssqlpo and it's parent mssql is that mssqlpo supports
the more standard || string concatenation operator.
*/
include_once(ADODB_DIR.'/drivers/adodb-mssql.inc.php');
 
class ADODB_mssqlpo extends ADODB_mssql {
var $databaseType = "mssqlpo";
var $concat_operator = '||';
function ADODB_mssqlpo()
{
ADODB_mssql::ADODB_mssql();
}
 
function PrepareSP($sql)
{
if (!$this->_has_mssql_init) {
ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0");
return $sql;
}
if (is_string($sql)) $sql = str_replace('||','+',$sql);
$stmt = mssql_init($sql,$this->_connectionID);
if (!$stmt) return $sql;
return array($sql,$stmt);
}
function _query($sql,$inputarr)
{
if (is_string($sql)) $sql = str_replace('||','+',$sql);
return ADODB_mssql::_query($sql,$inputarr);
}
}
 
class ADORecordset_mssqlpo extends ADORecordset_mssql {
var $databaseType = "mssqlpo";
function ADORecordset_mssqlpo($id,$mode=false)
{
$this->ADORecordset_mssql($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-mysql.inc.php
0,0 → 1,776
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
MySQL code that does not support transactions. Use mysqlt if you need transactions.
Requires mysql client. Works on Windows and Unix.
28 Feb 2001: MetaColumns bug fix - suggested by Freek Dijkstra (phpeverywhere@macfreek.com)
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (! defined("_ADODB_MYSQL_LAYER")) {
define("_ADODB_MYSQL_LAYER", 1 );
 
class ADODB_mysql extends ADOConnection {
var $databaseType = 'mysql';
var $dataProvider = 'mysql';
var $hasInsertID = true;
var $hasAffectedRows = true;
var $metaTablesSQL = "SHOW TABLES";
var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $hasLimit = true;
var $hasMoveFirst = true;
var $hasGenID = true;
var $isoDates = true; // accepts dates in ISO format
var $sysDate = 'CURDATE()';
var $sysTimeStamp = 'NOW()';
var $hasTransactions = false;
var $forceNewConnect = false;
var $poorAffectedRows = true;
var $clientFlags = 0;
var $substr = "substring";
var $nameQuote = '`'; /// string to use to quote identifiers and names
var $compat323 = false; // true if compat with mysql 3.23
function ADODB_mysql()
{
if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
}
function ServerInfo()
{
$arr['description'] = ADOConnection::GetOne("select version()");
$arr['version'] = ADOConnection::_findvers($arr['description']);
return $arr;
}
function IfNull( $field, $ifNull )
{
return " IFNULL($field, $ifNull) "; // if MySQL
}
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
$save = $this->metaTablesSQL;
if ($showSchema && is_string($showSchema)) {
$this->metaTablesSQL .= " from $showSchema";
}
if ($mask) {
$mask = $this->qstr($mask);
$this->metaTablesSQL .= " like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
$this->metaTablesSQL = $save;
return $ret;
}
function &MetaIndexes ($table, $primary = FALSE, $owner=false)
{
// save old fetch mode
global $ADODB_FETCH_MODE;
$false = false;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
// get index details
$rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table));
// restore fetchmode
if (isset($savem)) {
$this->SetFetchMode($savem);
}
$ADODB_FETCH_MODE = $save;
if (!is_object($rs)) {
return $false;
}
$indexes = array ();
// parse index data into array
while ($row = $rs->FetchRow()) {
if ($primary == FALSE AND $row[2] == 'PRIMARY') {
continue;
}
if (!isset($indexes[$row[2]])) {
$indexes[$row[2]] = array(
'unique' => ($row[1] == 0),
'columns' => array()
);
}
$indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
}
// sort columns by order in the index
foreach ( array_keys ($indexes) as $index )
{
ksort ($indexes[$index]['columns']);
}
return $indexes;
}
 
// if magic quotes disabled, use mysql_real_escape_string()
function qstr($s,$magic_quotes=false)
{
if (!$magic_quotes) {
if (ADODB_PHPVER >= 0x4300) {
if (is_resource($this->_connectionID))
return "'".mysql_real_escape_string($s,$this->_connectionID)."'";
}
if ($this->replaceQuote[0] == '\\'){
$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
}
return "'".str_replace("'",$this->replaceQuote,$s)."'";
}
// undo magic quotes for "
$s = str_replace('\\"','"',$s);
return "'$s'";
}
function _insertid()
{
return ADOConnection::GetOne('SELECT LAST_INSERT_ID()');
//return mysql_insert_id($this->_connectionID);
}
function GetOne($sql,$inputarr=false)
{
if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) {
$rs =& $this->SelectLimit($sql,1,-1,$inputarr);
if ($rs) {
$rs->Close();
if ($rs->EOF) return false;
return reset($rs->fields);
}
} else {
return ADOConnection::GetOne($sql,$inputarr);
}
return false;
}
function BeginTrans()
{
if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
}
function _affectedrows()
{
return mysql_affected_rows($this->_connectionID);
}
// See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
// Reference on Last_Insert_ID on the recommended way to simulate sequences
var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
var $_genSeqSQL = "create table %s (id int not null)";
var $_genSeq2SQL = "insert into %s values (%s)";
var $_dropSeqSQL = "drop table %s";
function CreateSequence($seqname='adodbseq',$startID=1)
{
if (empty($this->_genSeqSQL)) return false;
$u = strtoupper($seqname);
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
if (!$ok) return false;
return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
}
 
function GenID($seqname='adodbseq',$startID=1)
{
// post-nuke sets hasGenID to false
if (!$this->hasGenID) return false;
$savelog = $this->_logsql;
$this->_logsql = false;
$getnext = sprintf($this->_genIDSQL,$seqname);
$holdtransOK = $this->_transOK; // save the current status
$rs = @$this->Execute($getnext);
if (!$rs) {
if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
$u = strtoupper($seqname);
$this->Execute(sprintf($this->_genSeqSQL,$seqname));
$this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
$rs = $this->Execute($getnext);
}
$this->genID = mysql_insert_id($this->_connectionID);
if ($rs) $rs->Close();
$this->_logsql = $savelog;
return $this->genID;
}
function &MetaDatabases()
{
$qid = mysql_list_dbs($this->_connectionID);
$arr = array();
$i = 0;
$max = mysql_num_rows($qid);
while ($i < $max) {
$db = mysql_tablename($qid,$i);
if ($db != 'mysql') $arr[] = $db;
$i += 1;
}
return $arr;
}
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysTimeStamp;
$s = 'DATE_FORMAT('.$col.",'";
$concat = false;
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
$ch = $fmt[$i];
switch($ch) {
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
/** FALL THROUGH */
case '-':
case '/':
$s .= $ch;
break;
case 'Y':
case 'y':
$s .= '%Y';
break;
case 'M':
$s .= '%b';
break;
case 'm':
$s .= '%m';
break;
case 'D':
case 'd':
$s .= '%d';
break;
case 'Q':
case 'q':
$s .= "'),Quarter($col)";
if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
else $s .= ",('";
$concat = true;
break;
case 'H':
$s .= '%H';
break;
case 'h':
$s .= '%I';
break;
case 'i':
$s .= '%i';
break;
case 's':
$s .= '%s';
break;
case 'a':
case 'A':
$s .= '%p';
break;
case 'w':
$s .= '%w';
break;
case 'W':
$s .= '%U';
break;
case 'l':
$s .= '%W';
break;
}
}
$s.="')";
if ($concat) $s = "CONCAT($s)";
return $s;
}
 
// returns concatenated string
// much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
function Concat()
{
$s = "";
$arr = func_get_args();
// suggestion by andrew005@mnogo.ru
$s = implode(',',$arr);
if (strlen($s) > 0) return "CONCAT($s)";
else return '';
}
function OffsetDate($dayFraction,$date=false)
{
if (!$date) $date = $this->sysDate;
$fraction = $dayFraction * 24 * 3600;
return "from_unixtime(unix_timestamp($date)+$fraction)";
}
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!empty($this->port)) $argHostname .= ":".$this->port;
if (ADODB_PHPVER >= 0x4300)
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
$this->forceNewConnect,$this->clientFlags);
else if (ADODB_PHPVER >= 0x4200)
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
$this->forceNewConnect);
else
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!empty($this->port)) $argHostname .= ":".$this->port;
if (ADODB_PHPVER >= 0x4300)
$this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);
else
$this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
if ($this->autoRollback) $this->RollbackTrans();
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
$this->forceNewConnect = true;
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
}
function &MetaColumns($table)
{
$this->_findschema($table,$schema);
if ($schema) {
$dbName = $this->database;
$this->SelectDB($schema);
}
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
if ($schema) {
$this->SelectDB($dbName);
}
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!is_object($rs)) {
$false = false;
return $false;
}
$retarr = array();
while (!$rs->EOF){
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$type = $rs->fields[1];
// split type into type(length):
$fld->scale = null;
if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
$fld->type = $query_array[1];
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
$fld->type = $query_array[1];
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
$fld->type = $query_array[1];
$arr = explode(",",$query_array[2]);
$fld->enums = $arr;
$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
$fld->max_length = ($zlen > 0) ? $zlen : 1;
} else {
$fld->type = $type;
$fld->max_length = -1;
}
$fld->not_null = ($rs->fields[2] != 'YES');
$fld->primary_key = ($rs->fields[3] == 'PRI');
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
$fld->binary = (strpos($type,'blob') !== false);
$fld->unsigned = (strpos($type,'unsigned') !== false);
if (!$fld->binary) {
$d = $rs->fields[4];
if ($d != '' && $d != 'NULL') {
$fld->has_default = true;
$fld->default_value = $d;
} else {
$fld->has_default = false;
}
}
if ($save == ADODB_FETCH_NUM) {
$retarr[] = $fld;
} else {
$retarr[strtoupper($fld->name)] = $fld;
}
$rs->MoveNext();
}
$rs->Close();
return $retarr;
}
// returns true or false
function SelectDB($dbName)
{
$this->database = $dbName;
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
if ($this->_connectionID) {
return @mysql_select_db($dbName,$this->_connectionID);
}
else return false;
}
// parameters use PostgreSQL convention, not MySQL
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
{
$offsetStr =($offset>=0) ? ((integer)$offset)."," : '';
// jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
if ($nrows < 0) $nrows = '18446744073709551615';
if ($secs)
$rs =& $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
else
$rs =& $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
return $rs;
}
// returns queryID or false
function _query($sql,$inputarr)
{
//global $ADODB_COUNTRECS;
//if($ADODB_COUNTRECS)
return mysql_query($sql,$this->_connectionID);
//else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6
}
 
/* Returns: the last error message from previous database operation */
function ErrorMsg()
{
if ($this->_logsql) return $this->_errorMsg;
if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error();
else $this->_errorMsg = @mysql_error($this->_connectionID);
return $this->_errorMsg;
}
/* Returns: the last error number from previous database operation */
function ErrorNo()
{
if ($this->_logsql) return $this->_errorCode;
if (empty($this->_connectionID)) return @mysql_errno();
else return @mysql_errno($this->_connectionID);
}
// returns true or false
function _close()
{
@mysql_close($this->_connectionID);
$this->_connectionID = false;
}
 
/*
* Maximum size of C field
*/
function CharMax()
{
return 255;
}
/*
* Maximum size of X field
*/
function TextMax()
{
return 4294967295;
}
// "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx>
function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
{
if ( !empty($owner) ) {
$table = "$owner.$table";
}
$a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
if ($associative) $create_sql = $a_create_table["Create Table"];
else $create_sql = $a_create_table[1];
 
$matches = array();
 
if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
$foreign_keys = array();
$num_keys = count($matches[0]);
for ( $i = 0; $i < $num_keys; $i ++ ) {
$my_field = explode('`, `', $matches[1][$i]);
$ref_table = $matches[2][$i];
$ref_field = explode('`, `', $matches[3][$i]);
 
if ( $upper ) {
$ref_table = strtoupper($ref_table);
}
 
$foreign_keys[$ref_table] = array();
$num_fields = count($my_field);
for ( $j = 0; $j < $num_fields; $j ++ ) {
if ( $associative ) {
$foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
} else {
$foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
}
}
}
return $foreign_keys;
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
 
class ADORecordSet_mysql extends ADORecordSet{
var $databaseType = "mysql";
var $canSeek = true;
function ADORecordSet_mysql($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:
default:
$this->fetchMode = MYSQL_BOTH; break;
}
$this->adodbFetchMode = $mode;
$this->ADORecordSet($queryID);
}
function _initrs()
{
//GLOBAL $ADODB_COUNTRECS;
// $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1;
$this->_numOfRows = @mysql_num_rows($this->_queryID);
$this->_numOfFields = @mysql_num_fields($this->_queryID);
}
function &FetchField($fieldOffset = -1)
{
if ($fieldOffset != -1) {
$o = @mysql_fetch_field($this->_queryID, $fieldOffset);
$f = @mysql_field_flags($this->_queryID,$fieldOffset);
$o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich@att.com)
//$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
$o->binary = (strpos($f,'binary')!== false);
}
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
$o = @mysql_fetch_field($this->_queryID);
$o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich@att.com)
//$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
}
return $o;
}
 
function &GetRowAssoc($upper=true)
{
if ($this->fetchMode == MYSQL_ASSOC && !$upper) return $this->fields;
$row =& ADORecordSet::GetRowAssoc($upper);
return $row;
}
/* Use associative array to get fields array */
function Fields($colname)
{
// added @ by "Michael William Miller" <mille562@pilot.msu.edu>
if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
function _seek($row)
{
if ($this->_numOfRows == 0) return false;
return @mysql_data_seek($this->_queryID,$row);
}
function MoveNext()
{
//return adodb_movenext($this);
//if (defined('ADODB_EXTENSION')) return adodb_movenext($this);
if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
$this->_currentRow += 1;
return true;
}
if (!$this->EOF) {
$this->_currentRow += 1;
$this->EOF = true;
}
return false;
}
function _fetch()
{
$this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode);
return is_array($this->fields);
}
function _close() {
@mysql_free_result($this->_queryID);
$this->_queryID = false;
}
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
$len = -1; // mysql max_length is not accurate
switch (strtoupper($t)) {
case 'STRING':
case 'CHAR':
case 'VARCHAR':
case 'TINYBLOB':
case 'TINYTEXT':
case 'ENUM':
case 'SET':
if ($len <= $this->blobSize) return 'C';
case 'TEXT':
case 'LONGTEXT':
case 'MEDIUMTEXT':
return 'X';
// php_mysql extension always returns 'blob' even if 'text'
// so we have to check whether binary...
case 'IMAGE':
case 'LONGBLOB':
case 'BLOB':
case 'MEDIUMBLOB':
return !empty($fieldobj->binary) ? 'B' : 'X';
case 'YEAR':
case 'DATE': return 'D';
case 'TIME':
case 'DATETIME':
case 'TIMESTAMP': return 'T';
case 'INT':
case 'INTEGER':
case 'BIGINT':
case 'TINYINT':
case 'MEDIUMINT':
case 'SMALLINT':
if (!empty($fieldobj->primary_key)) return 'R';
else return 'I';
default: return 'N';
}
}
 
}
 
class ADORecordSet_ext_mysql extends ADORecordSet_mysql {
function ADORecordSet_ext_mysql($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:
default:
$this->fetchMode = MYSQL_BOTH; break;
}
$this->adodbFetchMode = $mode;
$this->ADORecordSet($queryID);
}
function MoveNext()
{
return @adodb_movenext($this);
}
}
 
 
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-mysqli.inc.php
0,0 → 1,986
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
MySQL code that does not support transactions. Use mysqlt if you need transactions.
Requires mysql client. Works on Windows and Unix.
21 October 2003: MySQLi extension implementation by Arjen de Rijke (a.de.rijke@xs4all.nl)
Based on adodb 3.40
*/
 
// security - hide paths
//if (!defined('ADODB_DIR')) die();
 
if (! defined("_ADODB_MYSQLI_LAYER")) {
define("_ADODB_MYSQLI_LAYER", 1 );
// PHP5 compat...
if (! defined("MYSQLI_BINARY_FLAG")) define("MYSQLI_BINARY_FLAG", 128);
if (!defined('MYSQLI_READ_DEFAULT_GROUP')) define('MYSQLI_READ_DEFAULT_GROUP',1);
 
// disable adodb extension - currently incompatible.
global $ADODB_EXTENSION; $ADODB_EXTENSION = false;
 
class ADODB_mysqli extends ADOConnection {
var $databaseType = 'mysqli';
var $dataProvider = 'native';
var $hasInsertID = true;
var $hasAffectedRows = true;
var $metaTablesSQL = "SHOW TABLES";
var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $hasLimit = true;
var $hasMoveFirst = true;
var $hasGenID = true;
var $isoDates = true; // accepts dates in ISO format
var $sysDate = 'CURDATE()';
var $sysTimeStamp = 'NOW()';
var $hasTransactions = true;
var $forceNewConnect = false;
var $poorAffectedRows = true;
var $clientFlags = 0;
var $substr = "substring";
var $port = false;
var $socket = false;
var $_bindInputArray = false;
var $nameQuote = '`'; /// string to use to quote identifiers and names
var $optionFlags = array(array(MYSQLI_READ_DEFAULT_GROUP,0));
function ADODB_mysqli()
{
// if(!extension_loaded("mysqli"))
;//trigger_error("You must have the mysqli extension installed.", E_USER_ERROR);
}
 
// returns true or false
// To add: parameter int $port,
// parameter string $socket
function _connect($argHostname = NULL,
$argUsername = NULL,
$argPassword = NULL,
$argDatabasename = NULL, $persist=false)
{
if(!extension_loaded("mysqli")) {
return null;
}
$this->_connectionID = @mysqli_init();
if (is_null($this->_connectionID)) {
// mysqli_init only fails if insufficient memory
if ($this->debug)
ADOConnection::outp("mysqli_init() failed : " . $this->ErrorMsg());
return false;
}
/*
I suggest a simple fix which would enable adodb and mysqli driver to
read connection options from the standard mysql configuration file
/etc/my.cnf - "Bastien Duclaux" <bduclaux#yahoo.com>
*/
foreach($this->optionFlags as $arr) {
mysqli_options($this->_connectionID,$arr[0],$arr[1]);
}
 
#if (!empty($this->port)) $argHostname .= ":".$this->port;
$ok = mysqli_real_connect($this->_connectionID,
$argHostname,
$argUsername,
$argPassword,
$argDatabasename,
$this->port,
$this->socket,
$this->clientFlags);
if ($ok) {
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
} else {
if ($this->debug)
ADOConnection::outp("Could't connect : " . $this->ErrorMsg());
return false;
}
}
// returns true or false
// How to force a persistent connection
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true);
 
}
// When is this used? Close old connection first?
// In _connect(), check $this->forceNewConnect?
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
$this->forceNewConnect = true;
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
}
function IfNull( $field, $ifNull )
{
return " IFNULL($field, $ifNull) "; // if MySQL
}
function ServerInfo()
{
$arr['description'] = $this->GetOne("select version()");
$arr['version'] = ADOConnection::_findvers($arr['description']);
return $arr;
}
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
$this->Execute('SET AUTOCOMMIT=0');
$this->Execute('BEGIN');
return true;
}
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
if ($this->transCnt) $this->transCnt -= 1;
$this->Execute('COMMIT');
$this->Execute('SET AUTOCOMMIT=1');
return true;
}
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->Execute('ROLLBACK');
$this->Execute('SET AUTOCOMMIT=1');
return true;
}
function RowLock($tables,$where='',$flds='1 as adodb_ignore')
{
if ($this->transCnt==0) $this->BeginTrans();
if ($where) $where = ' where '.$where;
$rs =& $this->Execute("select $flds from $tables $where for update");
return !empty($rs);
}
// if magic quotes disabled, use mysql_real_escape_string()
// From readme.htm:
// Quotes a string to be sent to the database. The $magic_quotes_enabled
// parameter may look funny, but the idea is if you are quoting a
// string extracted from a POST/GET variable, then
// pass get_magic_quotes_gpc() as the second parameter. This will
// ensure that the variable is not quoted twice, once by qstr and once
// by the magic_quotes_gpc.
//
//Eg. $s = $db->qstr(_GET['name'],get_magic_quotes_gpc());
function qstr($s, $magic_quotes = false)
{
if (!$magic_quotes) {
if (PHP_VERSION >= 5)
return "'" . mysqli_real_escape_string($this->_connectionID, $s) . "'";
if ($this->replaceQuote[0] == '\\')
$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
return "'".str_replace("'",$this->replaceQuote,$s)."'";
}
// undo magic quotes for "
$s = str_replace('\\"','"',$s);
return "'$s'";
}
function _insertid()
{
$result = @mysqli_insert_id($this->_connectionID);
if ($result == -1){
if ($this->debug) ADOConnection::outp("mysqli_insert_id() failed : " . $this->ErrorMsg());
}
return $result;
}
// Only works for INSERT, UPDATE and DELETE query's
function _affectedrows()
{
$result = @mysqli_affected_rows($this->_connectionID);
if ($result == -1) {
if ($this->debug) ADOConnection::outp("mysqli_affected_rows() failed : " . $this->ErrorMsg());
}
return $result;
}
// See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
// Reference on Last_Insert_ID on the recommended way to simulate sequences
var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
var $_genSeqSQL = "create table %s (id int not null)";
var $_genSeq2SQL = "insert into %s values (%s)";
var $_dropSeqSQL = "drop table %s";
function CreateSequence($seqname='adodbseq',$startID=1)
{
if (empty($this->_genSeqSQL)) return false;
$u = strtoupper($seqname);
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
if (!$ok) return false;
return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
}
function GenID($seqname='adodbseq',$startID=1)
{
// post-nuke sets hasGenID to false
if (!$this->hasGenID) return false;
$getnext = sprintf($this->_genIDSQL,$seqname);
$holdtransOK = $this->_transOK; // save the current status
$rs = @$this->Execute($getnext);
if (!$rs) {
if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
$u = strtoupper($seqname);
$this->Execute(sprintf($this->_genSeqSQL,$seqname));
$this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
$rs = $this->Execute($getnext);
}
$this->genID = mysqli_insert_id($this->_connectionID);
if ($rs) $rs->Close();
return $this->genID;
}
function &MetaDatabases()
{
$query = "SHOW DATABASES";
$ret =& $this->Execute($query);
if ($ret && is_object($ret)){
$arr = array();
while (!$ret->EOF){
$db = $ret->Fields('Database');
if ($db != 'mysql') $arr[] = $db;
$ret->MoveNext();
}
return $arr;
}
return $ret;
}
 
function &MetaIndexes ($table, $primary = FALSE)
{
// save old fetch mode
global $ADODB_FETCH_MODE;
$false = false;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
// get index details
$rs = $this->Execute(sprintf('SHOW INDEXES FROM %s',$table));
// restore fetchmode
if (isset($savem)) {
$this->SetFetchMode($savem);
}
$ADODB_FETCH_MODE = $save;
if (!is_object($rs)) {
return $false;
}
$indexes = array ();
// parse index data into array
while ($row = $rs->FetchRow()) {
if ($primary == FALSE AND $row[2] == 'PRIMARY') {
continue;
}
if (!isset($indexes[$row[2]])) {
$indexes[$row[2]] = array(
'unique' => ($row[1] == 0),
'columns' => array()
);
}
$indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
}
// sort columns by order in the index
foreach ( array_keys ($indexes) as $index )
{
ksort ($indexes[$index]['columns']);
}
return $indexes;
}
 
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysTimeStamp;
$s = 'DATE_FORMAT('.$col.",'";
$concat = false;
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
$ch = $fmt[$i];
switch($ch) {
case 'Y':
case 'y':
$s .= '%Y';
break;
case 'Q':
case 'q':
$s .= "'),Quarter($col)";
if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
else $s .= ",('";
$concat = true;
break;
case 'M':
$s .= '%b';
break;
case 'm':
$s .= '%m';
break;
case 'D':
case 'd':
$s .= '%d';
break;
case 'H':
$s .= '%H';
break;
case 'h':
$s .= '%I';
break;
case 'i':
$s .= '%i';
break;
case 's':
$s .= '%s';
break;
case 'a':
case 'A':
$s .= '%p';
break;
case 'w':
$s .= '%w';
break;
case 'l':
$s .= '%W';
break;
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
$s .= $ch;
break;
}
}
$s.="')";
if ($concat) $s = "CONCAT($s)";
return $s;
}
// returns concatenated string
// much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
function Concat()
{
$s = "";
$arr = func_get_args();
// suggestion by andrew005@mnogo.ru
$s = implode(',',$arr);
if (strlen($s) > 0) return "CONCAT($s)";
else return '';
}
// dayFraction is a day in floating point
function OffsetDate($dayFraction,$date=false)
{
if (!$date)
$date = $this->sysDate;
return "from_unixtime(unix_timestamp($date)+($dayFraction)*24*3600)";
}
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
$save = $this->metaTablesSQL;
if ($showSchema && is_string($showSchema)) {
$this->metaTablesSQL .= " from $showSchema";
}
if ($mask) {
$mask = $this->qstr($mask);
$this->metaTablesSQL .= " like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
$this->metaTablesSQL = $save;
return $ret;
}
// "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx>
function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
{
if ( !empty($owner) ) {
$table = "$owner.$table";
}
$a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
if ($associative) $create_sql = $a_create_table["Create Table"];
else $create_sql = $a_create_table[1];
$matches = array();
if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
$foreign_keys = array();
$num_keys = count($matches[0]);
for ( $i = 0; $i < $num_keys; $i ++ ) {
$my_field = explode('`, `', $matches[1][$i]);
$ref_table = $matches[2][$i];
$ref_field = explode('`, `', $matches[3][$i]);
if ( $upper ) {
$ref_table = strtoupper($ref_table);
}
$foreign_keys[$ref_table] = array();
$num_fields = count($my_field);
for ( $j = 0; $j < $num_fields; $j ++ ) {
if ( $associative ) {
$foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
} else {
$foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
}
}
}
return $foreign_keys;
}
function &MetaColumns($table)
{
$false = false;
if (!$this->metaColumnsSQL)
return $false;
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false)
$savem = $this->SetFetchMode(false);
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!is_object($rs))
return $false;
$retarr = array();
while (!$rs->EOF) {
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$type = $rs->fields[1];
// split type into type(length):
$fld->scale = null;
if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
$fld->type = $query_array[1];
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
$fld->type = $query_array[1];
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
$fld->type = $query_array[1];
$fld->max_length = max(array_map("strlen",explode(",",$query_array[2]))) - 2; // PHP >= 4.0.6
$fld->max_length = ($fld->max_length == 0 ? 1 : $fld->max_length);
} else {
$fld->type = $type;
$fld->max_length = -1;
}
$fld->not_null = ($rs->fields[2] != 'YES');
$fld->primary_key = ($rs->fields[3] == 'PRI');
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
$fld->binary = (strpos($type,'blob') !== false);
$fld->unsigned = (strpos($type,'unsigned') !== false);
 
if (!$fld->binary) {
$d = $rs->fields[4];
if ($d != '' && $d != 'NULL') {
$fld->has_default = true;
$fld->default_value = $d;
} else {
$fld->has_default = false;
}
}
if ($save == ADODB_FETCH_NUM) {
$retarr[] = $fld;
} else {
$retarr[strtoupper($fld->name)] = $fld;
}
$rs->MoveNext();
}
$rs->Close();
return $retarr;
}
// returns true or false
function SelectDB($dbName)
{
// $this->_connectionID = $this->mysqli_resolve_link($this->_connectionID);
$this->database = $dbName;
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
if ($this->_connectionID) {
$result = @mysqli_select_db($this->_connectionID, $dbName);
if (!$result) {
ADOConnection::outp("Select of database " . $dbName . " failed. " . $this->ErrorMsg());
}
return $result;
}
return false;
}
// parameters use PostgreSQL convention, not MySQL
function &SelectLimit($sql,
$nrows = -1,
$offset = -1,
$inputarr = false,
$arg3 = false,
$secs = 0)
{
$offsetStr = ($offset >= 0) ? "$offset," : '';
if ($nrows < 0) $nrows = '18446744073709551615';
if ($secs)
$rs =& $this->CacheExecute($secs, $sql . " LIMIT $offsetStr$nrows" , $inputarr , $arg3);
else
$rs =& $this->Execute($sql . " LIMIT $offsetStr$nrows" , $inputarr , $arg3);
return $rs;
}
function Prepare($sql)
{
return $sql;
$stmt = $this->_connectionID->prepare($sql);
if (!$stmt) {
echo $this->ErrorMsg();
return $sql;
}
return array($sql,$stmt);
}
// returns queryID or false
function _query($sql, $inputarr)
{
global $ADODB_COUNTRECS;
if (is_array($sql)) {
$stmt = $sql[1];
$a = '';
foreach($inputarr as $k => $v) {
if (is_string($v)) $a .= 's';
else if (is_integer($v)) $a .= 'i';
else $a .= 'd';
}
$fnarr = array_merge( array($stmt,$a) , $inputarr);
$ret = call_user_func_array('mysqli_stmt_bind_param',$fnarr);
 
$ret = mysqli_stmt_execute($stmt);
return $ret;
}
if (!$mysql_res = mysqli_query($this->_connectionID, $sql, ($ADODB_COUNTRECS) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT)) {
if ($this->debug) ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg());
return false;
}
return $mysql_res;
}
 
/* Returns: the last error message from previous database operation */
function ErrorMsg()
{
if (empty($this->_connectionID))
$this->_errorMsg = @mysqli_connect_error();
else
$this->_errorMsg = @mysqli_error($this->_connectionID);
return $this->_errorMsg;
}
/* Returns: the last error number from previous database operation */
function ErrorNo()
{
if (empty($this->_connectionID))
return @mysqli_connect_errno();
else
return @mysqli_errno($this->_connectionID);
}
// returns true or false
function _close()
{
@mysqli_close($this->_connectionID);
$this->_connectionID = false;
}
 
/*
* Maximum size of C field
*/
function CharMax()
{
return 255;
}
/*
* Maximum size of X field
*/
function TextMax()
{
return 4294967295;
}
 
 
 
// this is a set of functions for managing client encoding - very important if the encodings
// of your database and your output target (i.e. HTML) don't match
// for instance, you may have UTF8 database and server it on-site as latin1 etc.
// GetCharSet - get the name of the character set the client is using now
// Under Windows, the functions should work with MySQL 4.1.11 and above, the set of charsets supported
// depends on compile flags of mysql distribution
 
function GetCharSet()
{
//we will use ADO's builtin property charSet
if (!is_callable($this->_connectionID,'character_set_name'))
return false;
$this->charSet = @$this->_connectionID->character_set_name();
if (!$this->charSet) {
return false;
} else {
return $this->charSet;
}
}
 
// SetCharSet - switch the client encoding
function SetCharSet($charset_name)
{
if (!is_callable($this->_connectionID,'set_charset'))
return false;
 
if ($this->charSet !== $charset_name) {
$if = @$this->_connectionID->set_charset($charset_name);
if ($if == "0" & $this->GetCharSet() == $charset_name) {
return true;
} else return false;
} else return true;
}
 
 
 
 
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_mysqli extends ADORecordSet{
var $databaseType = "mysqli";
var $canSeek = true;
function ADORecordSet_mysqli($queryID, $mode = false)
{
if ($mode === false)
{
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM:
$this->fetchMode = MYSQLI_NUM;
break;
case ADODB_FETCH_ASSOC:
$this->fetchMode = MYSQLI_ASSOC;
break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:
default:
$this->fetchMode = MYSQLI_BOTH;
break;
}
$this->adodbFetchMode = $mode;
$this->ADORecordSet($queryID);
}
function _initrs()
{
global $ADODB_COUNTRECS;
$this->_numOfRows = $ADODB_COUNTRECS ? @mysqli_num_rows($this->_queryID) : -1;
$this->_numOfFields = @mysqli_num_fields($this->_queryID);
}
/*
1 = MYSQLI_NOT_NULL_FLAG
2 = MYSQLI_PRI_KEY_FLAG
4 = MYSQLI_UNIQUE_KEY_FLAG
8 = MYSQLI_MULTIPLE_KEY_FLAG
16 = MYSQLI_BLOB_FLAG
32 = MYSQLI_UNSIGNED_FLAG
64 = MYSQLI_ZEROFILL_FLAG
128 = MYSQLI_BINARY_FLAG
256 = MYSQLI_ENUM_FLAG
512 = MYSQLI_AUTO_INCREMENT_FLAG
1024 = MYSQLI_TIMESTAMP_FLAG
2048 = MYSQLI_SET_FLAG
32768 = MYSQLI_NUM_FLAG
16384 = MYSQLI_PART_KEY_FLAG
32768 = MYSQLI_GROUP_FLAG
65536 = MYSQLI_UNIQUE_FLAG
131072 = MYSQLI_BINCMP_FLAG
*/
 
function &FetchField($fieldOffset = -1)
{
$fieldnr = $fieldOffset;
if ($fieldOffset != -1) {
$fieldOffset = mysqli_field_seek($this->_queryID, $fieldnr);
}
$o = mysqli_fetch_field($this->_queryID);
/* Properties of an ADOFieldObject as set by MetaColumns */
$o->primary_key = $o->flags & MYSQLI_PRI_KEY_FLAG;
$o->not_null = $o->flags & MYSQLI_NOT_NULL_FLAG;
$o->auto_increment = $o->flags & MYSQLI_AUTO_INCREMENT_FLAG;
$o->binary = $o->flags & MYSQLI_BINARY_FLAG;
// $o->blob = $o->flags & MYSQLI_BLOB_FLAG; /* not returned by MetaColumns */
$o->unsigned = $o->flags & MYSQLI_UNSIGNED_FLAG;
 
return $o;
}
 
function &GetRowAssoc($upper = true)
{
if ($this->fetchMode == MYSQLI_ASSOC && !$upper)
return $this->fields;
$row =& ADORecordSet::GetRowAssoc($upper);
return $row;
}
/* Use associative array to get fields array */
function Fields($colname)
{
if ($this->fetchMode != MYSQLI_NUM)
return @$this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i = 0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
function _seek($row)
{
if ($this->_numOfRows == 0)
return false;
 
if ($row < 0)
return false;
 
mysqli_data_seek($this->_queryID, $row);
$this->EOF = false;
return true;
}
// 10% speedup to move MoveNext to child class
// This is the only implementation that works now (23-10-2003).
// Other functions return no or the wrong results.
function MoveNext()
{
if ($this->EOF) return false;
$this->_currentRow++;
$this->fields = @mysqli_fetch_array($this->_queryID,$this->fetchMode);
if (is_array($this->fields)) return true;
$this->EOF = true;
return false;
}
function _fetch()
{
$this->fields = mysqli_fetch_array($this->_queryID,$this->fetchMode);
return is_array($this->fields);
}
function _close()
{
mysqli_free_result($this->_queryID);
$this->_queryID = false;
}
/*
 
0 = MYSQLI_TYPE_DECIMAL
1 = MYSQLI_TYPE_CHAR
1 = MYSQLI_TYPE_TINY
2 = MYSQLI_TYPE_SHORT
3 = MYSQLI_TYPE_LONG
4 = MYSQLI_TYPE_FLOAT
5 = MYSQLI_TYPE_DOUBLE
6 = MYSQLI_TYPE_NULL
7 = MYSQLI_TYPE_TIMESTAMP
8 = MYSQLI_TYPE_LONGLONG
9 = MYSQLI_TYPE_INT24
10 = MYSQLI_TYPE_DATE
11 = MYSQLI_TYPE_TIME
12 = MYSQLI_TYPE_DATETIME
13 = MYSQLI_TYPE_YEAR
14 = MYSQLI_TYPE_NEWDATE
247 = MYSQLI_TYPE_ENUM
248 = MYSQLI_TYPE_SET
249 = MYSQLI_TYPE_TINY_BLOB
250 = MYSQLI_TYPE_MEDIUM_BLOB
251 = MYSQLI_TYPE_LONG_BLOB
252 = MYSQLI_TYPE_BLOB
253 = MYSQLI_TYPE_VAR_STRING
254 = MYSQLI_TYPE_STRING
255 = MYSQLI_TYPE_GEOMETRY
*/
 
function MetaType($t, $len = -1, $fieldobj = false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
$len = -1; // mysql max_length is not accurate
switch (strtoupper($t)) {
case 'STRING':
case 'CHAR':
case 'VARCHAR':
case 'TINYBLOB':
case 'TINYTEXT':
case 'ENUM':
case 'SET':
case MYSQLI_TYPE_TINY_BLOB :
case MYSQLI_TYPE_CHAR :
case MYSQLI_TYPE_STRING :
case MYSQLI_TYPE_ENUM :
case MYSQLI_TYPE_SET :
case 253 :
if ($len <= $this->blobSize) return 'C';
case 'TEXT':
case 'LONGTEXT':
case 'MEDIUMTEXT':
return 'X';
// php_mysql extension always returns 'blob' even if 'text'
// so we have to check whether binary...
case 'IMAGE':
case 'LONGBLOB':
case 'BLOB':
case 'MEDIUMBLOB':
case MYSQLI_TYPE_BLOB :
case MYSQLI_TYPE_LONG_BLOB :
case MYSQLI_TYPE_MEDIUM_BLOB :
return !empty($fieldobj->binary) ? 'B' : 'X';
case 'YEAR':
case 'DATE':
case MYSQLI_TYPE_DATE :
case MYSQLI_TYPE_YEAR :
return 'D';
case 'TIME':
case 'DATETIME':
case 'TIMESTAMP':
case MYSQLI_TYPE_DATETIME :
case MYSQLI_TYPE_NEWDATE :
case MYSQLI_TYPE_TIME :
case MYSQLI_TYPE_TIMESTAMP :
return 'T';
case 'INT':
case 'INTEGER':
case 'BIGINT':
case 'TINYINT':
case 'MEDIUMINT':
case 'SMALLINT':
case MYSQLI_TYPE_INT24 :
case MYSQLI_TYPE_LONG :
case MYSQLI_TYPE_LONGLONG :
case MYSQLI_TYPE_SHORT :
case MYSQLI_TYPE_TINY :
if (!empty($fieldobj->primary_key)) return 'R';
return 'I';
// Added floating-point types
// Maybe not necessery.
case 'FLOAT':
case 'DOUBLE':
// case 'DOUBLE PRECISION':
case 'DECIMAL':
case 'DEC':
case 'FIXED':
default:
//if (!is_numeric($t)) echo "<p>--- Error in type matching $t -----</p>";
return 'N';
}
} // function
 
} // rs class
}
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-mysqlt.inc.php
0,0 → 1,138
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
MySQL code that supports transactions. For MySQL 3.23 or later.
Code from James Poon <jpoon88@yahoo.com>
Requires mysql client. Works on Windows and Unix.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php");
 
 
class ADODB_mysqlt extends ADODB_mysql {
var $databaseType = 'mysqlt';
var $ansiOuter = true; // for Version 3.23.17 or later
var $hasTransactions = true;
var $autoRollback = true; // apparently mysql does not autorollback properly
function ADODB_mysqlt()
{
global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_';
}
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
$this->Execute('SET AUTOCOMMIT=0');
$this->Execute('BEGIN');
return true;
}
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
if ($this->transCnt) $this->transCnt -= 1;
$this->Execute('COMMIT');
$this->Execute('SET AUTOCOMMIT=1');
return true;
}
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->Execute('ROLLBACK');
$this->Execute('SET AUTOCOMMIT=1');
return true;
}
function RowLock($tables,$where='',$flds='1 as adodb_ignore')
{
if ($this->transCnt==0) $this->BeginTrans();
if ($where) $where = ' where '.$where;
$rs =& $this->Execute("select $flds from $tables $where for update");
return !empty($rs);
}
}
 
class ADORecordSet_mysqlt extends ADORecordSet_mysql{
var $databaseType = "mysqlt";
function ADORecordSet_mysqlt($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:
default: $this->fetchMode = MYSQL_BOTH; break;
}
$this->adodbFetchMode = $mode;
$this->ADORecordSet($queryID);
}
function MoveNext()
{
if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
$this->_currentRow += 1;
return true;
}
if (!$this->EOF) {
$this->_currentRow += 1;
$this->EOF = true;
}
return false;
}
}
 
class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt {
 
function ADORecordSet_ext_mysqlt($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:
default:
$this->fetchMode = MYSQL_BOTH; break;
}
$this->adodbFetchMode = $mode;
$this->ADORecordSet($queryID);
}
function MoveNext()
{
return adodb_movenext($this);
}
}
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-netezza.inc.php
0,0 → 1,170
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
First cut at the Netezza Driver by Josh Eldridge joshuae74#hotmail.com
Based on the previous postgres drivers.
http://www.netezza.com/
Major Additions/Changes:
MetaDatabasesSQL, MetaTablesSQL, MetaColumnsSQL
Note: You have to have admin privileges to access the system tables
Removed non-working keys code (Netezza has no concept of keys)
Fixed the way data types and lengths are returned in MetaColumns()
as well as added the default lengths for certain types
Updated public variables for Netezza
Still need to remove blob functions, as Netezza doesn't suppport blob
*/
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR.'/drivers/adodb-postgres64.inc.php');
 
class ADODB_netezza extends ADODB_postgres64 {
var $databaseType = 'netezza';
var $dataProvider = 'netezza';
var $hasInsertID = false;
var $_resultid = false;
var $concat_operator='||';
var $random = 'random';
var $metaDatabasesSQL = "select objname from _v_object_data where objtype='database' order by 1";
var $metaTablesSQL = "select objname from _v_object_data where objtype='table' order by 1";
var $isoDates = true; // accepts dates in ISO format
var $sysDate = "CURRENT_DATE";
var $sysTimeStamp = "CURRENT_TIMESTAMP";
var $blobEncodeType = 'C';
var $metaColumnsSQL = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum";
var $metaColumnsSQL1 = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum";
// netezza doesn't have keys. it does have distributions, so maybe this is
// something that can be pulled from the system tables
var $metaKeySQL = "";
var $hasAffectedRows = true;
var $hasLimit = true;
var $true = 't'; // string that represents TRUE for a database
var $false = 'f'; // string that represents FALSE for a database
var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database
var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
var $ansiOuter = true;
var $autoRollback = true; // apparently pgsql does not autorollback properly before 4.3.4
// http://bugs.php.net/bug.php?id=25404
 
function ADODB_netezza()
{
}
function &MetaColumns($table,$upper=true)
{
// Changed this function to support Netezza which has no concept of keys
// could posisbly work on other things from the system table later.
global $ADODB_FETCH_MODE;
$table = strtolower($table);
 
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs =& $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rs === false) return false;
 
$retarr = array();
while (!$rs->EOF) {
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
// since we're returning type and length as one string,
// split them out here.
if ($first = strstr($rs->fields[1], "(")) {
$fld->max_length = trim($first, "()");
} else {
$fld->max_length = -1;
}
if ($first = strpos($rs->fields[1], "(")) {
$fld->type = substr($rs->fields[1], 0, $first);
} else {
$fld->type = $rs->fields[1];
}
switch ($fld->type) {
case "byteint":
case "boolean":
$fld->max_length = 1;
break;
case "smallint":
$fld->max_length = 2;
break;
case "integer":
case "numeric":
case "date":
$fld->max_length = 4;
break;
case "bigint":
case "time":
case "timestamp":
$fld->max_length = 8;
break;
case "timetz":
case "time with time zone":
$fld->max_length = 12;
break;
}
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[($upper) ? strtoupper($fld->name) : $fld->name] = $fld;
$rs->MoveNext();
}
$rs->Close();
return $retarr;
}
 
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_netezza extends ADORecordSet_postgres64
{
var $databaseType = "netezza";
var $canSeek = true;
function ADORecordSet_netezza($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:
default: $this->fetchMode = PGSQL_BOTH; break;
}
$this->adodbFetchMode = $mode;
$this->ADORecordSet($queryID);
}
// _initrs modified to disable blob handling
function _initrs()
{
global $ADODB_COUNTRECS;
$this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($this->_queryID):-1;
$this->_numOfFields = @pg_numfields($this->_queryID);
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-oci8.inc.php
0,0 → 1,1484
<?php
/*
 
version V4.80 8 Mar 2006 (c) 2000-2006 John Lim. All rights reserved.
 
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
 
Latest version is available at http://adodb.sourceforge.net
Code contributed by George Fourlanos <fou@infomap.gr>
13 Nov 2000 jlim - removed all ora_* references.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
/*
NLS_Date_Format
Allows you to use a date format other than the Oracle Lite default. When a literal
character string appears where a date value is expected, the Oracle Lite database
tests the string to see if it matches the formats of Oracle, SQL-92, or the value
specified for this parameter in the POLITE.INI file. Setting this parameter also
defines the default format used in the TO_CHAR or TO_DATE functions when no
other format string is supplied.
 
For Oracle the default is dd-mon-yy or dd-mon-yyyy, and for SQL-92 the default is
yy-mm-dd or yyyy-mm-dd.
 
Using 'RR' in the format forces two-digit years less than or equal to 49 to be
interpreted as years in the 21st century (2000–2049), and years over 50 as years in
the 20th century (1950–1999). Setting the RR format as the default for all two-digit
year entries allows you to become year-2000 compliant. For example:
NLS_DATE_FORMAT='RR-MM-DD'
 
You can also modify the date format using the ALTER SESSION command.
*/
 
# define the LOB descriptor type for the given type
# returns false if no LOB descriptor
function oci_lob_desc($type) {
switch ($type) {
case OCI_B_BFILE: $result = OCI_D_FILE; break;
case OCI_B_CFILEE: $result = OCI_D_FILE; break;
case OCI_B_CLOB: $result = OCI_D_LOB; break;
case OCI_B_BLOB: $result = OCI_D_LOB; break;
case OCI_B_ROWID: $result = OCI_D_ROWID; break;
default: $result = false; break;
}
return $result;
}
 
class ADODB_oci8 extends ADOConnection {
var $databaseType = 'oci8';
var $dataProvider = 'oci8';
var $replaceQuote = "''"; // string to use to replace quotes
var $concat_operator='||';
var $sysDate = "TRUNC(SYSDATE)";
var $sysTimeStamp = 'SYSDATE';
var $metaDatabasesSQL = "SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN') ORDER BY 1";
var $_stmt;
var $_commit = OCI_COMMIT_ON_SUCCESS;
var $_initdate = true; // init date to YYYY-MM-DD
var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW')";
var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
var $_bindInputArray = true;
var $hasGenID = true;
var $_genIDSQL = "SELECT (%s.nextval) FROM DUAL";
var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s";
var $_dropSeqSQL = "DROP SEQUENCE %s";
var $hasAffectedRows = true;
var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)";
var $noNullStrings = false;
var $connectSID = false;
var $_bind = false;
var $_hasOCIFetchStatement = false;
var $_getarray = false; // currently not working
var $leftOuter = ''; // oracle wierdness, $col = $value (+) for LEFT OUTER, $col (+)= $value for RIGHT OUTER
var $session_sharing_force_blob = false; // alter session on updateblob if set to true
var $firstrows = true; // enable first rows optimization on SelectLimit()
var $selectOffsetAlg1 = 100; // when to use 1st algorithm of selectlimit.
var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS'
var $useDBDateFormatForTextInput=false;
var $datetime = false; // MetaType('DATE') returns 'D' (datetime==false) or 'T' (datetime == true)
var $_refLOBs = array();
// var $ansiOuter = true; // if oracle9
function ADODB_oci8()
{
$this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
}
/* Function &MetaColumns($table) added by smondino@users.sourceforge.net*/
function &MetaColumns($table)
{
global $ADODB_FETCH_MODE;
$false = false;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!$rs) {
return $false;
}
$retarr = array();
while (!$rs->EOF) { //print_r($rs->fields);
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$fld->type = $rs->fields[1];
$fld->max_length = $rs->fields[2];
$fld->scale = $rs->fields[3];
if ($rs->fields[1] == 'NUMBER' && $rs->fields[3] == 0) {
$fld->type ='INT';
$fld->max_length = $rs->fields[4];
}
$fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0);
$fld->binary = (strpos($fld->type,'BLOB') !== false);
$fld->default_value = $rs->fields[6];
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[strtoupper($fld->name)] = $fld;
$rs->MoveNext();
}
$rs->Close();
if (empty($retarr))
return $false;
else
return $retarr;
}
function Time()
{
$rs =& $this->Execute("select TO_CHAR($this->sysTimeStamp,'YYYY-MM-DD HH24:MI:SS') from dual");
if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
return false;
}
/*
 
Multiple modes of connection are supported:
a. Local Database
$conn->Connect(false,'scott','tiger');
b. From tnsnames.ora
$conn->Connect(false,'scott','tiger',$tnsname);
$conn->Connect($tnsname,'scott','tiger');
c. Server + service name
$conn->Connect($serveraddress,'scott,'tiger',$service_name);
d. Server + SID
$conn->connectSID = true;
$conn->Connect($serveraddress,'scott,'tiger',$SID);
 
 
Example TNSName:
---------------
NATSOFT.DOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = kermit)(PORT = 1523))
)
(CONNECT_DATA =
(SERVICE_NAME = natsoft.domain)
)
)
There are 3 connection modes, 0 = non-persistent, 1 = persistent, 2 = force new connection
*/
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$mode=0)
{
if (!function_exists('OCIPLogon')) return null;
$this->_errorMsg = false;
$this->_errorCode = false;
if($argHostname) { // added by Jorma Tuomainen <jorma.tuomainen@ppoy.fi>
if (empty($argDatabasename)) $argDatabasename = $argHostname;
else {
if(strpos($argHostname,":")) {
$argHostinfo=explode(":",$argHostname);
$argHostname=$argHostinfo[0];
$argHostport=$argHostinfo[1];
} else {
$argHostport = empty($this->port)? "1521" : $this->port;
}
if ($this->connectSID) {
$argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
.")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))";
} else
$argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
.")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))";
}
}
//if ($argHostname) print "<p>Connect: 1st argument should be left blank for $this->databaseType</p>";
if ($mode==1) {
$this->_connectionID = ($this->charSet) ?
OCIPLogon($argUsername,$argPassword, $argDatabasename)
:
OCIPLogon($argUsername,$argPassword, $argDatabasename, $this->charSet)
;
if ($this->_connectionID && $this->autoRollback) OCIrollback($this->_connectionID);
} else if ($mode==2) {
$this->_connectionID = ($this->charSet) ?
OCINLogon($argUsername,$argPassword, $argDatabasename)
:
OCINLogon($argUsername,$argPassword, $argDatabasename, $this->charSet);
} else {
$this->_connectionID = ($this->charSet) ?
OCILogon($argUsername,$argPassword, $argDatabasename)
:
OCILogon($argUsername,$argPassword, $argDatabasename,$this->charSet);
}
if (!$this->_connectionID) return false;
if ($this->_initdate) {
$this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'");
}
// looks like:
// Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production
// $vers = OCIServerVersion($this->_connectionID);
// if (strpos($vers,'8i') !== false) $this->ansiOuter = true;
return true;
}
function ServerInfo()
{
$arr['compat'] = $this->GetOne('select value from sys.database_compatible_level');
$arr['description'] = @OCIServerVersion($this->_connectionID);
$arr['version'] = ADOConnection::_findvers($arr['description']);
return $arr;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,1);
}
// returns true or false
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,2);
}
function _affectedrows()
{
if (is_resource($this->_stmt)) return @OCIRowCount($this->_stmt);
return 0;
}
function IfNull( $field, $ifNull )
{
return " NVL($field, $ifNull) "; // if Oracle
}
// format and return date string in database date format
function DBDate($d)
{
if (empty($d) && $d !== 0) return 'null';
if (is_string($d)) $d = ADORecordSet::UnixDate($d);
return "TO_DATE(".adodb_date($this->fmtDate,$d).",'".$this->NLS_DATE_FORMAT."')";
}
 
// format and return date string in database timestamp format
function DBTimeStamp($ts)
{
if (empty($ts) && $ts !== 0) return 'null';
if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts);
return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'RRRR-MM-DD, HH:MI:SS AM')";
}
function RowLock($tables,$where,$flds='1 as ignore')
{
if ($this->autoCommit) $this->BeginTrans();
return $this->GetOne("select $flds from $tables where $where for update");
}
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
if ($mask) {
$save = $this->metaTablesSQL;
$mask = $this->qstr(strtoupper($mask));
$this->metaTablesSQL .= " AND upper(table_name) like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
if ($mask) {
$this->metaTablesSQL = $save;
}
return $ret;
}
// Mark Newnham
function &MetaIndexes ($table, $primary = FALSE, $owner=false)
{
// save old fetch mode
global $ADODB_FETCH_MODE;
 
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
 
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
 
// get index details
$table = strtoupper($table);
 
// get Primary index
$primary_key = '';
 
$false = false;
$rs = $this->Execute(sprintf("SELECT * FROM ALL_CONSTRAINTS WHERE UPPER(TABLE_NAME)='%s' AND CONSTRAINT_TYPE='P'",$table));
if ($row = $rs->FetchRow())
$primary_key = $row[1]; //constraint_name
 
if ($primary==TRUE && $primary_key=='') {
if (isset($savem))
$this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
return $false; //There is no primary key
}
 
$rs = $this->Execute(sprintf("SELECT ALL_INDEXES.INDEX_NAME, ALL_INDEXES.UNIQUENESS, ALL_IND_COLUMNS.COLUMN_POSITION, ALL_IND_COLUMNS.COLUMN_NAME FROM ALL_INDEXES,ALL_IND_COLUMNS WHERE UPPER(ALL_INDEXES.TABLE_NAME)='%s' AND ALL_IND_COLUMNS.INDEX_NAME=ALL_INDEXES.INDEX_NAME",$table));
 
if (!is_object($rs)) {
if (isset($savem))
$this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
return $false;
}
 
$indexes = array ();
// parse index data into array
 
while ($row = $rs->FetchRow()) {
if ($primary && $row[0] != $primary_key) continue;
if (!isset($indexes[$row[0]])) {
$indexes[$row[0]] = array(
'unique' => ($row[1] == 'UNIQUE'),
'columns' => array()
);
}
$indexes[$row[0]]['columns'][$row[2] - 1] = $row[3];
}
 
// sort columns by order in the index
foreach ( array_keys ($indexes) as $index ) {
ksort ($indexes[$index]['columns']);
}
 
if (isset($savem)) {
$this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
}
return $indexes;
}
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
$this->autoCommit = false;
$this->_commit = OCI_DEFAULT;
return true;
}
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
if ($this->transCnt) $this->transCnt -= 1;
$ret = OCIcommit($this->_connectionID);
$this->_commit = OCI_COMMIT_ON_SUCCESS;
$this->autoCommit = true;
return $ret;
}
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$ret = OCIrollback($this->_connectionID);
$this->_commit = OCI_COMMIT_ON_SUCCESS;
$this->autoCommit = true;
return $ret;
}
function SelectDB($dbName)
{
return false;
}
 
function ErrorMsg()
{
if ($this->_errorMsg !== false) return $this->_errorMsg;
 
if (is_resource($this->_stmt)) $arr = @OCIerror($this->_stmt);
if (empty($arr)) {
$arr = @OCIerror($this->_connectionID);
if ($arr === false) $arr = @OCIError();
if ($arr === false) return '';
}
$this->_errorMsg = $arr['message'];
$this->_errorCode = $arr['code'];
return $this->_errorMsg;
}
 
function ErrorNo()
{
if ($this->_errorCode !== false) return $this->_errorCode;
if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt);
if (empty($arr)) {
$arr = @OCIError($this->_connectionID);
if ($arr == false) $arr = @OCIError();
if ($arr == false) return '';
}
$this->_errorMsg = $arr['message'];
$this->_errorCode = $arr['code'];
return $arr['code'];
}
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysTimeStamp;
$s = 'TO_CHAR('.$col.",'";
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
$ch = $fmt[$i];
switch($ch) {
case 'Y':
case 'y':
$s .= 'YYYY';
break;
case 'Q':
case 'q':
$s .= 'Q';
break;
case 'M':
$s .= 'Mon';
break;
case 'm':
$s .= 'MM';
break;
case 'D':
case 'd':
$s .= 'DD';
break;
case 'H':
$s.= 'HH24';
break;
case 'h':
$s .= 'HH';
break;
case 'i':
$s .= 'MI';
break;
case 's':
$s .= 'SS';
break;
case 'a':
case 'A':
$s .= 'AM';
break;
case 'w':
$s .= 'D';
break;
case 'l':
$s .= 'DAY';
break;
case 'W':
$s .= 'WW';
break;
default:
// handle escape characters...
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
if (strpos('-/.:;, ',$ch) !== false) $s .= $ch;
else $s .= '"'.$ch.'"';
}
}
return $s. "')";
}
/*
This algorithm makes use of
a. FIRST_ROWS hint
The FIRST_ROWS hint explicitly chooses the approach to optimize response time,
that is, minimum resource usage to return the first row. Results will be returned
as soon as they are identified.
 
b. Uses rownum tricks to obtain only the required rows from a given offset.
As this uses complicated sql statements, we only use this if the $offset >= 100.
This idea by Tomas V V Cox.
This implementation does not appear to work with oracle 8.0.5 or earlier. Comment
out this function then, and the slower SelectLimit() in the base class will be used.
*/
function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
{
// seems that oracle only supports 1 hint comment in 8i
if ($this->firstrows) {
if (strpos($sql,'/*+') !== false)
$sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql);
else
$sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql);
}
if ($offset < $this->selectOffsetAlg1) {
if ($nrows > 0) {
if ($offset > 0) $nrows += $offset;
//$inputarr['adodb_rownum'] = $nrows;
if ($this->databaseType == 'oci8po') {
$sql = "select * from (".$sql.") where rownum <= ?";
} else {
$sql = "select * from (".$sql.") where rownum <= :adodb_offset";
}
$inputarr['adodb_offset'] = $nrows;
$nrows = -1;
}
// note that $nrows = 0 still has to work ==> no rows returned
 
$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
return $rs;
} else {
// Algorithm by Tomas V V Cox, from PEAR DB oci8.php
// Let Oracle return the name of the columns
$q_fields = "SELECT * FROM (".$sql.") WHERE NULL = NULL";
$false = false;
if (! $stmt_arr = $this->Prepare($q_fields)) {
return $false;
}
$stmt = $stmt_arr[1];
if (is_array($inputarr)) {
foreach($inputarr as $k => $v) {
if (is_array($v)) {
if (sizeof($v) == 2) // suggested by g.giunta@libero.
OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]);
else
OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]);
} else {
$len = -1;
if ($v === ' ') $len = 1;
if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again
$bindarr[$k] = $v;
} else { // dynamic sql, so rebind every time
OCIBindByName($stmt,":$k",$inputarr[$k],$len);
}
}
}
}
if (!OCIExecute($stmt, OCI_DEFAULT)) {
OCIFreeStatement($stmt);
return $false;
}
$ncols = OCINumCols($stmt);
for ( $i = 1; $i <= $ncols; $i++ ) {
$cols[] = '"'.OCIColumnName($stmt, $i).'"';
}
$result = false;
OCIFreeStatement($stmt);
$fields = implode(',', $cols);
$nrows += $offset;
$offset += 1; // in Oracle rownum starts at 1
if ($this->databaseType == 'oci8po') {
$sql = "SELECT $fields FROM".
"(SELECT rownum as adodb_rownum, $fields FROM".
" ($sql) WHERE rownum <= ?".
") WHERE adodb_rownum >= ?";
} else {
$sql = "SELECT $fields FROM".
"(SELECT rownum as adodb_rownum, $fields FROM".
" ($sql) WHERE rownum <= :adodb_nrows".
") WHERE adodb_rownum >= :adodb_offset";
}
$inputarr['adodb_nrows'] = $nrows;
$inputarr['adodb_offset'] = $offset;
if ($secs2cache>0) $rs =& $this->CacheExecute($secs2cache, $sql,$inputarr);
else $rs =& $this->Execute($sql,$inputarr);
return $rs;
}
}
/**
* Usage:
* Store BLOBs and CLOBs
*
* Example: to store $var in a blob
*
* $conn->Execute('insert into TABLE (id,ablob) values(12,empty_blob())');
* $conn->UpdateBlob('TABLE', 'ablob', $varHoldingBlob, 'ID=12', 'BLOB');
*
* $blobtype supports 'BLOB' and 'CLOB', but you need to change to 'empty_clob()'.
*
* to get length of LOB:
* select DBMS_LOB.GETLENGTH(ablob) from TABLE
*
* If you are using CURSOR_SHARING = force, it appears this will case a segfault
* under oracle 8.1.7.0. Run:
* $db->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT');
* before UpdateBlob() then...
*/
 
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{
//if (strlen($val) < 4000) return $this->Execute("UPDATE $table SET $column=:blob WHERE $where",array('blob'=>$val)) != false;
switch(strtoupper($blobtype)) {
default: ADOConnection::outp("<b>UpdateBlob</b>: Unknown blobtype=$blobtype"); return false;
case 'BLOB': $type = OCI_B_BLOB; break;
case 'CLOB': $type = OCI_B_CLOB; break;
}
if ($this->databaseType == 'oci8po')
$sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?";
else
$sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob";
$desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB);
$arr['blob'] = array($desc,-1,$type);
if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT');
$commit = $this->autoCommit;
if ($commit) $this->BeginTrans();
$rs = $this->_Execute($sql,$arr);
if ($rez = !empty($rs)) $desc->save($val);
$desc->free();
if ($commit) $this->CommitTrans();
if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=FORCE');
if ($rez) $rs->Close();
return $rez;
}
/**
* Usage: store file pointed to by $var in a blob
*/
function UpdateBlobFile($table,$column,$val,$where,$blobtype='BLOB')
{
switch(strtoupper($blobtype)) {
default: ADOConnection::outp( "<b>UpdateBlob</b>: Unknown blobtype=$blobtype"); return false;
case 'BLOB': $type = OCI_B_BLOB; break;
case 'CLOB': $type = OCI_B_CLOB; break;
}
if ($this->databaseType == 'oci8po')
$sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?";
else
$sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob";
$desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB);
$arr['blob'] = array($desc,-1,$type);
$this->BeginTrans();
$rs = ADODB_oci8::Execute($sql,$arr);
if ($rez = !empty($rs)) $desc->savefile($val);
$desc->free();
$this->CommitTrans();
if ($rez) $rs->Close();
return $rez;
}
 
/**
* Execute SQL
*
* @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text)
* @param [inputarr] holds the input data to bind to. Null elements will be set to null.
* @return RecordSet or false
*/
function &Execute($sql,$inputarr=false)
{
if ($this->fnExecute) {
$fn = $this->fnExecute;
$ret =& $fn($this,$sql,$inputarr);
if (isset($ret)) return $ret;
}
if ($inputarr) {
#if (!is_array($inputarr)) $inputarr = array($inputarr);
$element0 = reset($inputarr);
# is_object check because oci8 descriptors can be passed in
if (is_array($element0) && !is_object(reset($element0))) {
if (is_string($sql))
$stmt = $this->Prepare($sql);
else
$stmt = $sql;
foreach($inputarr as $arr) {
$ret =& $this->_Execute($stmt,$arr);
if (!$ret) return $ret;
}
} else {
$ret =& $this->_Execute($sql,$inputarr);
}
} else {
$ret =& $this->_Execute($sql,false);
}
 
return $ret;
}
/*
Example of usage:
$stmt = $this->Prepare('insert into emp (empno, ename) values (:empno, :ename)');
*/
function Prepare($sql,$cursor=false)
{
static $BINDNUM = 0;
$stmt = OCIParse($this->_connectionID,$sql);
 
if (!$stmt) return false;
 
$BINDNUM += 1;
$sttype = @OCIStatementType($stmt);
if ($sttype == 'BEGIN' || $sttype == 'DECLARE') {
return array($sql,$stmt,0,$BINDNUM, ($cursor) ? OCINewCursor($this->_connectionID) : false);
}
return array($sql,$stmt,0,$BINDNUM);
}
/*
Call an oracle stored procedure and returns a cursor variable as a recordset.
Concept by Robert Tuttle robert@ud.com
Example:
Note: we return a cursor variable in :RS2
$rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS2); END;",'RS2');
$rs = $db->ExecuteCursor(
"BEGIN :RS2 = adodb.getdata(:VAR1); END;",
'RS2',
array('VAR1' => 'Mr Bean'));
*/
function &ExecuteCursor($sql,$cursorName='rs',$params=false)
{
if (is_array($sql)) $stmt = $sql;
else $stmt = ADODB_oci8::Prepare($sql,true); # true to allocate OCINewCursor
if (is_array($stmt) && sizeof($stmt) >= 5) {
$hasref = true;
$ignoreCur = false;
$this->Parameter($stmt, $ignoreCur, $cursorName, false, -1, OCI_B_CURSOR);
if ($params) {
foreach($params as $k => $v) {
$this->Parameter($stmt,$params[$k], $k);
}
}
} else
$hasref = false;
$rs =& $this->Execute($stmt);
if ($rs) {
if ($rs->databaseType == 'array') OCIFreeCursor($stmt[4]);
else if ($hasref) $rs->_refcursor = $stmt[4];
}
return $rs;
}
/*
Bind a variable -- very, very fast for executing repeated statements in oracle.
Better than using
for ($i = 0; $i < $max; $i++) {
$p1 = ?; $p2 = ?; $p3 = ?;
$this->Execute("insert into table (col0, col1, col2) values (:0, :1, :2)",
array($p1,$p2,$p3));
}
Usage:
$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)");
$DB->Bind($stmt, $p1);
$DB->Bind($stmt, $p2);
$DB->Bind($stmt, $p3);
for ($i = 0; $i < $max; $i++) {
$p1 = ?; $p2 = ?; $p3 = ?;
$DB->Execute($stmt);
}
Some timings:
** Test table has 3 cols, and 1 index. Test to insert 1000 records
Time 0.6081s (1644.60 inserts/sec) with direct OCIParse/OCIExecute
Time 0.6341s (1577.16 inserts/sec) with ADOdb Prepare/Bind/Execute
Time 1.5533s ( 643.77 inserts/sec) with pure SQL using Execute
Now if PHP only had batch/bulk updating like Java or PL/SQL...
Note that the order of parameters differs from OCIBindByName,
because we default the names to :0, :1, :2
*/
function Bind(&$stmt,&$var,$size=4000,$type=false,$name=false,$isOutput=false)
{
if (!is_array($stmt)) return false;
if (($type == OCI_B_CURSOR) && sizeof($stmt) >= 5) {
return OCIBindByName($stmt[1],":".$name,$stmt[4],$size,$type);
}
if ($name == false) {
if ($type !== false) $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size,$type);
else $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size); // +1 byte for null terminator
$stmt[2] += 1;
} else if (oci_lob_desc($type)) {
if ($this->debug) {
ADOConnection::outp("<b>Bind</b>: name = $name");
}
//we have to create a new Descriptor here
$numlob = count($this->_refLOBs);
$this->_refLOBs[$numlob]['LOB'] = OCINewDescriptor($this->_connectionID, oci_lob_desc($type));
$this->_refLOBs[$numlob]['TYPE'] = $isOutput;
$tmp = &$this->_refLOBs[$numlob]['LOB'];
$rez = OCIBindByName($stmt[1], ":".$name, $tmp, -1, $type);
if ($this->debug) {
ADOConnection::outp("<b>Bind</b>: descriptor has been allocated, var (".$name.") binded");
}
// if type is input then write data to lob now
if ($isOutput == false) {
$var = $this->BlobEncode($var);
$tmp->WriteTemporary($var);
$this->_refLOBs[$numlob]['VAR'] = &$var;
if ($this->debug) {
ADOConnection::outp("<b>Bind</b>: LOB has been written to temp");
}
} else {
$this->_refLOBs[$numlob]['VAR'] = &$var;
}
$rez = $tmp;
} else {
if ($this->debug)
ADOConnection::outp("<b>Bind</b>: name = $name");
if ($type !== false) $rez = OCIBindByName($stmt[1],":".$name,$var,$size,$type);
else $rez = OCIBindByName($stmt[1],":".$name,$var,$size); // +1 byte for null terminator
}
return $rez;
}
function Param($name,$type=false)
{
return ':'.$name;
}
/*
Usage:
$stmt = $db->Prepare('select * from table where id =:myid and group=:group');
$db->Parameter($stmt,$id,'myid');
$db->Parameter($stmt,$group,'group');
$db->Execute($stmt);
@param $stmt Statement returned by Prepare() or PrepareSP().
@param $var PHP variable to bind to
@param $name Name of stored procedure variable name to bind to.
@param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8.
@param [$maxLen] Holds an maximum length of the variable.
@param [$type] The data type of $var. Legal values depend on driver.
See OCIBindByName documentation at php.net.
*/
function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false)
{
if ($this->debug) {
$prefix = ($isOutput) ? 'Out' : 'In';
$ztype = (empty($type)) ? 'false' : $type;
ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);");
}
return $this->Bind($stmt,$var,$maxLen,$type,$name,$isOutput);
}
/*
returns query ID if successful, otherwise false
this version supports:
1. $db->execute('select * from table');
2. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)');
$db->execute($prepared_statement, array(1,2,3));
3. $db->execute('insert into table (a,b,c) values (:a,:b,:c)',array('a'=>1,'b'=>2,'c'=>3));
4. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)');
$db->bind($stmt,1); $db->bind($stmt,2); $db->bind($stmt,3);
$db->execute($stmt);
*/
function _query($sql,$inputarr)
{
if (is_array($sql)) { // is prepared sql
$stmt = $sql[1];
// we try to bind to permanent array, so that OCIBindByName is persistent
// and carried out once only - note that max array element size is 4000 chars
if (is_array($inputarr)) {
$bindpos = $sql[3];
if (isset($this->_bind[$bindpos])) {
// all tied up already
$bindarr = &$this->_bind[$bindpos];
} else {
// one statement to bind them all
$bindarr = array();
foreach($inputarr as $k => $v) {
$bindarr[$k] = $v;
OCIBindByName($stmt,":$k",$bindarr[$k],is_string($v) && strlen($v)>4000 ? -1 : 4000);
}
$this->_bind[$bindpos] = &$bindarr;
}
}
} else {
$stmt=OCIParse($this->_connectionID,$sql);
}
$this->_stmt = $stmt;
if (!$stmt) return false;
if (defined('ADODB_PREFETCH_ROWS')) @OCISetPrefetch($stmt,ADODB_PREFETCH_ROWS);
if (is_array($inputarr)) {
foreach($inputarr as $k => $v) {
if (is_array($v)) {
if (sizeof($v) == 2) // suggested by g.giunta@libero.
OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]);
else
OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]);
if ($this->debug==99) echo "name=:$k",' var='.$inputarr[$k][0],' len='.$v[1],' type='.$v[2],'<br>';
} else {
$len = -1;
if ($v === ' ') $len = 1;
if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again
$bindarr[$k] = $v;
} else { // dynamic sql, so rebind every time
OCIBindByName($stmt,":$k",$inputarr[$k],$len);
}
}
}
}
$this->_errorMsg = false;
$this->_errorCode = false;
if (OCIExecute($stmt,$this->_commit)) {
//OCIInternalDebug(1);
if (count($this -> _refLOBs) > 0) {
foreach ($this -> _refLOBs as $key => $value) {
if ($this -> _refLOBs[$key]['TYPE'] == true) {
$tmp = $this -> _refLOBs[$key]['LOB'] -> load();
if ($this -> debug) {
ADOConnection::outp("<b>OUT LOB</b>: LOB has been loaded. <br>");
}
//$_GLOBALS[$this -> _refLOBs[$key]['VAR']] = $tmp;
$this -> _refLOBs[$key]['VAR'] = $tmp;
} else {
$this->_refLOBs[$key]['LOB']->save($this->_refLOBs[$key]['VAR']);
$this -> _refLOBs[$key]['LOB']->free();
unset($this -> _refLOBs[$key]);
if ($this->debug) {
ADOConnection::outp("<b>IN LOB</b>: LOB has been saved. <br>");
}
}
}
}
switch (@OCIStatementType($stmt)) {
case "SELECT":
return $stmt;
case 'DECLARE':
case "BEGIN":
if (is_array($sql) && !empty($sql[4])) {
$cursor = $sql[4];
if (is_resource($cursor)) {
$ok = OCIExecute($cursor);
return $cursor;
}
return $stmt;
} else {
if (is_resource($stmt)) {
OCIFreeStatement($stmt);
return true;
}
return $stmt;
}
break;
default :
// ociclose -- no because it could be used in a LOB?
return true;
}
}
return false;
}
// returns true or false
function _close()
{
if (!$this->_connectionID) return;
if (!$this->autoCommit) OCIRollback($this->_connectionID);
if (count($this->_refLOBs) > 0) {
foreach ($this ->_refLOBs as $key => $value) {
$this->_refLOBs[$key]['LOB']->free();
unset($this->_refLOBs[$key]);
}
}
OCILogoff($this->_connectionID);
$this->_stmt = false;
$this->_connectionID = false;
}
function MetaPrimaryKeys($table, $owner=false,$internalKey=false)
{
if ($internalKey) return array('ROWID');
// tested with oracle 8.1.7
$table = strtoupper($table);
if ($owner) {
$owner_clause = "AND ((a.OWNER = b.OWNER) AND (a.OWNER = UPPER('$owner')))";
$ptab = 'ALL_';
} else {
$owner_clause = '';
$ptab = 'USER_';
}
$sql = "
SELECT /*+ RULE */ distinct b.column_name
FROM {$ptab}CONSTRAINTS a
, {$ptab}CONS_COLUMNS b
WHERE ( UPPER(b.table_name) = ('$table'))
AND (UPPER(a.table_name) = ('$table') and a.constraint_type = 'P')
$owner_clause
AND (a.constraint_name = b.constraint_name)";
 
$rs = $this->Execute($sql);
if ($rs && !$rs->EOF) {
$arr =& $rs->GetArray();
$a = array();
foreach($arr as $v) {
$a[] = reset($v);
}
return $a;
}
else return false;
}
// http://gis.mit.edu/classes/11.521/sqlnotes/referential_integrity.html
function MetaForeignKeys($table, $owner=false)
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$table = $this->qstr(strtoupper($table));
if (!$owner) {
$owner = $this->user;
$tabp = 'user_';
} else
$tabp = 'all_';
$owner = ' and owner='.$this->qstr(strtoupper($owner));
$sql =
"select constraint_name,r_owner,r_constraint_name
from {$tabp}constraints
where constraint_type = 'R' and table_name = $table $owner";
$constraints =& $this->GetArray($sql);
$arr = false;
foreach($constraints as $constr) {
$cons = $this->qstr($constr[0]);
$rowner = $this->qstr($constr[1]);
$rcons = $this->qstr($constr[2]);
$cols = $this->GetArray("select column_name from {$tabp}cons_columns where constraint_name=$cons $owner order by position");
$tabcol = $this->GetArray("select table_name,column_name from {$tabp}cons_columns where owner=$rowner and constraint_name=$rcons order by position");
if ($cols && $tabcol)
for ($i=0, $max=sizeof($cols); $i < $max; $i++) {
$arr[$tabcol[$i][0]] = $cols[$i][0].'='.$tabcol[$i][1];
}
}
$ADODB_FETCH_MODE = $save;
return $arr;
}
 
function CharMax()
{
return 4000;
}
function TextMax()
{
return 4000;
}
/**
* Quotes a string.
* An example is $db->qstr("Don't bother",magic_quotes_runtime());
*
* @param s the string to quote
* @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc().
* This undoes the stupidity of magic quotes for GPC.
*
* @return quoted string to be sent back to database
*/
function qstr($s,$magic_quotes=false)
{
//$nofixquotes=false;
if ($this->noNullStrings && strlen($s)==0)$s = ' ';
if (!$magic_quotes) {
if ($this->replaceQuote[0] == '\\'){
$s = str_replace('\\','\\\\',$s);
}
return "'".str_replace("'",$this->replaceQuote,$s)."'";
}
// undo magic quotes for "
$s = str_replace('\\"','"',$s);
$s = str_replace('\\\\','\\',$s);
return "'".str_replace("\\'",$this->replaceQuote,$s)."'";
}
}
 
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordset_oci8 extends ADORecordSet {
 
var $databaseType = 'oci8';
var $bind=false;
var $_fieldobjs;
//var $_arr = false;
function ADORecordset_oci8($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
case ADODB_FETCH_NUM:
default:
$this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
}
$this->adodbFetchMode = $mode;
$this->_queryID = $queryID;
}
 
 
function Init()
{
if ($this->_inited) return;
$this->_inited = true;
if ($this->_queryID) {
$this->_currentRow = 0;
@$this->_initrs();
$this->EOF = !$this->_fetch();
/*
// based on idea by Gaetano Giunta to detect unusual oracle errors
// see http://phplens.com/lens/lensforum/msgs.php?id=6771
$err = OCIError($this->_queryID);
if ($err && $this->connection->debug) ADOConnection::outp($err);
*/
if (!is_array($this->fields)) {
$this->_numOfRows = 0;
$this->fields = array();
}
} else {
$this->fields = array();
$this->_numOfRows = 0;
$this->_numOfFields = 0;
$this->EOF = true;
}
}
function _initrs()
{
$this->_numOfRows = -1;
$this->_numOfFields = OCInumcols($this->_queryID);
if ($this->_numOfFields>0) {
$this->_fieldobjs = array();
$max = $this->_numOfFields;
for ($i=0;$i<$max; $i++) $this->_fieldobjs[] = $this->_FetchField($i);
}
}
 
/* Returns: an object containing field information.
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
fetchField() is retrieved. */
 
function &_FetchField($fieldOffset = -1)
{
$fld = new ADOFieldObject;
$fieldOffset += 1;
$fld->name =OCIcolumnname($this->_queryID, $fieldOffset);
$fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
$fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
if ($fld->type == 'NUMBER') {
$p = OCIColumnPrecision($this->_queryID, $fieldOffset);
$sc = OCIColumnScale($this->_queryID, $fieldOffset);
if ($p != 0 && $sc == 0) $fld->type = 'INT';
//echo " $this->name ($p.$sc) ";
}
return $fld;
}
/* For some reason, OCIcolumnname fails when called after _initrs() so we cache it */
function &FetchField($fieldOffset = -1)
{
return $this->_fieldobjs[$fieldOffset];
}
/*
// 10% speedup to move MoveNext to child class
function _MoveNext()
{
//global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this);
if ($this->EOF) return false;
$this->_currentRow++;
if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode))
return true;
$this->EOF = true;
return false;
} */
function MoveNext()
{
if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
$this->_currentRow += 1;
return true;
}
if (!$this->EOF) {
$this->_currentRow += 1;
$this->EOF = true;
}
return false;
}
/*
# does not work as first record is retrieved in _initrs(), so is not included in GetArray()
function &GetArray($nRows = -1)
{
global $ADODB_OCI8_GETARRAY;
if (true || !empty($ADODB_OCI8_GETARRAY)) {
# does not support $ADODB_ANSI_PADDING_OFF
//OCI_RETURN_NULLS and OCI_RETURN_LOBS is set by OCIfetchstatement
switch($this->adodbFetchMode) {
case ADODB_FETCH_NUM:
$ncols = @OCIfetchstatement($this->_queryID, $results, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW+OCI_NUM);
$results = array_merge(array($this->fields),$results);
return $results;
case ADODB_FETCH_ASSOC:
if (ADODB_ASSOC_CASE != 2 || $this->databaseType != 'oci8') break;
$ncols = @OCIfetchstatement($this->_queryID, $assoc, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW);
$results =& array_merge(array($this->fields),$assoc);
return $results;
default:
break;
}
}
$results =& ADORecordSet::GetArray($nRows);
return $results;
} */
/* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
function &GetArrayLimit($nrows,$offset=-1)
{
if ($offset <= 0) {
$arr =& $this->GetArray($nrows);
return $arr;
}
for ($i=1; $i < $offset; $i++)
if (!@OCIFetch($this->_queryID)) return array();
if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return array();
$results = array();
$cnt = 0;
while (!$this->EOF && $nrows != $cnt) {
$results[$cnt++] = $this->fields;
$this->MoveNext();
}
return $results;
}
 
/* Use associative array to get fields array */
function Fields($colname)
{
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
 
 
function _seek($row)
{
return false;
}
 
function _fetch()
{
return @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
}
 
/* close() only needs to be called if you are worried about using too much memory while your script
is running. All associated result memory for the specified result identifier will automatically be freed. */
 
function _close()
{
if ($this->connection->_stmt === $this->_queryID) $this->connection->_stmt = false;
if (!empty($this->_refcursor)) {
OCIFreeCursor($this->_refcursor);
$this->_refcursor = false;
}
@OCIFreeStatement($this->_queryID);
$this->_queryID = false;
}
 
function MetaType($t,$len=-1)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
switch (strtoupper($t)) {
case 'VARCHAR':
case 'VARCHAR2':
case 'CHAR':
case 'VARBINARY':
case 'BINARY':
case 'NCHAR':
case 'NVARCHAR':
case 'NVARCHAR2':
if (isset($this) && $len <= $this->blobSize) return 'C';
case 'NCLOB':
case 'LONG':
case 'LONG VARCHAR':
case 'CLOB':
return 'X';
case 'LONG RAW':
case 'LONG VARBINARY':
case 'BLOB':
return 'B';
case 'DATE':
return ($this->connection->datetime) ? 'T' : 'D';
case 'TIMESTAMP': return 'T';
case 'INT':
case 'SMALLINT':
case 'INTEGER':
return 'I';
default: return 'N';
}
}
}
 
class ADORecordSet_ext_oci8 extends ADORecordSet_oci8 {
function ADORecordSet_ext_oci8($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
case ADODB_FETCH_NUM:
default: $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
}
$this->adodbFetchMode = $mode;
$this->_queryID = $queryID;
}
function MoveNext()
{
return adodb_movenext($this);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-oci805.inc.php
0,0 → 1,59
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://php.weblogs.com
*
* Oracle 8.0.5 driver
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');
 
class ADODB_oci805 extends ADODB_oci8 {
var $databaseType = "oci805";
var $connectSID = true;
function ADODB_oci805()
{
$this->ADODB_oci8();
}
function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
{
// seems that oracle only supports 1 hint comment in 8i
if (strpos($sql,'/*+') !== false)
$sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql);
else
$sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql);
/*
The following is only available from 8.1.5 because order by in inline views not
available before then...
http://www.jlcomp.demon.co.uk/faq/top_sql.html
if ($nrows > 0) {
if ($offset > 0) $nrows += $offset;
$sql = "select * from ($sql) where rownum <= $nrows";
$nrows = -1;
}
*/
 
return ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
}
}
 
class ADORecordset_oci805 extends ADORecordset_oci8 {
var $databaseType = "oci805";
function ADORecordset_oci805($id,$mode=false)
{
$this->ADORecordset_oci8($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-oci8po.inc.php
0,0 → 1,217
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim. All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
 
Latest version is available at http://adodb.sourceforge.net
Portable version of oci8 driver, to make it more similar to other database drivers.
The main differences are
 
1. that the OCI_ASSOC names are in lowercase instead of uppercase.
2. bind variables are mapped using ? instead of :<bindvar>
 
Should some emulation of RecordCount() be implemented?
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');
 
class ADODB_oci8po extends ADODB_oci8 {
var $databaseType = 'oci8po';
var $dataProvider = 'oci8';
var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')";
function ADODB_oci8po()
{
$this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
# oci8po does not support adodb extension: adodb_movenext()
}
function Param($name)
{
return '?';
}
function Prepare($sql,$cursor=false)
{
$sqlarr = explode('?',$sql);
$sql = $sqlarr[0];
for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
$sql .= ':'.($i-1) . $sqlarr[$i];
}
return ADODB_oci8::Prepare($sql,$cursor);
}
// emulate handling of parameters ? ?, replacing with :bind0 :bind1
function _query($sql,$inputarr)
{
if (is_array($inputarr)) {
$i = 0;
if (is_array($sql)) {
foreach($inputarr as $v) {
$arr['bind'.$i++] = $v;
}
} else {
$sqlarr = explode('?',$sql);
$sql = $sqlarr[0];
foreach($inputarr as $k => $v) {
$sql .= ":$k" . $sqlarr[++$i];
}
}
}
return ADODB_oci8::_query($sql,$inputarr);
}
}
 
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordset_oci8po extends ADORecordset_oci8 {
 
var $databaseType = 'oci8po';
function ADORecordset_oci8po($queryID,$mode=false)
{
$this->ADORecordset_oci8($queryID,$mode);
}
 
function Fields($colname)
{
if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
// lowercase field names...
function &_FetchField($fieldOffset = -1)
{
$fld = new ADOFieldObject;
$fieldOffset += 1;
$fld->name = strtolower(OCIcolumnname($this->_queryID, $fieldOffset));
$fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
$fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
if ($fld->type == 'NUMBER') {
//$p = OCIColumnPrecision($this->_queryID, $fieldOffset);
$sc = OCIColumnScale($this->_queryID, $fieldOffset);
if ($sc == 0) $fld->type = 'INT';
}
return $fld;
}
/*
function MoveNext()
{
if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
$this->_currentRow += 1;
return true;
}
if (!$this->EOF) {
$this->_currentRow += 1;
$this->EOF = true;
}
return false;
}*/
 
// 10% speedup to move MoveNext to child class
function MoveNext()
{
if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
global $ADODB_ANSI_PADDING_OFF;
$this->_currentRow++;
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
if (!empty($ADODB_ANSI_PADDING_OFF)) {
foreach($this->fields as $k => $v) {
if (is_string($v)) $this->fields[$k] = rtrim($v);
}
}
return true;
}
if (!$this->EOF) {
$this->EOF = true;
$this->_currentRow++;
}
return false;
}
/* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
function &GetArrayLimit($nrows,$offset=-1)
{
if ($offset <= 0) {
$arr = $this->GetArray($nrows);
return $arr;
}
for ($i=1; $i < $offset; $i++)
if (!@OCIFetch($this->_queryID)) {
$arr = array();
return $arr;
}
if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
$arr = array();
return $arr;
}
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
$results = array();
$cnt = 0;
while (!$this->EOF && $nrows != $cnt) {
$results[$cnt++] = $this->fields;
$this->MoveNext();
}
return $results;
}
 
// Create associative array
function _updatefields()
{
if (ADODB_ASSOC_CASE == 2) return; // native
$arr = array();
$lowercase = (ADODB_ASSOC_CASE == 0);
foreach($this->fields as $k => $v) {
if (is_integer($k)) $arr[$k] = $v;
else {
if ($lowercase)
$arr[strtolower($k)] = $v;
else
$arr[strtoupper($k)] = $v;
}
}
$this->fields = $arr;
}
function _fetch()
{
$ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
if ($ret) {
global $ADODB_ANSI_PADDING_OFF;
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
if (!empty($ADODB_ANSI_PADDING_OFF)) {
foreach($this->fields as $k => $v) {
if (is_string($v)) $this->fields[$k] = rtrim($v);
}
}
}
return $ret;
}
}
 
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-odbc.inc.php
0,0 → 1,738
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Requires ODBC. Works on Windows and Unix.
*/
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
define("_ADODB_ODBC_LAYER", 2 );
/*--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------*/
 
 
class ADODB_odbc extends ADOConnection {
var $databaseType = "odbc";
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
var $replaceQuote = "''"; // string to use to replace quotes
var $dataProvider = "odbc";
var $hasAffectedRows = true;
var $binmode = ODBC_BINMODE_RETURN;
var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
// breaking backward-compat
//var $longreadlen = 8000; // default number of chars to return for a Blob/Long field
var $_bindInputArray = false;
var $curmode = SQL_CUR_USE_DRIVER; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L
var $_genSeqSQL = "create table %s (id integer)";
var $_autocommit = true;
var $_haserrorfunctions = true;
var $_has_stupid_odbc_fetch_api_change = true;
var $_lastAffectedRows = 0;
var $uCaseTables = true; // for meta* functions, uppercase table names
function ADODB_odbc()
{
$this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
$this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
}
// returns true or false
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
{
global $php_errormsg;
if (!function_exists('odbc_connect')) return null;
if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') {
ADOConnection::outp("For odbc Connect(), $argDatabasename is not used. Place dsn in 1st parameter.");
}
if (isset($php_errormsg)) $php_errormsg = '';
if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
else $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,$this->curmode);
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
return $this->_connectionID != false;
}
// returns true or false
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
{
global $php_errormsg;
if (!function_exists('odbc_connect')) return null;
if (isset($php_errormsg)) $php_errormsg = '';
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
if ($this->debug && $argDatabasename) {
ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter.");
}
// print "dsn=$argDSN u=$argUsername p=$argPassword<br>"; flush();
if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
else $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,$this->curmode);
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
if ($this->_connectionID && $this->autoRollback) @odbc_rollback($this->_connectionID);
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
return $this->_connectionID != false;
}
 
function ServerInfo()
{
if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
$dsn = strtoupper($this->host);
$first = true;
$found = false;
if (!function_exists('odbc_data_source')) return false;
while(true) {
$rez = @odbc_data_source($this->_connectionID,
$first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
$first = false;
if (!is_array($rez)) break;
if (strtoupper($rez['server']) == $dsn) {
$found = true;
break;
}
}
if (!$found) return ADOConnection::ServerInfo();
if (!isset($rez['version'])) $rez['version'] = '';
return $rez;
} else {
return ADOConnection::ServerInfo();
}
}
 
function CreateSequence($seqname='adodbseq',$start=1)
{
if (empty($this->_genSeqSQL)) return false;
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
if (!$ok) return false;
$start -= 1;
return $this->Execute("insert into $seqname values($start)");
}
var $_dropSeqSQL = 'drop table %s';
function DropSequence($seqname)
{
if (empty($this->_dropSeqSQL)) return false;
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
}
/*
This algorithm is not very efficient, but works even if table locking
is not available.
Will return false if unable to generate an ID after $MAXLOOPS attempts.
*/
function GenID($seq='adodbseq',$start=1)
{
// if you have to modify the parameter below, your database is overloaded,
// or you need to implement generation of id's yourself!
$MAXLOOPS = 100;
//$this->debug=1;
while (--$MAXLOOPS>=0) {
$num = $this->GetOne("select id from $seq");
if ($num === false) {
$this->Execute(sprintf($this->_genSeqSQL ,$seq));
$start -= 1;
$num = '0';
$ok = $this->Execute("insert into $seq values($start)");
if (!$ok) return false;
}
$this->Execute("update $seq set id=id+1 where id=$num");
if ($this->affected_rows() > 0) {
$num += 1;
$this->genID = $num;
return $num;
}
}
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
}
return false;
}
 
 
function ErrorMsg()
{
if ($this->_haserrorfunctions) {
if ($this->_errorMsg !== false) return $this->_errorMsg;
if (empty($this->_connectionID)) return @odbc_errormsg();
return @odbc_errormsg($this->_connectionID);
} else return ADOConnection::ErrorMsg();
}
function ErrorNo()
{
if ($this->_haserrorfunctions) {
if ($this->_errorCode !== false) {
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
}
 
if (empty($this->_connectionID)) $e = @odbc_error();
else $e = @odbc_error($this->_connectionID);
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
// so we check and patch
if (strlen($e)<=2) return 0;
return $e;
} else return ADOConnection::ErrorNo();
}
 
function BeginTrans()
{
if (!$this->hasTransactions) return false;
if ($this->transOff) return true;
$this->transCnt += 1;
$this->_autocommit = false;
return odbc_autocommit($this->_connectionID,false);
}
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
if ($this->transCnt) $this->transCnt -= 1;
$this->_autocommit = true;
$ret = odbc_commit($this->_connectionID);
odbc_autocommit($this->_connectionID,true);
return $ret;
}
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->_autocommit = true;
$ret = odbc_rollback($this->_connectionID);
odbc_autocommit($this->_connectionID,true);
return $ret;
}
function MetaPrimaryKeys($table)
{
global $ADODB_FETCH_MODE;
if ($this->uCaseTables) $table = strtoupper($table);
$schema = '';
$this->_findschema($table,$schema);
 
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$qid = @odbc_primarykeys($this->_connectionID,'',$schema,$table);
if (!$qid) {
$ADODB_FETCH_MODE = $savem;
return false;
}
$rs = new ADORecordSet_odbc($qid);
$ADODB_FETCH_MODE = $savem;
if (!$rs) return false;
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
$arr =& $rs->GetArray();
$rs->Close();
//print_r($arr);
$arr2 = array();
for ($i=0; $i < sizeof($arr); $i++) {
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
}
return $arr2;
}
function &MetaTables($ttype=false)
{
global $ADODB_FETCH_MODE;
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$qid = odbc_tables($this->_connectionID);
$rs = new ADORecordSet_odbc($qid);
$ADODB_FETCH_MODE = $savem;
if (!$rs) {
$false = false;
return $false;
}
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
$arr =& $rs->GetArray();
//print_r($arr);
$rs->Close();
$arr2 = array();
if ($ttype) {
$isview = strncmp($ttype,'V',1) === 0;
}
for ($i=0; $i < sizeof($arr); $i++) {
if (!$arr[$i][2]) continue;
$type = $arr[$i][3];
if ($ttype) {
if ($isview) {
if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
}
return $arr2;
}
/*
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp
/ SQL data type codes /
#define SQL_UNKNOWN_TYPE 0
#define SQL_CHAR 1
#define SQL_NUMERIC 2
#define SQL_DECIMAL 3
#define SQL_INTEGER 4
#define SQL_SMALLINT 5
#define SQL_FLOAT 6
#define SQL_REAL 7
#define SQL_DOUBLE 8
#if (ODBCVER >= 0x0300)
#define SQL_DATETIME 9
#endif
#define SQL_VARCHAR 12
 
 
/ One-parameter shortcuts for date/time data types /
#if (ODBCVER >= 0x0300)
#define SQL_TYPE_DATE 91
#define SQL_TYPE_TIME 92
#define SQL_TYPE_TIMESTAMP 93
 
#define SQL_UNICODE (-95)
#define SQL_UNICODE_VARCHAR (-96)
#define SQL_UNICODE_LONGVARCHAR (-97)
*/
function ODBCTypes($t)
{
switch ((integer)$t) {
case 1:
case 12:
case 0:
case -95:
case -96:
return 'C';
case -97:
case -1: //text
return 'X';
case -4: //image
return 'B';
case 9:
case 91:
return 'D';
case 10:
case 11:
case 92:
case 93:
return 'T';
case 4:
case 5:
case -6:
return 'I';
case -11: // uniqidentifier
return 'R';
case -7: //bit
return 'L';
default:
return 'N';
}
}
function &MetaColumns($table)
{
global $ADODB_FETCH_MODE;
$false = false;
if ($this->uCaseTables) $table = strtoupper($table);
$schema = '';
$this->_findschema($table,$schema);
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
/*if (false) { // after testing, confirmed that the following does not work becoz of a bug
$qid2 = odbc_tables($this->_connectionID);
$rs = new ADORecordSet_odbc($qid2);
$ADODB_FETCH_MODE = $savem;
if (!$rs) return false;
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
$rs->_fetch();
while (!$rs->EOF) {
if ($table == strtoupper($rs->fields[2])) {
$q = $rs->fields[0];
$o = $rs->fields[1];
break;
}
$rs->MoveNext();
}
$rs->Close();
$qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%');
} */
switch ($this->databaseType) {
case 'access':
case 'vfp':
$qid = odbc_columns($this->_connectionID);#,'%','',strtoupper($table),'%');
break;
case 'db2':
$colname = "%";
$qid = odbc_columns($this->_connectionID, "", $schema, $table, $colname);
break;
default:
$qid = @odbc_columns($this->_connectionID,'%','%',strtoupper($table),'%');
if (empty($qid)) $qid = odbc_columns($this->_connectionID);
break;
}
if (empty($qid)) return $false;
$rs =& new ADORecordSet_odbc($qid);
$ADODB_FETCH_MODE = $savem;
if (!$rs) return $false;
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
$rs->_fetch();
$retarr = array();
/*
$rs->fields indices
0 TABLE_QUALIFIER
1 TABLE_SCHEM
2 TABLE_NAME
3 COLUMN_NAME
4 DATA_TYPE
5 TYPE_NAME
6 PRECISION
7 LENGTH
8 SCALE
9 RADIX
10 NULLABLE
11 REMARKS
*/
while (!$rs->EOF) {
// adodb_pr($rs->fields);
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
$fld = new ADOFieldObject();
$fld->name = $rs->fields[3];
$fld->type = $this->ODBCTypes($rs->fields[4]);
// ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
// access uses precision to store length for char/varchar
if ($fld->type == 'C' or $fld->type == 'X') {
if ($this->databaseType == 'access')
$fld->max_length = $rs->fields[6];
else if ($rs->fields[4] <= -95) // UNICODE
$fld->max_length = $rs->fields[7]/2;
else
$fld->max_length = $rs->fields[7];
} else
$fld->max_length = $rs->fields[7];
$fld->not_null = !empty($rs->fields[10]);
$fld->scale = $rs->fields[8];
$retarr[strtoupper($fld->name)] = $fld;
} else if (sizeof($retarr)>0)
break;
$rs->MoveNext();
}
$rs->Close(); //-- crashes 4.03pl1 -- why?
if (empty($retarr)) $retarr = false;
return $retarr;
}
function Prepare($sql)
{
if (! $this->_bindInputArray) return $sql; // no binding
$stmt = odbc_prepare($this->_connectionID,$sql);
if (!$stmt) {
// we don't know whether odbc driver is parsing prepared stmts, so just return sql
return $sql;
}
return array($sql,$stmt,false);
}
 
/* returns queryID or false */
function _query($sql,$inputarr=false)
{
GLOBAL $php_errormsg;
if (isset($php_errormsg)) $php_errormsg = '';
$this->_error = '';
if ($inputarr) {
if (is_array($sql)) {
$stmtid = $sql[1];
} else {
$stmtid = odbc_prepare($this->_connectionID,$sql);
if ($stmtid == false) {
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
return false;
}
}
if (! odbc_execute($stmtid,$inputarr)) {
//@odbc_free_result($stmtid);
if ($this->_haserrorfunctions) {
$this->_errorMsg = odbc_errormsg();
$this->_errorCode = odbc_error();
}
return false;
}
} else if (is_array($sql)) {
$stmtid = $sql[1];
if (!odbc_execute($stmtid)) {
//@odbc_free_result($stmtid);
if ($this->_haserrorfunctions) {
$this->_errorMsg = odbc_errormsg();
$this->_errorCode = odbc_error();
}
return false;
}
} else
$stmtid = odbc_exec($this->_connectionID,$sql);
$this->_lastAffectedRows = 0;
if ($stmtid) {
if (@odbc_num_fields($stmtid) == 0) {
$this->_lastAffectedRows = odbc_num_rows($stmtid);
$stmtid = true;
} else {
$this->_lastAffectedRows = 0;
odbc_binmode($stmtid,$this->binmode);
odbc_longreadlen($stmtid,$this->maxblobsize);
}
if ($this->_haserrorfunctions) {
$this->_errorMsg = '';
$this->_errorCode = 0;
} else
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
} else {
if ($this->_haserrorfunctions) {
$this->_errorMsg = odbc_errormsg();
$this->_errorCode = odbc_error();
} else
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
}
return $stmtid;
}
 
/*
Insert a null into the blob field of the table first.
Then use UpdateBlob to store the blob.
Usage:
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
*/
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{
return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
}
// returns true or false
function _close()
{
$ret = @odbc_close($this->_connectionID);
$this->_connectionID = false;
return $ret;
}
 
function _affectedrows()
{
return $this->_lastAffectedRows;
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_odbc extends ADORecordSet {
var $bind = false;
var $databaseType = "odbc";
var $dataProvider = "odbc";
var $useFetchArray;
var $_has_stupid_odbc_fetch_api_change;
function ADORecordSet_odbc($id,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
$this->fetchMode = $mode;
$this->_queryID = $id;
// the following is required for mysql odbc driver in 4.3.1 -- why?
$this->EOF = false;
$this->_currentRow = -1;
//$this->ADORecordSet($id);
}
 
 
// returns the field object
function &FetchField($fieldOffset = -1)
{
$off=$fieldOffset+1; // offsets begin at 1
$o= new ADOFieldObject();
$o->name = @odbc_field_name($this->_queryID,$off);
$o->type = @odbc_field_type($this->_queryID,$off);
$o->max_length = @odbc_field_len($this->_queryID,$off);
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
return $o;
}
/* Use associative array to get fields array */
function Fields($colname)
{
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
 
return $this->fields[$this->bind[strtoupper($colname)]];
}
function _initrs()
{
global $ADODB_COUNTRECS;
$this->_numOfRows = ($ADODB_COUNTRECS) ? @odbc_num_rows($this->_queryID) : -1;
$this->_numOfFields = @odbc_num_fields($this->_queryID);
// some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
if ($this->_numOfRows == 0) $this->_numOfRows = -1;
//$this->useFetchArray = $this->connection->useFetchArray;
$this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
}
function _seek($row)
{
return false;
}
// speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
function &GetArrayLimit($nrows,$offset=-1)
{
if ($offset <= 0) {
$rs =& $this->GetArray($nrows);
return $rs;
}
$savem = $this->fetchMode;
$this->fetchMode = ADODB_FETCH_NUM;
$this->Move($offset);
$this->fetchMode = $savem;
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
}
$results = array();
$cnt = 0;
while (!$this->EOF && $nrows != $cnt) {
$results[$cnt++] = $this->fields;
$this->MoveNext();
}
return $results;
}
function MoveNext()
{
if ($this->_numOfRows != 0 && !$this->EOF) {
$this->_currentRow++;
if ($this->_has_stupid_odbc_fetch_api_change)
$rez = @odbc_fetch_into($this->_queryID,$this->fields);
else {
$row = 0;
$rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
}
if ($rez) {
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
}
return true;
}
}
$this->fields = false;
$this->EOF = true;
return false;
}
function _fetch()
{
 
if ($this->_has_stupid_odbc_fetch_api_change)
$rez = @odbc_fetch_into($this->_queryID,$this->fields);
else {
$row = 0;
$rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
}
if ($rez) {
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
}
return true;
}
$this->fields = false;
return false;
}
function _close()
{
return @odbc_free_result($this->_queryID);
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-odbc_db2.inc.php
0,0 → 1,362
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
DB2 data driver. Requires ODBC.
From phpdb list:
 
Hi Andrew,
 
thanks a lot for your help. Today we discovered what
our real problem was:
 
After "playing" a little bit with the php-scripts that try
to connect to the IBM DB2, we set the optional parameter
Cursortype when calling odbc_pconnect(....).
 
And the exciting thing: When we set the cursor type
to SQL_CUR_USE_ODBC Cursor Type, then
the whole query speed up from 1 till 10 seconds
to 0.2 till 0.3 seconds for 100 records. Amazing!!!
 
Therfore, PHP is just almost fast as calling the DB2
from Servlets using JDBC (don't take too much care
about the speed at whole: the database was on a
completely other location, so the whole connection
was made over a slow network connection).
 
I hope this helps when other encounter the same
problem when trying to connect to DB2 from
PHP.
 
Kind regards,
Christian Szardenings
 
2 Oct 2001
Mark Newnham has discovered that the SQL_CUR_USE_ODBC is not supported by
IBM's DB2 ODBC driver, so this must be a 3rd party ODBC driver.
 
From the IBM CLI Reference:
 
SQL_ATTR_ODBC_CURSORS (DB2 CLI v5)
This connection attribute is defined by ODBC, but is not supported by DB2
CLI. Any attempt to set or get this attribute will result in an SQLSTATE of
HYC00 (Driver not capable).
 
A 32-bit option specifying how the Driver Manager uses the ODBC cursor
library.
 
So I guess this means the message [above] was related to using a 3rd party
odbc driver.
 
Setting SQL_CUR_USE_ODBC
========================
To set SQL_CUR_USE_ODBC for drivers that require it, do this:
 
$db = NewADOConnection('db2');
$db->curMode = SQL_CUR_USE_ODBC;
$db->Connect($dsn, $userid, $pwd);
 
 
 
USING CLI INTERFACE
===================
 
I have had reports that the $host and $database params have to be reversed in
Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu:
 
> The symptom is that if I change the database engine from postgres or any other to DB2 then the following
> connection command becomes wrong despite being described this version to be correct in the docs.
>
> $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME )
>
> In case of DB2 I had to swap the first and last arguments in order to connect properly.
 
 
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('_ADODB_ODBC_LAYER')) {
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
}
if (!defined('ADODB_DB2')){
define('ADODB_DB2',1);
 
class ADODB_DB2 extends ADODB_odbc {
var $databaseType = "db2";
var $concat_operator = '||';
var $sysDate = 'CURRENT_DATE';
var $sysTimeStamp = 'CURRENT TIMESTAMP';
// The complete string representation of a timestamp has the form
// yyyy-mm-dd-hh.mm.ss.nnnnnn.
var $fmtTimeStamp = "'Y-m-d-H.i.s'";
var $ansiOuter = true;
var $identitySQL = 'values IDENTITY_VAL_LOCAL()';
var $_bindInputArray = true;
var $hasInsertID = true;
function ADODB_DB2()
{
if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
$this->ADODB_odbc();
}
function IfNull( $field, $ifNull )
{
return " COALESCE($field, $ifNull) "; // if DB2 UDB
}
function ServerInfo()
{
//odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/);
$vers = $this->GetOne('select versionnumber from sysibm.sysversions');
//odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/);
return array('description'=>'DB2 ODBC driver', 'version'=>$vers);
}
function _insertid()
{
return $this->GetOne($this->identitySQL);
}
function RowLock($tables,$where,$flds='1 as ignore')
{
if ($this->_autocommit) $this->BeginTrans();
return $this->GetOne("select $flds from $tables where $where for update");
}
function &MetaTables($ttype=false,$showSchema=false, $qtable="%", $qschema="%")
{
global $ADODB_FETCH_MODE;
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$qid = odbc_tables($this->_connectionID, "", $qschema, $qtable, "");
$rs = new ADORecordSet_odbc($qid);
$ADODB_FETCH_MODE = $savem;
if (!$rs) {
$false = false;
return $false;
}
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
$arr =& $rs->GetArray();
//print_r($arr);
$rs->Close();
$arr2 = array();
if ($ttype) {
$isview = strncmp($ttype,'V',1) === 0;
}
for ($i=0; $i < sizeof($arr); $i++) {
if (!$arr[$i][2]) continue;
if (strncmp($arr[$i][1],'SYS',3) === 0) continue;
$type = $arr[$i][3];
if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2];
if ($ttype) {
if ($isview) {
if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
} else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2];
} else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2];
}
return $arr2;
}
 
function &MetaIndexes ($table, $primary = FALSE, $owner=false)
{
// save old fetch mode
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
$false = false;
// get index details
$table = strtoupper($table);
$SQL="SELECT NAME, UNIQUERULE, COLNAMES FROM SYSIBM.SYSINDEXES WHERE TBNAME='$table'";
if ($primary)
$SQL.= " AND UNIQUERULE='P'";
$rs = $this->Execute($SQL);
if (!is_object($rs)) {
if (isset($savem))
$this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
return $false;
}
$indexes = array ();
// parse index data into array
while ($row = $rs->FetchRow()) {
$indexes[$row[0]] = array(
'unique' => ($row[1] == 'U' || $row[1] == 'P'),
'columns' => array()
);
$cols = ltrim($row[2],'+');
$indexes[$row[0]]['columns'] = explode('+', $cols);
}
if (isset($savem)) {
$this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
}
return $indexes;
}
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
// use right() and replace() ?
if (!$col) $col = $this->sysDate;
$s = '';
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
if ($s) $s .= '||';
$ch = $fmt[$i];
switch($ch) {
case 'Y':
case 'y':
$s .= "char(year($col))";
break;
case 'M':
$s .= "substr(monthname($col),1,3)";
break;
case 'm':
$s .= "right(digits(month($col)),2)";
break;
case 'D':
case 'd':
$s .= "right(digits(day($col)),2)";
break;
case 'H':
case 'h':
if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
else $s .= "''";
break;
case 'i':
case 'I':
if ($col != $this->sysDate)
$s .= "right(digits(minute($col)),2)";
else $s .= "''";
break;
case 'S':
case 's':
if ($col != $this->sysDate)
$s .= "right(digits(second($col)),2)";
else $s .= "''";
break;
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
$s .= $this->qstr($ch);
}
}
return $s;
}
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false)
{
$nrows = (integer) $nrows;
if ($offset <= 0) {
// could also use " OPTIMIZE FOR $nrows ROWS "
if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY ";
$rs =& $this->Execute($sql,$inputArr);
} else {
if ($offset > 0 && $nrows < 0);
else {
$nrows += $offset;
$sql .= " FETCH FIRST $nrows ROWS ONLY ";
}
$rs =& ADOConnection::SelectLimit($sql,-1,$offset,$inputArr);
}
return $rs;
}
};
 
class ADORecordSet_db2 extends ADORecordSet_odbc {
var $databaseType = "db2";
function ADORecordSet_db2($id,$mode=false)
{
$this->ADORecordSet_odbc($id,$mode);
}
 
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
switch (strtoupper($t)) {
case 'VARCHAR':
case 'CHAR':
case 'CHARACTER':
case 'C':
if ($len <= $this->blobSize) return 'C';
case 'LONGCHAR':
case 'TEXT':
case 'CLOB':
case 'DBCLOB': // double-byte
case 'X':
return 'X';
case 'BLOB':
case 'GRAPHIC':
case 'VARGRAPHIC':
return 'B';
case 'DATE':
case 'D':
return 'D';
case 'TIME':
case 'TIMESTAMP':
case 'T':
return 'T';
//case 'BOOLEAN':
//case 'BIT':
// return 'L';
//case 'COUNTER':
// return 'R';
case 'INT':
case 'INTEGER':
case 'BIGINT':
case 'SMALLINT':
case 'I':
return 'I';
default: return 'N';
}
}
}
 
} //define
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-odbc_mssql.inc.php
0,0 → 1,254
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
MSSQL support via ODBC. Requires ODBC. Works on Windows and Unix.
For Unix configuration, see http://phpbuilder.com/columns/alberto20000919.php3
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('_ADODB_ODBC_LAYER')) {
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
}
 
class ADODB_odbc_mssql extends ADODB_odbc {
var $databaseType = 'odbc_mssql';
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $_bindInputArray = true;
var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE'))";
var $metaColumnsSQL = "select c.name,t.name,c.length from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";
var $hasTop = 'top'; // support mssql/interbase SELECT TOP 10 * FROM TABLE
var $sysDate = 'GetDate()';
var $sysTimeStamp = 'GetDate()';
var $leftOuter = '*=';
var $rightOuter = '=*';
var $substr = 'substring';
var $length = 'len';
var $ansiOuter = true; // for mssql7 or later
var $identitySQL = 'select @@IDENTITY'; // 'select SCOPE_IDENTITY'; # for mssql 2000
var $hasInsertID = true;
var $connectStmt = 'SET CONCAT_NULL_YIELDS_NULL OFF'; # When SET CONCAT_NULL_YIELDS_NULL is ON,
# concatenating a null value with a string yields a NULL result
function ADODB_odbc_mssql()
{
$this->ADODB_odbc();
//$this->curmode = SQL_CUR_USE_ODBC;
}
 
// crashes php...
function ServerInfo()
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$row = $this->GetRow("execute sp_server_info 2");
$ADODB_FETCH_MODE = $save;
if (!is_array($row)) return false;
$arr['description'] = $row[2];
$arr['version'] = ADOConnection::_findvers($arr['description']);
return $arr;
}
 
function IfNull( $field, $ifNull )
{
return " ISNULL($field, $ifNull) "; // if MS SQL Server
}
function _insertid()
{
// SCOPE_IDENTITY()
// Returns the last IDENTITY value inserted into an IDENTITY column in
// the same scope. A scope is a module -- a stored procedure, trigger,
// function, or batch. Thus, two statements are in the same scope if
// they are in the same stored procedure, function, or batch.
return $this->GetOne($this->identitySQL);
}
function MetaForeignKeys($table, $owner=false, $upper=false)
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$table = $this->qstr(strtoupper($table));
$sql =
"select object_name(constid) as constraint_name,
col_name(fkeyid, fkey) as column_name,
object_name(rkeyid) as referenced_table_name,
col_name(rkeyid, rkey) as referenced_column_name
from sysforeignkeys
where upper(object_name(fkeyid)) = $table
order by constraint_name, referenced_table_name, keyno";
$constraints =& $this->GetArray($sql);
$ADODB_FETCH_MODE = $save;
$arr = false;
foreach($constraints as $constr) {
//print_r($constr);
$arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3];
}
if (!$arr) return false;
$arr2 = false;
foreach($arr as $k => $v) {
foreach($v as $a => $b) {
if ($upper) $a = strtoupper($a);
$arr2[$a] = $b;
}
}
return $arr2;
}
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
if ($mask) {$this->debug=1;
$save = $this->metaTablesSQL;
$mask = $this->qstr($mask);
$this->metaTablesSQL .= " AND name like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
if ($mask) {
$this->metaTablesSQL = $save;
}
return $ret;
}
function &MetaColumns($table)
{
$arr = ADOConnection::MetaColumns($table);
return $arr;
}
function _query($sql,$inputarr)
{
if (is_string($sql)) $sql = str_replace('||','+',$sql);
return ADODB_odbc::_query($sql,$inputarr);
}
// "Stein-Aksel Basma" <basma@accelero.no>
// tested with MSSQL 2000
function &MetaPrimaryKeys($table)
{
global $ADODB_FETCH_MODE;
$schema = '';
$this->_findschema($table,$schema);
//if (!$schema) $schema = $this->database;
if ($schema) $schema = "and k.table_catalog like '$schema%'";
$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,
information_schema.table_constraints tc
where tc.constraint_name = k.constraint_name and tc.constraint_type =
'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$a = $this->GetCol($sql);
$ADODB_FETCH_MODE = $savem;
if ($a && sizeof($a)>0) return $a;
$false = false;
return $false;
}
function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
{
if ($nrows > 0 && $offset <= 0) {
$sql = preg_replace(
'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql);
$rs =& $this->Execute($sql,$inputarr);
} else
$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
return $rs;
}
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysTimeStamp;
$s = '';
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
if ($s) $s .= '+';
$ch = $fmt[$i];
switch($ch) {
case 'Y':
case 'y':
$s .= "datename(yyyy,$col)";
break;
case 'M':
$s .= "convert(char(3),$col,0)";
break;
case 'm':
$s .= "replace(str(month($col),2),' ','0')";
break;
case 'Q':
case 'q':
$s .= "datename(quarter,$col)";
break;
case 'D':
case 'd':
$s .= "replace(str(day($col),2),' ','0')";
break;
case 'h':
$s .= "substring(convert(char(14),$col,0),13,2)";
break;
case 'H':
$s .= "replace(str(datepart(hh,$col),2),' ','0')";
break;
case 'i':
$s .= "replace(str(datepart(mi,$col),2),' ','0')";
break;
case 's':
$s .= "replace(str(datepart(ss,$col),2),' ','0')";
break;
case 'a':
case 'A':
$s .= "substring(convert(char(19),$col,0),18,2)";
break;
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
$s .= $this->qstr($ch);
break;
}
}
return $s;
}
 
}
class ADORecordSet_odbc_mssql extends ADORecordSet_odbc {
var $databaseType = 'odbc_mssql';
function ADORecordSet_odbc_mssql($id,$mode=false)
{
return $this->ADORecordSet_odbc($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-odbc_oracle.inc.php
0,0 → 1,115
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Oracle support via ODBC. Requires ODBC. Works on Windows.
*/
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('_ADODB_ODBC_LAYER')) {
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
}
 
class ADODB_odbc_oracle extends ADODB_odbc {
var $databaseType = 'odbc_oracle';
var $replaceQuote = "''"; // string to use to replace quotes
var $concat_operator='||';
var $fmtDate = "'Y-m-d 00:00:00'";
var $fmtTimeStamp = "'Y-m-d h:i:sA'";
var $metaTablesSQL = 'select table_name from cat';
var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno";
var $sysDate = "TRUNC(SYSDATE)";
var $sysTimeStamp = 'SYSDATE';
//var $_bindInputArray = false;
function ADODB_odbc_oracle()
{
$this->ADODB_odbc();
}
function &MetaTables()
{
$false = false;
$rs = $this->Execute($this->metaTablesSQL);
if ($rs === false) return $false;
$arr = $rs->GetArray();
$arr2 = array();
for ($i=0; $i < sizeof($arr); $i++) {
$arr2[] = $arr[$i][0];
}
$rs->Close();
return $arr2;
}
function &MetaColumns($table)
{
global $ADODB_FETCH_MODE;
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
if ($rs === false) {
$false = false;
return $false;
}
$retarr = array();
while (!$rs->EOF) { //print_r($rs->fields);
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$fld->type = $rs->fields[1];
$fld->max_length = $rs->fields[2];
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[strtoupper($fld->name)] = $fld;
$rs->MoveNext();
}
$rs->Close();
return $retarr;
}
 
// returns true or false
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
{
global $php_errormsg;
$php_errormsg = '';
$this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC );
$this->_errorMsg = $php_errormsg;
$this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'");
//if ($this->_connectionID) odbc_autocommit($this->_connectionID,true);
return $this->_connectionID != false;
}
// returns true or false
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
{
global $php_errormsg;
$php_errormsg = '';
$this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC );
$this->_errorMsg = $php_errormsg;
$this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'");
//if ($this->_connectionID) odbc_autocommit($this->_connectionID,true);
return $this->_connectionID != false;
}
}
class ADORecordSet_odbc_oracle extends ADORecordSet_odbc {
var $databaseType = 'odbc_oracle';
function ADORecordSet_odbc_oracle($id,$mode=false)
{
return $this->ADORecordSet_odbc($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-odbtp.inc.php
0,0 → 1,732
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
*/
// Code contributed by "stefan bogdan" <sbogdan#rsb.ro>
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
define("_ADODB_ODBTP_LAYER", 2 );
 
class ADODB_odbtp extends ADOConnection{
var $databaseType = "odbtp";
var $dataProvider = "odbtp";
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
var $replaceQuote = "''"; // string to use to replace quotes
var $odbc_driver = 0;
var $hasAffectedRows = true;
var $hasInsertID = false;
var $hasGenID = true;
var $hasMoveFirst = true;
 
var $_genSeqSQL = "create table %s (seq_name char(30) not null unique , seq_value integer not null)";
var $_dropSeqSQL = "delete from adodb_seq where seq_name = '%s'";
var $_bindInputArray = false;
var $_useUnicodeSQL = false;
var $_canPrepareSP = false;
var $_dontPoolDBC = true;
 
function ADODB_odbtp()
{
}
 
function ServerInfo()
{
return array('description' => @odbtp_get_attr( ODB_ATTR_DBMSNAME, $this->_connectionID),
'version' => @odbtp_get_attr( ODB_ATTR_DBMSVER, $this->_connectionID));
}
 
function ErrorMsg()
{
if (empty($this->_connectionID)) return @odbtp_last_error();
return @odbtp_last_error($this->_connectionID);
}
 
function ErrorNo()
{
if (empty($this->_connectionID)) return @odbtp_last_error_state();
return @odbtp_last_error_state($this->_connectionID);
}
 
function _insertid()
{
// SCOPE_IDENTITY()
// Returns the last IDENTITY value inserted into an IDENTITY column in
// the same scope. A scope is a module -- a stored procedure, trigger,
// function, or batch. Thus, two statements are in the same scope if
// they are in the same stored procedure, function, or batch.
return $this->GetOne($this->identitySQL);
}
 
function _affectedrows()
{
if ($this->_queryID) {
return @odbtp_affected_rows ($this->_queryID);
} else
return 0;
}
 
function CreateSequence($seqname='adodbseq',$start=1)
{
//verify existence
$num = $this->GetOne("select seq_value from adodb_seq");
$seqtab='adodb_seq';
if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) {
$path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID );
//if using vfp dbc file
if( !strcasecmp(strrchr($path, '.'), '.dbc') )
$path = substr($path,0,strrpos($path,'\/'));
$seqtab = $path . '/' . $seqtab;
}
if($num == false) {
if (empty($this->_genSeqSQL)) return false;
$ok = $this->Execute(sprintf($this->_genSeqSQL ,$seqtab));
}
$num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seqname'");
if ($num) {
return false;
}
$start -= 1;
return $this->Execute("insert into adodb_seq values('$seqname',$start)");
}
 
function DropSequence($seqname)
{
if (empty($this->_dropSeqSQL)) return false;
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
}
 
function GenID($seq='adodbseq',$start=1)
{
$seqtab='adodb_seq';
if( $this->odbc_driver == ODB_DRIVER_FOXPRO) {
$path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID );
//if using vfp dbc file
if( !strcasecmp(strrchr($path, '.'), '.dbc') )
$path = substr($path,0,strrpos($path,'\/'));
$seqtab = $path . '/' . $seqtab;
}
$MAXLOOPS = 100;
while (--$MAXLOOPS>=0) {
$num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seq'");
if ($num === false) {
//verify if abodb_seq table exist
$ok = $this->GetOne("select seq_value from adodb_seq ");
if(!$ok) {
//creating the sequence table adodb_seq
$this->Execute(sprintf($this->_genSeqSQL ,$seqtab));
}
$start -= 1;
$num = '0';
$ok = $this->Execute("insert into adodb_seq values('$seq',$start)");
if (!$ok) return false;
}
$ok = $this->Execute("update adodb_seq set seq_value=seq_value+1 where seq_name='$seq'");
if($ok) {
$num += 1;
$this->genID = $num;
return $num;
}
}
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
}
return false;
}
 
//example for $UserOrDSN
//for visual fox : DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBF;SOURCEDB=c:\YourDbfFileDir;EXCLUSIVE=NO;
//for visual fox dbc: DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBC;SOURCEDB=c:\YourDbcFileDir\mydb.dbc;EXCLUSIVE=NO;
//for access : DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\path_to_access_db\base_test.mdb;UID=root;PWD=;
//for mssql : DRIVER={SQL Server};SERVER=myserver;UID=myuid;PWD=mypwd;DATABASE=OdbtpTest;
//if uid & pwd can be separate
function _connect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='')
{
$this->_connectionID = @odbtp_connect($HostOrInterface,$UserOrDSN,$argPassword,$argDatabase);
if ($this->_connectionID === false) {
$this->_errorMsg = $this->ErrorMsg() ;
return false;
}
if ($this->_dontPoolDBC) {
if (function_exists('odbtp_dont_pool_dbc'))
@odbtp_dont_pool_dbc($this->_connectionID);
}
else {
$this->_dontPoolDBC = true;
}
$this->odbc_driver = @odbtp_get_attr(ODB_ATTR_DRIVER, $this->_connectionID);
$dbms = strtolower(@odbtp_get_attr(ODB_ATTR_DBMSNAME, $this->_connectionID));
$this->odbc_name = $dbms;
// Account for inconsistent DBMS names
if( $this->odbc_driver == ODB_DRIVER_ORACLE )
$dbms = 'oracle';
else if( $this->odbc_driver == ODB_DRIVER_SYBASE )
$dbms = 'sybase';
 
// Set DBMS specific attributes
switch( $dbms ) {
case 'microsoft sql server':
$this->databaseType = 'odbtp_mssql';
$this->fmtDate = "'Y-m-d'";
$this->fmtTimeStamp = "'Y-m-d h:i:sA'";
$this->sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
$this->sysTimeStamp = 'GetDate()';
$this->ansiOuter = true;
$this->leftOuter = '*=';
$this->rightOuter = '=*';
$this->hasTop = 'top';
$this->hasInsertID = true;
$this->hasTransactions = true;
$this->_bindInputArray = true;
$this->_canSelectDb = true;
$this->substr = "substring";
$this->length = 'len';
$this->identitySQL = 'select @@IDENTITY';
$this->metaDatabasesSQL = "select name from master..sysdatabases where name <> 'master'";
$this->_canPrepareSP = true;
break;
case 'access':
$this->databaseType = 'odbtp_access';
$this->fmtDate = "#Y-m-d#";
$this->fmtTimeStamp = "#Y-m-d h:i:sA#";
$this->sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
$this->sysTimeStamp = 'NOW';
$this->hasTop = 'top';
$this->hasTransactions = false;
$this->_canPrepareSP = true; // For MS Access only.
break;
case 'visual foxpro':
$this->databaseType = 'odbtp_vfp';
$this->fmtDate = "{^Y-m-d}";
$this->fmtTimeStamp = "{^Y-m-d, h:i:sA}";
$this->sysDate = 'date()';
$this->sysTimeStamp = 'datetime()';
$this->ansiOuter = true;
$this->hasTop = 'top';
$this->hasTransactions = false;
$this->replaceQuote = "'+chr(39)+'";
$this->true = '.T.';
$this->false = '.F.';
break;
case 'oracle':
$this->databaseType = 'odbtp_oci8';
$this->fmtDate = "'Y-m-d 00:00:00'";
$this->fmtTimeStamp = "'Y-m-d h:i:sA'";
$this->sysDate = 'TRUNC(SYSDATE)';
$this->sysTimeStamp = 'SYSDATE';
$this->hasTransactions = true;
$this->_bindInputArray = true;
$this->concat_operator = '||';
break;
case 'sybase':
$this->databaseType = 'odbtp_sybase';
$this->fmtDate = "'Y-m-d'";
$this->fmtTimeStamp = "'Y-m-d H:i:s'";
$this->sysDate = 'GetDate()';
$this->sysTimeStamp = 'GetDate()';
$this->leftOuter = '*=';
$this->rightOuter = '=*';
$this->hasInsertID = true;
$this->hasTransactions = true;
$this->identitySQL = 'select @@IDENTITY';
break;
default:
$this->databaseType = 'odbtp';
if( @odbtp_get_attr(ODB_ATTR_TXNCAPABLE, $this->_connectionID) )
$this->hasTransactions = true;
else
$this->hasTransactions = false;
}
@odbtp_set_attr(ODB_ATTR_FULLCOLINFO, TRUE, $this->_connectionID );
 
if ($this->_useUnicodeSQL )
@odbtp_set_attr(ODB_ATTR_UNICODESQL, TRUE, $this->_connectionID);
 
return true;
}
 
function _pconnect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='')
{
$this->_dontPoolDBC = false;
return $this->_connect($HostOrInterface, $UserOrDSN, $argPassword, $argDatabase);
}
 
function SelectDB($dbName)
{
if (!@odbtp_select_db($dbName, $this->_connectionID)) {
return false;
}
$this->database = $dbName;
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
return true;
}
function &MetaTables($ttype='',$showSchema=false,$mask=false)
{
global $ADODB_FETCH_MODE;
 
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false);
$arr =& $this->GetArray("||SQLTables||||$ttype");
if (isset($savefm)) $this->SetFetchMode($savefm);
$ADODB_FETCH_MODE = $savem;
 
$arr2 = array();
for ($i=0; $i < sizeof($arr); $i++) {
if ($arr[$i][3] == 'SYSTEM TABLE' ) continue;
if ($arr[$i][2])
$arr2[] = $showSchema ? $arr[$i][1].'.'.$arr[$i][2] : $arr[$i][2];
}
return $arr2;
}
function &MetaColumns($table,$upper=true)
{
global $ADODB_FETCH_MODE;
 
$schema = false;
$this->_findschema($table,$schema);
if ($upper) $table = strtoupper($table);
 
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false);
$rs = $this->Execute( "||SQLColumns||$schema|$table" );
if (isset($savefm)) $this->SetFetchMode($savefm);
$ADODB_FETCH_MODE = $savem;
 
if (!$rs || $rs->EOF) {
$false = false;
return $false;
}
$retarr = array();
while (!$rs->EOF) {
//print_r($rs->fields);
if (strtoupper($rs->fields[2]) == $table) {
$fld = new ADOFieldObject();
$fld->name = $rs->fields[3];
$fld->type = $rs->fields[5];
$fld->max_length = $rs->fields[6];
$fld->not_null = !empty($rs->fields[9]);
$fld->scale = $rs->fields[7];
if (!is_null($rs->fields[12])) {
$fld->has_default = true;
$fld->default_value = $rs->fields[12];
}
$retarr[strtoupper($fld->name)] = $fld;
} else if (!empty($retarr))
break;
$rs->MoveNext();
}
$rs->Close();
 
return $retarr;
}
 
function &MetaPrimaryKeys($table, $owner='')
{
global $ADODB_FETCH_MODE;
 
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$arr =& $this->GetArray("||SQLPrimaryKeys||$owner|$table");
$ADODB_FETCH_MODE = $savem;
 
//print_r($arr);
$arr2 = array();
for ($i=0; $i < sizeof($arr); $i++) {
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
}
return $arr2;
}
 
function &MetaForeignKeys($table, $owner='', $upper=false)
{
global $ADODB_FETCH_MODE;
 
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$constraints =& $this->GetArray("||SQLForeignKeys|||||$owner|$table");
$ADODB_FETCH_MODE = $savem;
 
$arr = false;
foreach($constraints as $constr) {
//print_r($constr);
$arr[$constr[11]][$constr[2]][] = $constr[7].'='.$constr[3];
}
if (!$arr) {
$false = false;
return $false;
}
$arr2 = array();
 
foreach($arr as $k => $v) {
foreach($v as $a => $b) {
if ($upper) $a = strtoupper($a);
$arr2[$a] = $b;
}
}
return $arr2;
}
 
function BeginTrans()
{
if (!$this->hasTransactions) return false;
if ($this->transOff) return true;
$this->transCnt += 1;
$this->autoCommit = false;
if (defined('ODB_TXN_DEFAULT'))
$txn = ODB_TXN_DEFAULT;
else
$txn = ODB_TXN_READUNCOMMITTED;
$rs = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS,$txn,$this->_connectionID);
if(!$rs) return false;
return true;
}
 
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
if ($this->transCnt) $this->transCnt -= 1;
$this->autoCommit = true;
if( ($ret = @odbtp_commit($this->_connectionID)) )
$ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off
return $ret;
}
 
function RollbackTrans()
{
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->autoCommit = true;
if( ($ret = @odbtp_rollback($this->_connectionID)) )
$ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off
return $ret;
}
 
function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
{
// TOP requires ORDER BY for Visual FoxPro
if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) {
if (!preg_match('/ORDER[ \t\r\n]+BY/is',$sql)) $sql .= ' ORDER BY 1';
}
$ret =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
return $ret;
}
 
function Prepare($sql)
{
if (! $this->_bindInputArray) return $sql; // no binding
$stmt = @odbtp_prepare($sql,$this->_connectionID);
if (!$stmt) {
// print "Prepare Error for ($sql) ".$this->ErrorMsg()."<br>";
return $sql;
}
return array($sql,$stmt,false);
}
 
function PrepareSP($sql)
{
if (!$this->_canPrepareSP) return $sql; // Can't prepare procedures
 
$stmt = @odbtp_prepare_proc($sql,$this->_connectionID);
if (!$stmt) return false;
return array($sql,$stmt);
}
 
/*
Usage:
$stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group
 
# note that the parameter does not have @ in front!
$db->Parameter($stmt,$id,'myid');
$db->Parameter($stmt,$group,'group',false,64);
$db->Parameter($stmt,$group,'photo',false,100000,ODB_BINARY);
$db->Execute($stmt);
 
@param $stmt Statement returned by Prepare() or PrepareSP().
@param $var PHP variable to bind to. Can set to null (for isNull support).
@param $name Name of stored procedure variable name to bind to.
@param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in odbtp.
@param [$maxLen] Holds an maximum length of the variable.
@param [$type] The data type of $var. Legal values depend on driver.
 
See odbtp_attach_param documentation at http://odbtp.sourceforge.net.
*/
function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=0, $type=0)
{
if ( $this->odbc_driver == ODB_DRIVER_JET ) {
$name = '['.$name.']';
if( !$type && $this->_useUnicodeSQL
&& @odbtp_param_bindtype($stmt[1], $name) == ODB_CHAR )
{
$type = ODB_WCHAR;
}
}
else {
$name = '@'.$name;
}
return @odbtp_attach_param($stmt[1], $name, $var, $type, $maxLen);
}
 
/*
Insert a null into the blob field of the table first.
Then use UpdateBlob to store the blob.
 
Usage:
 
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
*/
 
function UpdateBlob($table,$column,$val,$where,$blobtype='image')
{
$sql = "UPDATE $table SET $column = ? WHERE $where";
if( !($stmt = @odbtp_prepare($sql, $this->_connectionID)) )
return false;
if( !@odbtp_input( $stmt, 1, ODB_BINARY, 1000000, $blobtype ) )
return false;
if( !@odbtp_set( $stmt, 1, $val ) )
return false;
return @odbtp_execute( $stmt ) != false;
}
 
function IfNull( $field, $ifNull )
{
switch( $this->odbc_driver ) {
case ODB_DRIVER_MSSQL:
return " ISNULL($field, $ifNull) ";
case ODB_DRIVER_JET:
return " IIF(IsNull($field), $ifNull, $field) ";
}
return " CASE WHEN $field is null THEN $ifNull ELSE $field END ";
}
 
function _query($sql,$inputarr=false)
{
global $php_errormsg;
if ($inputarr) {
if (is_array($sql)) {
$stmtid = $sql[1];
} else {
$stmtid = @odbtp_prepare($sql,$this->_connectionID);
if ($stmtid == false) {
$this->_errorMsg = $php_errormsg;
return false;
}
}
$num_params = @odbtp_num_params( $stmtid );
for( $param = 1; $param <= $num_params; $param++ ) {
@odbtp_input( $stmtid, $param );
@odbtp_set( $stmtid, $param, $inputarr[$param-1] );
}
if (!@odbtp_execute($stmtid) ) {
return false;
}
} else if (is_array($sql)) {
$stmtid = $sql[1];
if (!@odbtp_execute($stmtid)) {
return false;
}
} else {
$stmtid = @odbtp_query($sql,$this->_connectionID);
}
$this->_lastAffectedRows = 0;
if ($stmtid) {
$this->_lastAffectedRows = @odbtp_affected_rows($stmtid);
}
return $stmtid;
}
 
function _close()
{
$ret = @odbtp_close($this->_connectionID);
$this->_connectionID = false;
return $ret;
}
}
 
class ADORecordSet_odbtp extends ADORecordSet {
 
var $databaseType = 'odbtp';
var $canSeek = true;
 
function ADORecordSet_odbtp($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
$this->fetchMode = $mode;
$this->ADORecordSet($queryID);
}
 
function _initrs()
{
$this->_numOfFields = @odbtp_num_fields($this->_queryID);
if (!($this->_numOfRows = @odbtp_num_rows($this->_queryID)))
$this->_numOfRows = -1;
 
if (!$this->connection->_useUnicodeSQL) return;
 
if ($this->connection->odbc_driver == ODB_DRIVER_JET) {
if (!@odbtp_get_attr(ODB_ATTR_MAPCHARTOWCHAR,
$this->connection->_connectionID))
{
for ($f = 0; $f < $this->_numOfFields; $f++) {
if (@odbtp_field_bindtype($this->_queryID, $f) == ODB_CHAR)
@odbtp_bind_field($this->_queryID, $f, ODB_WCHAR);
}
}
}
}
 
function &FetchField($fieldOffset = 0)
{
$off=$fieldOffset; // offsets begin at 0
$o= new ADOFieldObject();
$o->name = @odbtp_field_name($this->_queryID,$off);
$o->type = @odbtp_field_type($this->_queryID,$off);
$o->max_length = @odbtp_field_length($this->_queryID,$off);
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
return $o;
}
 
function _seek($row)
{
return @odbtp_data_seek($this->_queryID, $row);
}
 
function fields($colname)
{
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
 
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$name = @odbtp_field_name( $this->_queryID, $i );
$this->bind[strtoupper($name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
 
function _fetch_odbtp($type=0)
{
switch ($this->fetchMode) {
case ADODB_FETCH_NUM:
$this->fields = @odbtp_fetch_row($this->_queryID, $type);
break;
case ADODB_FETCH_ASSOC:
$this->fields = @odbtp_fetch_assoc($this->_queryID, $type);
break;
default:
$this->fields = @odbtp_fetch_array($this->_queryID, $type);
}
return is_array($this->fields);
}
 
function _fetch()
{
return $this->_fetch_odbtp();
}
 
function MoveFirst()
{
if (!$this->_fetch_odbtp(ODB_FETCH_FIRST)) return false;
$this->EOF = false;
$this->_currentRow = 0;
return true;
}
 
function MoveLast()
{
if (!$this->_fetch_odbtp(ODB_FETCH_LAST)) return false;
$this->EOF = false;
$this->_currentRow = $this->_numOfRows - 1;
return true;
}
 
function NextRecordSet()
{
if (!@odbtp_next_result($this->_queryID)) return false;
$this->_inited = false;
$this->bind = false;
$this->_currentRow = -1;
$this->Init();
return true;
}
 
function _close()
{
return @odbtp_free_query($this->_queryID);
}
}
 
class ADORecordSet_odbtp_mssql extends ADORecordSet_odbtp {
 
var $databaseType = 'odbtp_mssql';
 
function ADORecordSet_odbtp_mssql($id,$mode=false)
{
return $this->ADORecordSet_odbtp($id,$mode);
}
}
 
class ADORecordSet_odbtp_access extends ADORecordSet_odbtp {
 
var $databaseType = 'odbtp_access';
 
function ADORecordSet_odbtp_access($id,$mode=false)
{
return $this->ADORecordSet_odbtp($id,$mode);
}
}
 
class ADORecordSet_odbtp_vfp extends ADORecordSet_odbtp {
 
var $databaseType = 'odbtp_vfp';
 
function ADORecordSet_odbtp_vfp($id,$mode=false)
{
return $this->ADORecordSet_odbtp($id,$mode);
}
}
 
class ADORecordSet_odbtp_oci8 extends ADORecordSet_odbtp {
 
var $databaseType = 'odbtp_oci8';
 
function ADORecordSet_odbtp_oci8($id,$mode=false)
{
return $this->ADORecordSet_odbtp($id,$mode);
}
}
 
class ADORecordSet_odbtp_sybase extends ADORecordSet_odbtp {
 
var $databaseType = 'odbtp_sybase';
 
function ADORecordSet_odbtp_sybase($id,$mode=false)
{
return $this->ADORecordSet_odbtp($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-odbtp_unicode.inc.php
0,0 → 1,39
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
*/
 
// Code contributed by "Robert Twitty" <rtwitty#neutron.ushmm.org>
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
/*
Because the ODBTP server sends and reads UNICODE text data using UTF-8
encoding, the following HTML meta tag must be included within the HTML
head section of every HTML form and script page:
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 
Also, all SQL query strings must be submitted as UTF-8 encoded text.
*/
 
if (!defined('_ADODB_ODBTP_LAYER')) {
include(ADODB_DIR."/drivers/adodb-odbtp.inc.php");
}
 
class ADODB_odbtp_unicode extends ADODB_odbtp {
var $databaseType = 'odbtp';
var $_useUnicodeSQL = true;
 
function ADODB_odbtp_unicode()
{
$this->ADODB_odbtp();
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-oracle.inc.php
0,0 → 1,320
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
 
Latest version is available at http://adodb.sourceforge.net
Oracle data driver. Requires Oracle client. Works on Windows and Unix and Oracle 7.
If you are using Oracle 8 or later, use the oci8 driver which is much better and more reliable.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB_oracle extends ADOConnection {
var $databaseType = "oracle";
var $replaceQuote = "''"; // string to use to replace quotes
var $concat_operator='||';
var $_curs;
var $_initdate = true; // init date to YYYY-MM-DD
var $metaTablesSQL = 'select table_name from cat';
var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno";
var $sysDate = "TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')";
var $sysTimeStamp = 'SYSDATE';
var $connectSID = true;
function ADODB_oracle()
{
}
 
// format and return date string in database date format
function DBDate($d)
{
if (is_string($d)) $d = ADORecordSet::UnixDate($d);
return 'TO_DATE('.adodb_date($this->fmtDate,$d).",'YYYY-MM-DD')";
}
// format and return date string in database timestamp format
function DBTimeStamp($ts)
{
 
if (is_string($ts)) $d = ADORecordSet::UnixTimeStamp($ts);
return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'RRRR-MM-DD, HH:MI:SS AM')";
}
 
function BeginTrans()
{
$this->autoCommit = false;
ora_commitoff($this->_connectionID);
return true;
}
 
function CommitTrans($ok=true)
{
if (!$ok) return $this->RollbackTrans();
$ret = ora_commit($this->_connectionID);
ora_commiton($this->_connectionID);
return $ret;
}
 
function RollbackTrans()
{
$ret = ora_rollback($this->_connectionID);
ora_commiton($this->_connectionID);
return $ret;
}
 
 
/* there seems to be a bug in the oracle extension -- always returns ORA-00000 - no error */
function ErrorMsg()
{
if ($this->_errorMsg !== false) return $this->_errorMsg;
 
if (is_resource($this->_curs)) $this->_errorMsg = @ora_error($this->_curs);
if (empty($this->_errorMsg)) $this->_errorMsg = @ora_error($this->_connectionID);
return $this->_errorMsg;
}
 
function ErrorNo()
{
if ($this->_errorCode !== false) return $this->_errorCode;
 
if (is_resource($this->_curs)) $this->_errorCode = @ora_errorcode($this->_curs);
if (empty($this->_errorCode)) $this->_errorCode = @ora_errorcode($this->_connectionID);
return $this->_errorCode;
}
 
 
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0)
{
if (!function_exists('ora_plogon')) return null;
// <G. Giunta 2003/03/03/> Reset error messages before connecting
$this->_errorMsg = false;
$this->_errorCode = false;
// G. Giunta 2003/08/13 - This looks danegrously suspicious: why should we want to set
// the oracle home to the host name of remote DB?
// if ($argHostname) putenv("ORACLE_HOME=$argHostname");
 
if($argHostname) { // code copied from version submitted for oci8 by Jorma Tuomainen <jorma.tuomainen@ppoy.fi>
if (empty($argDatabasename)) $argDatabasename = $argHostname;
else {
if(strpos($argHostname,":")) {
$argHostinfo=explode(":",$argHostname);
$argHostname=$argHostinfo[0];
$argHostport=$argHostinfo[1];
} else {
$argHostport="1521";
}
 
 
if ($this->connectSID) {
$argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
.")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))";
} else
$argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
.")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))";
}
 
}
 
if ($argDatabasename) $argUsername .= "@$argDatabasename";
 
//if ($argHostname) print "<p>Connect: 1st argument should be left blank for $this->databaseType</p>";
if ($mode = 1)
$this->_connectionID = ora_plogon($argUsername,$argPassword);
else
$this->_connectionID = ora_logon($argUsername,$argPassword);
if ($this->_connectionID === false) return false;
if ($this->autoCommit) ora_commiton($this->_connectionID);
if ($this->_initdate) {
$rs = $this->_query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'");
if ($rs) ora_close($rs);
}
 
return true;
}
 
 
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, 1);
}
 
 
// returns query ID if successful, otherwise false
function _query($sql,$inputarr=false)
{
// <G. Giunta 2003/03/03/> Reset error messages before executing
$this->_errorMsg = false;
$this->_errorCode = false;
 
$curs = ora_open($this->_connectionID);
if ($curs === false) return false;
$this->_curs = $curs;
if (!ora_parse($curs,$sql)) return false;
if (ora_exec($curs)) return $curs;
// <G. Giunta 2004/03/03> before we close the cursor, we have to store the error message
// that we can obtain ONLY from the cursor (and not from the connection)
$this->_errorCode = @ora_errorcode($curs);
$this->_errorMsg = @ora_error($curs);
// </G. Giunta 2004/03/03>
@ora_close($curs);
return false;
}
 
 
// returns true or false
function _close()
{
return @ora_logoff($this->_connectionID);
}
 
 
 
}
 
 
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordset_oracle extends ADORecordSet {
 
var $databaseType = "oracle";
var $bind = false;
 
function ADORecordset_oracle($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
$this->fetchMode = $mode;
$this->_queryID = $queryID;
$this->_inited = true;
$this->fields = array();
if ($queryID) {
$this->_currentRow = 0;
$this->EOF = !$this->_fetch();
@$this->_initrs();
} else {
$this->_numOfRows = 0;
$this->_numOfFields = 0;
$this->EOF = true;
}
return $this->_queryID;
}
 
 
 
/* Returns: an object containing field information.
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
fetchField() is retrieved. */
 
function &FetchField($fieldOffset = -1)
{
$fld = new ADOFieldObject;
$fld->name = ora_columnname($this->_queryID, $fieldOffset);
$fld->type = ora_columntype($this->_queryID, $fieldOffset);
$fld->max_length = ora_columnsize($this->_queryID, $fieldOffset);
return $fld;
}
 
/* Use associative array to get fields array */
function Fields($colname)
{
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
function _initrs()
{
$this->_numOfRows = -1;
$this->_numOfFields = @ora_numcols($this->_queryID);
}
 
 
function _seek($row)
{
return false;
}
 
function _fetch($ignore_fields=false) {
// should remove call by reference, but ora_fetch_into requires it in 4.0.3pl1
if ($this->fetchMode & ADODB_FETCH_ASSOC)
return @ora_fetch_into($this->_queryID,&$this->fields,ORA_FETCHINTO_NULLS|ORA_FETCHINTO_ASSOC);
else
return @ora_fetch_into($this->_queryID,&$this->fields,ORA_FETCHINTO_NULLS);
}
 
/* close() only needs to be called if you are worried about using too much memory while your script
is running. All associated result memory for the specified result identifier will automatically be freed. */
 
function _close()
{
return @ora_close($this->_queryID);
}
 
function MetaType($t,$len=-1)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
switch (strtoupper($t)) {
case 'VARCHAR':
case 'VARCHAR2':
case 'CHAR':
case 'VARBINARY':
case 'BINARY':
if ($len <= $this->blobSize) return 'C';
case 'LONG':
case 'LONG VARCHAR':
case 'CLOB':
return 'X';
case 'LONG RAW':
case 'LONG VARBINARY':
case 'BLOB':
return 'B';
case 'DATE': return 'D';
//case 'T': return 'T';
case 'BIT': return 'L';
case 'INT':
case 'SMALLINT':
case 'INTEGER': return 'I';
default: return 'N';
}
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-pdo.inc.php
0,0 → 1,562
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Requires ODBC. Works on Windows and Unix.
 
Problems:
Where is float/decimal type in pdo_param_type
LOB handling for CLOB/BLOB differs significantly
*/
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
 
/*
enum pdo_param_type {
PDO::PARAM_NULL, 0
 
/* int as in long (the php native int type).
* If you mark a column as an int, PDO expects get_col to return
* a pointer to a long
PDO::PARAM_INT, 1
 
/* get_col ptr should point to start of the string buffer
PDO::PARAM_STR, 2
 
/* get_col: when len is 0 ptr should point to a php_stream *,
* otherwise it should behave like a string. Indicate a NULL field
* value by setting the ptr to NULL
PDO::PARAM_LOB, 3
 
/* get_col: will expect the ptr to point to a new PDOStatement object handle,
* but this isn't wired up yet
PDO::PARAM_STMT, 4 /* hierarchical result set
 
/* get_col ptr should point to a zend_bool
PDO::PARAM_BOOL, 5
 
 
/* magic flag to denote a parameter as being input/output
PDO::PARAM_INPUT_OUTPUT = 0x80000000
};
*/
function adodb_pdo_type($t)
{
switch($t) {
case 2: return 'VARCHAR';
case 3: return 'BLOB';
default: return 'NUMERIC';
}
}
/*--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------*/
 
////////////////////////////////////////////////
 
 
 
class ADODB_pdo_base extends ADODB_pdo {
 
var $sysDate = "'?'";
var $sysTimeStamp = "'?'";
 
function _init($parentDriver)
{
$parentDriver->_bindInputArray = true;
#$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
}
function ServerInfo()
{
return ADOConnection::ServerInfo();
}
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
{
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
return $ret;
}
function MetaTables()
{
return false;
}
function MetaColumns()
{
return false;
}
}
 
 
class ADODB_pdo extends ADOConnection {
var $databaseType = "pdo";
var $dataProvider = "pdo";
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
var $replaceQuote = "''"; // string to use to replace quotes
var $hasAffectedRows = true;
var $_bindInputArray = true;
var $_genSeqSQL = "create table %s (id integer)";
var $_autocommit = true;
var $_haserrorfunctions = true;
var $_lastAffectedRows = 0;
var $_errormsg = false;
var $_errorno = false;
var $dsnType = '';
var $stmt = false;
function ADODB_pdo()
{
}
function _UpdatePDO()
{
$d = &$this->_driver;
$this->fmtDate = $d->fmtDate;
$this->fmtTimeStamp = $d->fmtTimeStamp;
$this->replaceQuote = $d->replaceQuote;
$this->sysDate = $d->sysDate;
$this->sysTimeStamp = $d->sysTimeStamp;
$this->random = $d->random;
$this->concat_operator = $d->concat_operator;
$this->nameQuote = $d->nameQuote;
$d->_init($this);
}
function Time()
{
if (!empty($this->_driver->_hasdual)) $sql = "select $this->sysTimeStamp from dual";
else $sql = "select $this->sysTimeStamp";
$rs =& $this->_Execute($sql);
if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
return false;
}
// returns true or false
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false)
{
$at = strpos($argDSN,':');
$this->dsnType = substr($argDSN,0,$at);
 
if ($argDatabasename) {
$argDSN .= ';dbname='.$argDatabasename;
}
try {
$this->_connectionID = new PDO($argDSN, $argUsername, $argPassword);
} catch (Exception $e) {
$this->_connectionID = false;
$this->_errorno = -1;
//var_dump($e);
$this->_errormsg = 'Connection attempt failed: '.$e->getMessage();
return false;
}
if ($this->_connectionID) {
switch(ADODB_ASSOC_CASE){
case 0: $m = PDO::CASE_LOWER; break;
case 1: $m = PDO::CASE_UPPER; break;
default:
case 2: $m = PDO::CASE_NATURAL; break;
}
//$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT );
$this->_connectionID->setAttribute(PDO::ATTR_CASE,$m);
$class = 'ADODB_pdo_'.$this->dsnType;
//$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
switch($this->dsnType) {
case 'oci':
case 'mysql':
case 'pgsql':
case 'mssql':
include_once(ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php');
break;
}
if (class_exists($class))
$this->_driver = new $class();
else
$this->_driver = new ADODB_pdo_base();
$this->_driver->_connectionID = $this->_connectionID;
$this->_UpdatePDO();
return true;
}
$this->_driver = new ADODB_pdo_base();
return false;
}
// returns true or false
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true);
}
/*------------------------------------------------------------------------------*/
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
{
$save = $this->_driver->fetchMode;
$this->_driver->fetchMode = $this->fetchMode;
$this->_driver->debug = $this->debug;
$ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
$this->_driver->fetchMode = $save;
return $ret;
}
function ServerInfo()
{
return $this->_driver->ServerInfo();
}
function MetaTables($ttype=false,$showSchema=false,$mask=false)
{
return $this->_driver->MetaTables($ttype,$showSchema,$mask);
}
function MetaColumns($table,$normalize=true)
{
return $this->_driver->MetaColumns($table,$normalize);
}
function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
{
$obj = $stmt[1];
if ($type) $obj->bindParam($name,$var,$type,$maxLen);
else $obj->bindParam($name, $var);
}
function ErrorMsg()
{
if ($this->_errormsg !== false) return $this->_errormsg;
if (!empty($this->_stmt)) $arr = $this->_stmt->errorInfo();
else if (!empty($this->_connectionID)) $arr = $this->_connectionID->errorInfo();
else return 'No Connection Established';
if ($arr) {
if (sizeof($arr)<2) return '';
if ((integer)$arr[1]) return $arr[2];
else return '';
} else return '-1';
}
 
function ErrorNo()
{
if ($this->_errorno !== false) return $this->_errorno;
if (!empty($this->_stmt)) $err = $this->_stmt->errorCode();
else if (!empty($this->_connectionID)) {
$arr = $this->_connectionID->errorInfo();
if (isset($arr[0])) $err = $arr[0];
else $err = -1;
} else
return 0;
if ($err == '00000') return 0; // allows empty check
return $err;
}
 
function BeginTrans()
{
if (!$this->hasTransactions) return false;
if ($this->transOff) return true;
$this->transCnt += 1;
$this->_autocommit = false;
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,false);
return $this->_connectionID->beginTransaction();
}
function CommitTrans($ok=true)
{
if (!$this->hasTransactions) return false;
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
if ($this->transCnt) $this->transCnt -= 1;
$this->_autocommit = true;
$ret = $this->_connectionID->commit();
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
return $ret;
}
function RollbackTrans()
{
if (!$this->hasTransactions) return false;
if ($this->transOff) return true;
if ($this->transCnt) $this->transCnt -= 1;
$this->_autocommit = true;
$ret = $this->_connectionID->rollback();
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
return $ret;
}
function Prepare($sql)
{
$this->_stmt = $this->_connectionID->prepare($sql);
if ($this->_stmt) return array($sql,$this->_stmt);
return false;
}
function PrepareStmt($sql)
{
$stmt = $this->_connectionID->prepare($sql);
if (!$stmt) return false;
$obj = new ADOPDOStatement($stmt,$this);
return $obj;
}
 
/* returns queryID or false */
function _query($sql,$inputarr=false)
{
if (is_array($sql)) {
$stmt = $sql[1];
} else {
$stmt = $this->_connectionID->prepare($sql);
}
if ($stmt) {
$this->_driver->debug = $this->debug;
if ($inputarr) $ok = $stmt->execute($inputarr);
else $ok = $stmt->execute();
}
$this->_errormsg = false;
$this->_errorno = false;
if ($ok) {
$this->_stmt = $stmt;
return $stmt;
}
if ($stmt) {
$arr = $stmt->errorinfo();
if ((integer)$arr[1]) {
$this->_errormsg = $arr[2];
$this->_errorno = $arr[1];
}
 
} else {
$this->_errormsg = false;
$this->_errorno = false;
}
return false;
}
 
// returns true or false
function _close()
{
$this->_stmt = false;
return true;
}
 
function _affectedrows()
{
return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
}
function _insertid()
{
return ($this->_connectionID) ? $this->_connectionID->lastInsertId() : 0;
}
}
 
class ADOPDOStatement {
 
var $databaseType = "pdo";
var $dataProvider = "pdo";
var $_stmt;
var $_connectionID;
function ADOPDOStatement($stmt,$connection)
{
$this->_stmt = $stmt;
$this->_connectionID = $connection;
}
function Execute($inputArr=false)
{
$savestmt = $this->_connectionID->_stmt;
$rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr);
$this->_connectionID->_stmt = $savestmt;
return $rs;
}
function InParameter(&$var,$name,$maxLen=4000,$type=false)
{
 
if ($type) $this->_stmt->bindParam($name,$var,$type,$maxLen);
else $this->_stmt->bindParam($name, $var);
}
function Affected_Rows()
{
return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
}
function ErrorMsg()
{
if ($this->_stmt) $arr = $this->_stmt->errorInfo();
else $arr = $this->_connectionID->errorInfo();
 
if (is_array($arr)) {
if ((integer) $arr[0] && isset($arr[2])) return $arr[2];
else return '';
} else return '-1';
}
function NumCols()
{
return ($this->_stmt) ? $this->_stmt->columnCount() : 0;
}
function ErrorNo()
{
if ($this->_stmt) return $this->_stmt->errorCode();
else return $this->_connectionID->errorInfo();
}
}
 
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_pdo extends ADORecordSet {
var $bind = false;
var $databaseType = "pdo";
var $dataProvider = "pdo";
function ADORecordSet_pdo($id,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
$this->adodbFetchMode = $mode;
switch($mode) {
case ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break;
case ADODB_FETCH_ASSOC: $mode = PDO::FETCH_ASSOC; break;
case ADODB_FETCH_BOTH:
default: $mode = PDO::FETCH_BOTH; break;
}
$this->fetchMode = $mode;
$this->_queryID = $id;
$this->ADORecordSet($id);
}
 
function Init()
{
if ($this->_inited) return;
$this->_inited = true;
if ($this->_queryID) @$this->_initrs();
else {
$this->_numOfRows = 0;
$this->_numOfFields = 0;
}
if ($this->_numOfRows != 0 && $this->_currentRow == -1) {
$this->_currentRow = 0;
if ($this->EOF = ($this->_fetch() === false)) {
$this->_numOfRows = 0; // _numOfRows could be -1
}
} else {
$this->EOF = true;
}
}
function _initrs()
{
global $ADODB_COUNTRECS;
$this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1;
if (!$this->_numOfRows) $this->_numOfRows = -1;
$this->_numOfFields = $this->_queryID->columnCount();
}
 
// returns the field object
function &FetchField($fieldOffset = -1)
{
$off=$fieldOffset+1; // offsets begin at 1
$o= new ADOFieldObject();
$arr = @$this->_queryID->getColumnMeta($fieldOffset);
if (!$arr) {
$o->name = 'bad getColumnMeta()';
$o->max_length = -1;
$o->type = 'VARCHAR';
$o->precision = 0;
# $false = false;
return $o;
}
//adodb_pr($arr);
$o->name = $arr['name'];
if (isset($arr['native_type'])) $o->type = $arr['native_type'];
else $o->type = adodb_pdo_type($arr['pdo_type']);
$o->max_length = $arr['len'];
$o->precision = $arr['precision'];
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
return $o;
}
function _seek($row)
{
return false;
}
function _fetch()
{
if (!$this->_queryID) return false;
$this->fields = $this->_queryID->fetch($this->fetchMode);
return !empty($this->fields);
}
function _close()
{
$this->_queryID = false;
}
function Fields($colname)
{
if ($this->adodbFetchMode != ADODB_FETCH_NUM) return @$this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
 
}
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-pdo_mssql.inc.php
0,0 → 1,50
<?php
 
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
*/
 
class ADODB_pdo_mssql extends ADODB_pdo {
var $hasTop = 'top';
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
var $sysTimeStamp = 'GetDate()';
function _init($parentDriver)
{
$parentDriver->hasTransactions = false; ## <<< BUG IN PDO mssql driver
$parentDriver->_bindInputArray = false;
$parentDriver->hasInsertID = true;
}
function ServerInfo()
{
return ADOConnection::ServerInfo();
}
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
{
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
return $ret;
}
function MetaTables()
{
return false;
}
function MetaColumns()
{
return false;
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-pdo_mysql.inc.php
0,0 → 1,146
<?php
 
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
*/
 
class ADODB_pdo_mysql extends ADODB_pdo {
var $metaTablesSQL = "SHOW TABLES";
var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
var $_bindInputArray = false;
var $sysDate = 'CURDATE()';
var $sysTimeStamp = 'NOW()';
function _init($parentDriver)
{
$parentDriver->hasTransactions = false;
$parentDriver->_bindInputArray = true;
$parentDriver->hasInsertID = true;
$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
}
function ServerInfo()
{
$arr['description'] = ADOConnection::GetOne("select version()");
$arr['version'] = ADOConnection::_findvers($arr['description']);
return $arr;
}
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
$save = $this->metaTablesSQL;
if ($showSchema && is_string($showSchema)) {
$this->metaTablesSQL .= " from $showSchema";
}
if ($mask) {
$mask = $this->qstr($mask);
$this->metaTablesSQL .= " like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
$this->metaTablesSQL = $save;
return $ret;
}
function &MetaColumns($table)
{
$this->_findschema($table,$schema);
if ($schema) {
$dbName = $this->database;
$this->SelectDB($schema);
}
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
if ($schema) {
$this->SelectDB($dbName);
}
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!is_object($rs)) {
$false = false;
return $false;
}
$retarr = array();
while (!$rs->EOF){
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$type = $rs->fields[1];
// split type into type(length):
$fld->scale = null;
if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
$fld->type = $query_array[1];
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
$fld->type = $query_array[1];
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
$fld->type = $query_array[1];
$arr = explode(",",$query_array[2]);
$fld->enums = $arr;
$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
$fld->max_length = ($zlen > 0) ? $zlen : 1;
} else {
$fld->type = $type;
$fld->max_length = -1;
}
$fld->not_null = ($rs->fields[2] != 'YES');
$fld->primary_key = ($rs->fields[3] == 'PRI');
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
$fld->binary = (strpos($type,'blob') !== false);
$fld->unsigned = (strpos($type,'unsigned') !== false);
if (!$fld->binary) {
$d = $rs->fields[4];
if ($d != '' && $d != 'NULL') {
$fld->has_default = true;
$fld->default_value = $d;
} else {
$fld->has_default = false;
}
}
if ($save == ADODB_FETCH_NUM) {
$retarr[] = $fld;
} else {
$retarr[strtoupper($fld->name)] = $fld;
}
$rs->MoveNext();
}
$rs->Close();
return $retarr;
}
// parameters use PostgreSQL convention, not MySQL
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
{
$offsetStr =($offset>=0) ? "$offset," : '';
// jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
if ($nrows < 0) $nrows = '18446744073709551615';
if ($secs)
$rs =& $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr);
else
$rs =& $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr);
return $rs;
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-pdo_oci.inc.php
0,0 → 1,93
<?php
 
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
*/
 
class ADODB_pdo_oci extends ADODB_pdo_base {
 
var $concat_operator='||';
var $sysDate = "TRUNC(SYSDATE)";
var $sysTimeStamp = 'SYSDATE';
var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS'
var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)";
var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW')";
var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno";
var $_initdate = true;
var $_hasdual = true;
function _init($parentDriver)
{
$parentDriver->_bindInputArray = true;
if ($this->_initdate) {
$parentDriver->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'");
}
}
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
if ($mask) {
$save = $this->metaTablesSQL;
$mask = $this->qstr(strtoupper($mask));
$this->metaTablesSQL .= " AND table_name like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
if ($mask) {
$this->metaTablesSQL = $save;
}
return $ret;
}
function &MetaColumns($table)
{
global $ADODB_FETCH_MODE;
$false = false;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!$rs) {
return $false;
}
$retarr = array();
while (!$rs->EOF) { //print_r($rs->fields);
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$fld->type = $rs->fields[1];
$fld->max_length = $rs->fields[2];
$fld->scale = $rs->fields[3];
if ($rs->fields[1] == 'NUMBER' && $rs->fields[3] == 0) {
$fld->type ='INT';
$fld->max_length = $rs->fields[4];
}
$fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0);
$fld->binary = (strpos($fld->type,'BLOB') !== false);
$fld->default_value = $rs->fields[6];
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[strtoupper($fld->name)] = $fld;
$rs->MoveNext();
}
$rs->Close();
if (empty($retarr))
return $false;
else
return $retarr;
}
}
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-pdo_pgsql.inc.php
0,0 → 1,229
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
*/
 
class ADODB_pdo_pgsql extends ADODB_pdo {
var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1";
var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages',
'sql_packages', 'sql_sizing', 'sql_sizing_profiles')
union
select viewname,'V' from pg_views where viewname not like 'pg\_%'";
//"select tablename from pg_tables where tablename not like 'pg_%' order by 1";
var $isoDates = true; // accepts dates in ISO format
var $sysDate = "CURRENT_DATE";
var $sysTimeStamp = "CURRENT_TIMESTAMP";
var $blobEncodeType = 'C';
var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum
FROM pg_class c, pg_attribute a,pg_type t
WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%'
AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
 
// used when schema defined
var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum
FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n
WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s'))
and c.relnamespace=n.oid and n.nspname='%s'
and a.attname not like '....%%' AND a.attnum > 0
AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
// get primary key etc -- from Freek Dijkstra
var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key
FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'";
var $hasAffectedRows = true;
var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
// below suggested by Freek Dijkstra
var $true = 't'; // string that represents TRUE for a database
var $false = 'f'; // string that represents FALSE for a database
var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database
var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
var $hasMoveFirst = true;
var $hasGenID = true;
var $_genIDSQL = "SELECT NEXTVAL('%s')";
var $_genSeqSQL = "CREATE SEQUENCE %s START %s";
var $_dropSeqSQL = "DROP SEQUENCE %s";
var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum";
var $random = 'random()'; /// random function
var $concat_operator='||';
function _init($parentDriver)
{
$parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver
$parentDriver->hasInsertID = true;
}
function ServerInfo()
{
$arr['description'] = ADOConnection::GetOne("select version()");
$arr['version'] = ADOConnection::_findvers($arr['description']);
return $arr;
}
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
{
$offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
$limitStr = ($nrows >= 0) ? " LIMIT $nrows" : '';
if ($secs2cache)
$rs =& $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
else
$rs =& $this->Execute($sql."$limitStr$offsetStr",$inputarr);
return $rs;
}
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
$info = $this->ServerInfo();
if ($info['version'] >= 7.3) {
$this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
and schemaname not in ( 'pg_catalog','information_schema')
union
select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') ";
}
if ($mask) {
$save = $this->metaTablesSQL;
$mask = $this->qstr(strtolower($mask));
if ($info['version']>=7.3)
$this->metaTablesSQL = "
select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema')
union
select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') ";
else
$this->metaTablesSQL = "
select tablename,'T' from pg_tables where tablename like $mask
union
select viewname,'V' from pg_views where viewname like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
if ($mask) {
$this->metaTablesSQL = $save;
}
return $ret;
}
function &MetaColumns($table,$normalize=true)
{
global $ADODB_FETCH_MODE;
$schema = false;
$this->_findschema($table,$schema);
if ($normalize) $table = strtolower($table);
 
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
if ($schema) $rs =& $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema));
else $rs =& $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rs === false) {
$false = false;
return $false;
}
if (!empty($this->metaKeySQL)) {
// If we want the primary keys, we have to issue a separate query
// Of course, a modified version of the metaColumnsSQL query using a
// LEFT JOIN would have been much more elegant, but postgres does
// not support OUTER JOINS. So here is the clumsy way.
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rskey = $this->Execute(sprintf($this->metaKeySQL,($table)));
// fetch all result in once for performance.
$keys =& $rskey->GetArray();
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
$rskey->Close();
unset($rskey);
}
 
$rsdefa = array();
if (!empty($this->metaDefaultsSQL)) {
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$sql = sprintf($this->metaDefaultsSQL, ($table));
$rsdef = $this->Execute($sql);
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rsdef) {
while (!$rsdef->EOF) {
$num = $rsdef->fields['num'];
$s = $rsdef->fields['def'];
if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */
$s = substr($s, 1);
$s = substr($s, 0, strlen($s) - 1);
}
 
$rsdefa[$num] = $s;
$rsdef->MoveNext();
}
} else {
ADOConnection::outp( "==> SQL => " . $sql);
}
unset($rsdef);
}
$retarr = array();
while (!$rs->EOF) {
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$fld->type = $rs->fields[1];
$fld->max_length = $rs->fields[2];
if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4;
if ($fld->max_length <= 0) $fld->max_length = -1;
if ($fld->type == 'numeric') {
$fld->scale = $fld->max_length & 0xFFFF;
$fld->max_length >>= 16;
}
// dannym
// 5 hasdefault; 6 num-of-column
$fld->has_default = ($rs->fields[5] == 't');
if ($fld->has_default) {
$fld->default_value = $rsdefa[$rs->fields[6]];
}
 
//Freek
if ($rs->fields[4] == $this->true) {
$fld->not_null = true;
}
// Freek
if (is_array($keys)) {
foreach($keys as $key) {
if ($fld->name == $key['column_name'] AND $key['primary_key'] == $this->true)
$fld->primary_key = true;
if ($fld->name == $key['column_name'] AND $key['unique_key'] == $this->true)
$fld->unique = true; // What name is more compatible?
}
}
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld;
$rs->MoveNext();
}
$rs->Close();
if (empty($retarr)) {
$false = false;
return $false;
} else return $retarr;
}
 
}
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-postgres.inc.php
0,0 → 1,14
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4.
NOTE: Since 3.31, this file is no longer used, and the "postgres" driver is
remapped to "postgres7". Maintaining multiple postgres drivers is no easy
job, so hopefully this will ensure greater consistency and fewer bugs.
*/
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-postgres64.inc.php
0,0 → 1,1047
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 8.
Original version derived from Alberto Cerezal (acerezalp@dbnet.es) - DBNet Informatica & Comunicaciones.
08 Nov 2000 jlim - Minor corrections, removing mysql stuff
09 Nov 2000 jlim - added insertid support suggested by "Christopher Kings-Lynne" <chriskl@familyhealth.com.au>
jlim - changed concat operator to || and data types to MetaType to match documented pgsql types
see http://www.postgresql.org/devel-corner/docs/postgres/datatype.htm
22 Nov 2000 jlim - added changes to FetchField() and MetaTables() contributed by "raser" <raser@mail.zen.com.tw>
27 Nov 2000 jlim - added changes to _connect/_pconnect from ideas by "Lennie" <leen@wirehub.nl>
15 Dec 2000 jlim - added changes suggested by Additional code changes by "Eric G. Werk" egw@netguide.dk.
31 Jan 2002 jlim - finally installed postgresql. testing
01 Mar 2001 jlim - Freek Dijkstra changes, also support for text type
See http://www.varlena.com/varlena/GeneralBits/47.php
-- What indexes are on my table?
select * from pg_indexes where tablename = 'tablename';
-- What triggers are on my table?
select c.relname as "Table", t.tgname as "Trigger Name",
t.tgconstrname as "Constraint Name", t.tgenabled as "Enabled",
t.tgisconstraint as "Is Constraint", cc.relname as "Referenced Table",
p.proname as "Function Name"
from pg_trigger t, pg_class c, pg_class cc, pg_proc p
where t.tgfoid = p.oid and t.tgrelid = c.oid
and t.tgconstrrelid = cc.oid
and c.relname = 'tablename';
-- What constraints are on my table?
select r.relname as "Table", c.conname as "Constraint Name",
contype as "Constraint Type", conkey as "Key Columns",
confkey as "Foreign Columns", consrc as "Source"
from pg_class r, pg_constraint c
where r.oid = c.conrelid
and relname = 'tablename';
 
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
function adodb_addslashes($s)
{
$len = strlen($s);
if ($len == 0) return "''";
if (strncmp($s,"'",1) === 0 && substr($s,$len-1) == "'") return $s; // already quoted
return "'".addslashes($s)."'";
}
 
class ADODB_postgres64 extends ADOConnection{
var $databaseType = 'postgres64';
var $dataProvider = 'postgres';
var $hasInsertID = true;
var $_resultid = false;
var $concat_operator='||';
var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1";
var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages',
'sql_packages', 'sql_sizing', 'sql_sizing_profiles')
union
select viewname,'V' from pg_views where viewname not like 'pg\_%'";
//"select tablename from pg_tables where tablename not like 'pg_%' order by 1";
var $isoDates = true; // accepts dates in ISO format
var $sysDate = "CURRENT_DATE";
var $sysTimeStamp = "CURRENT_TIMESTAMP";
var $blobEncodeType = 'C';
var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum
FROM pg_class c, pg_attribute a,pg_type t
WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%'
AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
 
// used when schema defined
var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum
FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n
WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s'))
and c.relnamespace=n.oid and n.nspname='%s'
and a.attname not like '....%%' AND a.attnum > 0
AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
// get primary key etc -- from Freek Dijkstra
var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key
FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'";
var $hasAffectedRows = true;
var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
// below suggested by Freek Dijkstra
var $true = 'TRUE'; // string that represents TRUE for a database
var $false = 'FALSE'; // string that represents FALSE for a database
var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database
var $fmtTimeStamp = "'Y-m-d H:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
var $hasMoveFirst = true;
var $hasGenID = true;
var $_genIDSQL = "SELECT NEXTVAL('%s')";
var $_genSeqSQL = "CREATE SEQUENCE %s START %s";
var $_dropSeqSQL = "DROP SEQUENCE %s";
var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum";
var $random = 'random()'; /// random function
var $autoRollback = true; // apparently pgsql does not autorollback properly before php 4.3.4
// http://bugs.php.net/bug.php?id=25404
var $_bindInputArray = false; // requires postgresql 7.3+ and ability to modify database
var $disableBlobs = false; // set to true to disable blob checking, resulting in 2-5% improvement in performance.
// The last (fmtTimeStamp is not entirely correct:
// PostgreSQL also has support for time zones,
// and writes these time in this format: "2001-03-01 18:59:26+02".
// There is no code for the "+02" time zone information, so I just left that out.
// I'm not familiar enough with both ADODB as well as Postgres
// to know what the concequences are. The other values are correct (wheren't in 0.94)
// -- Freek Dijkstra
 
function ADODB_postgres64()
{
// changes the metaColumnsSQL, adds columns: attnum[6]
}
function ServerInfo()
{
if (isset($this->version)) return $this->version;
$arr['description'] = $this->GetOne("select version()");
$arr['version'] = ADOConnection::_findvers($arr['description']);
$this->version = $arr;
return $arr;
}
 
function IfNull( $field, $ifNull )
{
return " coalesce($field, $ifNull) ";
}
 
// get the last id - never tested
function pg_insert_id($tablename,$fieldname)
{
$result=pg_exec($this->_connectionID, "SELECT last_value FROM ${tablename}_${fieldname}_seq");
if ($result) {
$arr = @pg_fetch_row($result,0);
pg_freeresult($result);
if (isset($arr[0])) return $arr[0];
}
return false;
}
/* Warning from http://www.php.net/manual/function.pg-getlastoid.php:
Using a OID as a unique identifier is not generally wise.
Unless you are very careful, you might end up with a tuple having
a different OID if a database must be reloaded. */
function _insertid($table,$column)
{
if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false;
$oid = pg_getlastoid($this->_resultid);
// to really return the id, we need the table and column-name, else we can only return the oid != id
return empty($table) || empty($column) ? $oid : $this->GetOne("SELECT $column FROM $table WHERE oid=".(int)$oid);
}
 
// I get this error with PHP before 4.0.6 - jlim
// Warning: This compilation does not support pg_cmdtuples() in adodb-postgres.inc.php on line 44
function _affectedrows()
{
if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false;
return pg_cmdtuples($this->_resultid);
}
// returns true/false
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
return @pg_Exec($this->_connectionID, "begin");
}
function RowLock($tables,$where,$flds='1 as ignore')
{
if (!$this->transCnt) $this->BeginTrans();
return $this->GetOne("select $flds from $tables where $where for update");
}
 
// returns true/false.
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
$this->transCnt -= 1;
return @pg_Exec($this->_connectionID, "commit");
}
// returns true/false
function RollbackTrans()
{
if ($this->transOff) return true;
$this->transCnt -= 1;
return @pg_Exec($this->_connectionID, "rollback");
}
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
$info = $this->ServerInfo();
if ($info['version'] >= 7.3) {
$this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
and schemaname not in ( 'pg_catalog','information_schema')
union
select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') ";
}
if ($mask) {
$save = $this->metaTablesSQL;
$mask = $this->qstr(strtolower($mask));
if ($info['version']>=7.3)
$this->metaTablesSQL = "
select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema')
union
select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') ";
else
$this->metaTablesSQL = "
select tablename,'T' from pg_tables where tablename like $mask
union
select viewname,'V' from pg_views where viewname like $mask";
}
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
if ($mask) {
$this->metaTablesSQL = $save;
}
return $ret;
}
// if magic quotes disabled, use pg_escape_string()
function qstr($s,$magic_quotes=false)
{
if (!$magic_quotes) {
if (ADODB_PHPVER >= 0x4200) {
return "'".pg_escape_string($s)."'";
}
if ($this->replaceQuote[0] == '\\'){
$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\\000"),$s);
}
return "'".str_replace("'",$this->replaceQuote,$s)."'";
}
// undo magic quotes for "
$s = str_replace('\\"','"',$s);
return "'$s'";
}
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysTimeStamp;
$s = 'TO_CHAR('.$col.",'";
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
$ch = $fmt[$i];
switch($ch) {
case 'Y':
case 'y':
$s .= 'YYYY';
break;
case 'Q':
case 'q':
$s .= 'Q';
break;
case 'M':
$s .= 'Mon';
break;
case 'm':
$s .= 'MM';
break;
case 'D':
case 'd':
$s .= 'DD';
break;
case 'H':
$s.= 'HH24';
break;
case 'h':
$s .= 'HH';
break;
case 'i':
$s .= 'MI';
break;
case 's':
$s .= 'SS';
break;
case 'a':
case 'A':
$s .= 'AM';
break;
case 'w':
$s .= 'D';
break;
case 'l':
$s .= 'DAY';
break;
case 'W':
$s .= 'WW';
break;
 
default:
// handle escape characters...
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
if (strpos('-/.:;, ',$ch) !== false) $s .= $ch;
else $s .= '"'.$ch.'"';
}
}
return $s. "')";
}
/*
* Load a Large Object from a file
* - the procedure stores the object id in the table and imports the object using
* postgres proprietary blob handling routines
*
* contributed by Mattia Rossi mattia@technologist.com
* modified for safe mode by juraj chlebec
*/
function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
{
pg_exec ($this->_connectionID, "begin");
$fd = fopen($path,'r');
$contents = fread($fd,filesize($path));
fclose($fd);
$oid = pg_lo_create($this->_connectionID);
$handle = pg_lo_open($this->_connectionID, $oid, 'w');
pg_lo_write($handle, $contents);
pg_lo_close($handle);
// $oid = pg_lo_import ($path);
pg_exec($this->_connectionID, "commit");
$rs = ADOConnection::UpdateBlob($table,$column,$oid,$where,$blobtype);
$rez = !empty($rs);
return $rez;
}
/*
* Deletes/Unlinks a Blob from the database, otherwise it
* will be left behind
*
* Returns TRUE on success or FALSE on failure.
*
* contributed by Todd Rogers todd#windfox.net
*/
function BlobDelete( $blob )
{
pg_exec ($this->_connectionID, "begin");
$result = @pg_lo_unlink($blob);
pg_exec ($this->_connectionID, "commit");
return( $result );
}
 
/*
Hueristic - not guaranteed to work.
*/
function GuessOID($oid)
{
if (strlen($oid)>16) return false;
return is_numeric($oid);
}
/*
* If an OID is detected, then we use pg_lo_* to open the oid file and read the
* real blob from the db using the oid supplied as a parameter. If you are storing
* blobs using bytea, we autodetect and process it so this function is not needed.
*
* contributed by Mattia Rossi mattia@technologist.com
*
* see http://www.postgresql.org/idocs/index.php?largeobjects.html
*
* Since adodb 4.54, this returns the blob, instead of sending it to stdout. Also
* added maxsize parameter, which defaults to $db->maxblobsize if not defined.
*/
function BlobDecode($blob,$maxsize=false,$hastrans=true)
{
if (!$this->GuessOID($blob)) return $blob;
if ($hastrans) @pg_exec($this->_connectionID,"begin");
$fd = @pg_lo_open($this->_connectionID,$blob,"r");
if ($fd === false) {
if ($hastrans) @pg_exec($this->_connectionID,"commit");
return $blob;
}
if (!$maxsize) $maxsize = $this->maxblobsize;
$realblob = @pg_loread($fd,$maxsize);
@pg_loclose($fd);
if ($hastrans) @pg_exec($this->_connectionID,"commit");
return $realblob;
}
/*
See http://www.postgresql.org/idocs/index.php?datatype-binary.html
NOTE: SQL string literals (input strings) must be preceded with two backslashes
due to the fact that they must pass through two parsers in the PostgreSQL
backend.
*/
function BlobEncode($blob)
{
if (ADODB_PHPVER >= 0x4200) return pg_escape_bytea($blob);
/*92=backslash, 0=null, 39=single-quote*/
$badch = array(chr(92),chr(0),chr(39)); # \ null '
$fixch = array('\\\\134','\\\\000','\\\\047');
return adodb_str_replace($badch,$fixch,$blob);
// note that there is a pg_escape_bytea function only for php 4.2.0 or later
}
// assumes bytea for blob, and varchar for clob
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{
if ($blobtype == 'CLOB') {
return $this->Execute("UPDATE $table SET $column=" . $this->qstr($val) . " WHERE $where");
}
// do not use bind params which uses qstr(), as blobencode() already quotes data
return $this->Execute("UPDATE $table SET $column='".$this->BlobEncode($val)."'::bytea WHERE $where");
}
function OffsetDate($dayFraction,$date=false)
{
if (!$date) $date = $this->sysDate;
else if (strncmp($date,"'",1) == 0) {
$len = strlen($date);
if (10 <= $len && $len <= 12) $date = 'date '.$date;
else $date = 'timestamp '.$date;
}
return "($date+interval'$dayFraction days')";
}
 
// for schema support, pass in the $table param "$schema.$tabname".
// converts field names to lowercase, $upper is ignored
// see http://phplens.com/lens/lensforum/msgs.php?id=14018 for more info
function &MetaColumns($table,$normalize=true)
{
global $ADODB_FETCH_MODE;
$schema = false;
$false = false;
$this->_findschema($table,$schema);
if ($normalize) $table = strtolower($table);
 
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
if ($schema) $rs =& $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema));
else $rs =& $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rs === false) {
return $false;
}
if (!empty($this->metaKeySQL)) {
// If we want the primary keys, we have to issue a separate query
// Of course, a modified version of the metaColumnsSQL query using a
// LEFT JOIN would have been much more elegant, but postgres does
// not support OUTER JOINS. So here is the clumsy way.
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rskey = $this->Execute(sprintf($this->metaKeySQL,($table)));
// fetch all result in once for performance.
$keys =& $rskey->GetArray();
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
$rskey->Close();
unset($rskey);
}
 
$rsdefa = array();
if (!empty($this->metaDefaultsSQL)) {
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$sql = sprintf($this->metaDefaultsSQL, ($table));
$rsdef = $this->Execute($sql);
if (isset($savem)) $this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if ($rsdef) {
while (!$rsdef->EOF) {
$num = $rsdef->fields['num'];
$s = $rsdef->fields['def'];
if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */
$s = substr($s, 1);
$s = substr($s, 0, strlen($s) - 1);
}
 
$rsdefa[$num] = $s;
$rsdef->MoveNext();
}
} else {
ADOConnection::outp( "==> SQL => " . $sql);
}
unset($rsdef);
}
$retarr = array();
while (!$rs->EOF) {
$fld = new ADOFieldObject();
$fld->name = $rs->fields[0];
$fld->type = $rs->fields[1];
$fld->max_length = $rs->fields[2];
if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4;
if ($fld->max_length <= 0) $fld->max_length = -1;
if ($fld->type == 'numeric') {
$fld->scale = $fld->max_length & 0xFFFF;
$fld->max_length >>= 16;
}
// dannym
// 5 hasdefault; 6 num-of-column
$fld->has_default = ($rs->fields[5] == 't');
if ($fld->has_default) {
$fld->default_value = $rsdefa[$rs->fields[6]];
}
 
//Freek
$fld->not_null = $rs->fields[4] == 't';
// Freek
if (is_array($keys)) {
foreach($keys as $key) {
if ($fld->name == $key['column_name'] AND $key['primary_key'] == 't')
$fld->primary_key = true;
if ($fld->name == $key['column_name'] AND $key['unique_key'] == 't')
$fld->unique = true; // What name is more compatible?
}
}
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld;
$rs->MoveNext();
}
$rs->Close();
if (empty($retarr))
return $false;
else
return $retarr;
}
 
function &MetaIndexes ($table, $primary = FALSE)
{
global $ADODB_FETCH_MODE;
$schema = false;
$this->_findschema($table,$schema);
 
if ($schema) { // requires pgsql 7.3+ - pg_namespace used.
$sql = '
SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns"
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid
JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid
,pg_namespace n
WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\')) and c.relnamespace=c2.relnamespace and c.relnamespace=n.oid and n.nspname=\'%s\'';
} else {
$sql = '
SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns"
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid
JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid
WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\'))';
}
if ($primary == FALSE) {
$sql .= ' AND i.indisprimary=false;';
}
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
$rs = $this->Execute(sprintf($sql,$table,$table,$schema));
if (isset($savem)) {
$this->SetFetchMode($savem);
}
$ADODB_FETCH_MODE = $save;
 
if (!is_object($rs)) {
$false = false;
return $false;
}
$col_names = $this->MetaColumnNames($table,true);
$indexes = array();
while ($row = $rs->FetchRow()) {
$columns = array();
foreach (explode(' ', $row[2]) as $col) {
$columns[] = $col_names[$col - 1];
}
$indexes[$row[0]] = array(
'unique' => ($row[1] == 't'),
'columns' => $columns
);
}
return $indexes;
}
 
// returns true or false
//
// examples:
// $db->Connect("host=host1 user=user1 password=secret port=4341");
// $db->Connect('host1','user1','secret');
function _connect($str,$user='',$pwd='',$db='',$ctype=0)
{
if (!function_exists('pg_connect')) return null;
$this->_errorMsg = false;
if ($user || $pwd || $db) {
$user = adodb_addslashes($user);
$pwd = adodb_addslashes($pwd);
if (strlen($db) == 0) $db = 'template1';
$db = adodb_addslashes($db);
if ($str) {
$host = split(":", $str);
if ($host[0]) $str = "host=".adodb_addslashes($host[0]);
else $str = 'host=localhost';
if (isset($host[1])) $str .= " port=$host[1]";
else if (!empty($this->port)) $str .= " port=".$this->port;
}
if ($user) $str .= " user=".$user;
if ($pwd) $str .= " password=".$pwd;
if ($db) $str .= " dbname=".$db;
}
 
//if ($user) $linea = "user=$user host=$linea password=$pwd dbname=$db port=5432";
if ($ctype === 1) { // persistent
$this->_connectionID = pg_pconnect($str);
} else {
if ($ctype === -1) { // nconnect, we trick pgsql ext by changing the connection str
static $ncnt;
if (empty($ncnt)) $ncnt = 1;
else $ncnt += 1;
$str .= str_repeat(' ',$ncnt);
}
$this->_connectionID = pg_connect($str);
}
if ($this->_connectionID === false) return false;
$this->Execute("set datestyle='ISO'");
return true;
}
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName,-1);
}
// returns true or false
//
// examples:
// $db->PConnect("host=host1 user=user1 password=secret port=4341");
// $db->PConnect('host1','user1','secret');
function _pconnect($str,$user='',$pwd='',$db='')
{
return $this->_connect($str,$user,$pwd,$db,1);
}
 
// returns queryID or false
function _query($sql,$inputarr)
{
if ($inputarr) {
/*
It appears that PREPARE/EXECUTE is slower for many queries.
For query executed 1000 times:
"select id,firstname,lastname from adoxyz
where firstname not like ? and lastname not like ? and id = ?"
with plan = 1.51861286163 secs
no plan = 1.26903700829 secs
 
 
*/
$plan = 'P'.md5($sql);
$execp = '';
foreach($inputarr as $v) {
if ($execp) $execp .= ',';
if (is_string($v)) {
if (strncmp($v,"'",1) !== 0) $execp .= $this->qstr($v);
} else {
$execp .= $v;
}
}
if ($execp) $exsql = "EXECUTE $plan ($execp)";
else $exsql = "EXECUTE $plan";
$rez = @pg_exec($this->_connectionID,$exsql);
if (!$rez) {
# Perhaps plan does not exist? Prepare/compile plan.
$params = '';
foreach($inputarr as $v) {
if ($params) $params .= ',';
if (is_string($v)) {
$params .= 'VARCHAR';
} else if (is_integer($v)) {
$params .= 'INTEGER';
} else {
$params .= "REAL";
}
}
$sqlarr = explode('?',$sql);
//print_r($sqlarr);
$sql = '';
$i = 1;
foreach($sqlarr as $v) {
$sql .= $v.' $'.$i;
$i++;
}
$s = "PREPARE $plan ($params) AS ".substr($sql,0,strlen($sql)-2);
//adodb_pr($s);
pg_exec($this->_connectionID,$s);
echo $this->ErrorMsg();
}
$rez = pg_exec($this->_connectionID,$exsql);
} else {
$this->_errorMsg = false;
//adodb_backtrace();
$rez = pg_exec($this->_connectionID,$sql);
}
// check if no data returned, then no need to create real recordset
if ($rez && pg_numfields($rez) <= 0) {
if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') {
pg_freeresult($this->_resultid);
}
$this->_resultid = $rez;
return true;
}
return $rez;
}
function _errconnect()
{
if (defined('DB_ERROR_CONNECT_FAILED')) return DB_ERROR_CONNECT_FAILED;
else return 'Database connection failed';
}
 
/* Returns: the last error message from previous database operation */
function ErrorMsg()
{
if ($this->_errorMsg !== false) return $this->_errorMsg;
if (ADODB_PHPVER >= 0x4300) {
if (!empty($this->_resultid)) {
$this->_errorMsg = @pg_result_error($this->_resultid);
if ($this->_errorMsg) return $this->_errorMsg;
}
if (!empty($this->_connectionID)) {
$this->_errorMsg = @pg_last_error($this->_connectionID);
} else $this->_errorMsg = $this->_errconnect();
} else {
if (empty($this->_connectionID)) $this->_errconnect();
else $this->_errorMsg = @pg_errormessage($this->_connectionID);
}
return $this->_errorMsg;
}
function ErrorNo()
{
$e = $this->ErrorMsg();
if (strlen($e)) {
return ADOConnection::MetaError($e);
}
return 0;
}
 
// returns true or false
function _close()
{
if ($this->transCnt) $this->RollbackTrans();
if ($this->_resultid) {
@pg_freeresult($this->_resultid);
$this->_resultid = false;
}
@pg_close($this->_connectionID);
$this->_connectionID = false;
return true;
}
/*
* Maximum size of C field
*/
function CharMax()
{
return 1000000000; // should be 1 Gb?
}
/*
* Maximum size of X field
*/
function TextMax()
{
return 1000000000; // should be 1 Gb?
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_postgres64 extends ADORecordSet{
var $_blobArr;
var $databaseType = "postgres64";
var $canSeek = true;
function ADORecordSet_postgres64($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:
default: $this->fetchMode = PGSQL_BOTH; break;
}
$this->adodbFetchMode = $mode;
$this->ADORecordSet($queryID);
}
function &GetRowAssoc($upper=true)
{
if ($this->fetchMode == PGSQL_ASSOC && !$upper) return $this->fields;
$row =& ADORecordSet::GetRowAssoc($upper);
return $row;
}
 
function _initrs()
{
global $ADODB_COUNTRECS;
$qid = $this->_queryID;
$this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($qid):-1;
$this->_numOfFields = @pg_numfields($qid);
// cache types for blob decode check
// apparently pg_fieldtype actually performs an sql query on the database to get the type.
if (empty($this->connection->noBlobs))
for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
if (pg_fieldtype($qid,$i) == 'bytea') {
$this->_blobArr[$i] = pg_fieldname($qid,$i);
}
}
}
 
/* Use associative array to get fields array */
function Fields($colname)
{
if ($this->fetchMode != PGSQL_NUM) return @$this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
 
function &FetchField($off = 0)
{
// offsets begin at 0
$o= new ADOFieldObject();
$o->name = @pg_fieldname($this->_queryID,$off);
$o->type = @pg_fieldtype($this->_queryID,$off);
$o->max_length = @pg_fieldsize($this->_queryID,$off);
return $o;
}
 
function _seek($row)
{
return @pg_fetch_row($this->_queryID,$row);
}
function _decode($blob)
{
eval('$realblob="'.adodb_str_replace(array('"','$'),array('\"','\$'),$blob).'";');
return $realblob;
}
function _fixblobs()
{
if ($this->fetchMode == PGSQL_NUM || $this->fetchMode == PGSQL_BOTH) {
foreach($this->_blobArr as $k => $v) {
$this->fields[$k] = ADORecordSet_postgres64::_decode($this->fields[$k]);
}
}
if ($this->fetchMode == PGSQL_ASSOC || $this->fetchMode == PGSQL_BOTH) {
foreach($this->_blobArr as $k => $v) {
$this->fields[$v] = ADORecordSet_postgres64::_decode($this->fields[$v]);
}
}
}
// 10% speedup to move MoveNext to child class
function MoveNext()
{
if (!$this->EOF) {
$this->_currentRow++;
if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
if (is_array($this->fields) && $this->fields) {
if (isset($this->_blobArr)) $this->_fixblobs();
return true;
}
}
$this->fields = false;
$this->EOF = true;
}
return false;
}
function _fetch()
{
if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0)
return false;
 
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
if ($this->fields && isset($this->_blobArr)) $this->_fixblobs();
return (is_array($this->fields));
}
 
function _close()
{
return @pg_freeresult($this->_queryID);
}
 
function MetaType($t,$len=-1,$fieldobj=false)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
switch (strtoupper($t)) {
case 'MONEY': // stupid, postgres expects money to be a string
case 'INTERVAL':
case 'CHAR':
case 'CHARACTER':
case 'VARCHAR':
case 'NAME':
case 'BPCHAR':
case '_VARCHAR':
case 'INET':
if ($len <= $this->blobSize) return 'C';
case 'TEXT':
return 'X';
case 'IMAGE': // user defined type
case 'BLOB': // user defined type
case 'BIT': // This is a bit string, not a single bit, so don't return 'L'
case 'VARBIT':
case 'BYTEA':
return 'B';
case 'BOOL':
case 'BOOLEAN':
return 'L';
case 'DATE':
return 'D';
case 'TIME':
case 'DATETIME':
case 'TIMESTAMP':
case 'TIMESTAMPTZ':
return 'T';
case 'SMALLINT':
case 'BIGINT':
case 'INTEGER':
case 'INT8':
case 'INT4':
case 'INT2':
if (isset($fieldobj) &&
empty($fieldobj->primary_key) && empty($fieldobj->unique)) return 'I';
case 'OID':
case 'SERIAL':
return 'R';
default:
return 'N';
}
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-postgres7.inc.php
0,0 → 1,262
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4.
Postgres7 support.
28 Feb 2001: Currently indicate that we support LIMIT
01 Dec 2001: dannym added support for default values
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR."/drivers/adodb-postgres64.inc.php");
 
class ADODB_postgres7 extends ADODB_postgres64 {
var $databaseType = 'postgres7';
var $hasLimit = true; // set to true for pgsql 6.5+ only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
var $ansiOuter = true;
var $charSet = true; //set to true for Postgres 7 and above - PG client supports encodings
function ADODB_postgres7()
{
$this->ADODB_postgres64();
if (ADODB_ASSOC_CASE !== 2) {
$this->rsPrefix .= 'assoc_';
}
$this->_bindInputArray = PHP_VERSION >= 5.1;
}
 
// the following should be compat with postgresql 7.2,
// which makes obsolete the LIMIT limit,offset syntax
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
{
$offsetStr = ($offset >= 0) ? " OFFSET ".((integer)$offset) : '';
$limitStr = ($nrows >= 0) ? " LIMIT ".((integer)$nrows) : '';
if ($secs2cache)
$rs =& $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
else
$rs =& $this->Execute($sql."$limitStr$offsetStr",$inputarr);
return $rs;
}
/*
function Prepare($sql)
{
$info = $this->ServerInfo();
if ($info['version']>=7.3) {
return array($sql,false);
}
return $sql;
}
*/
 
// from Edward Jaramilla, improved version - works on pg 7.4
function MetaForeignKeys($table, $owner=false, $upper=false)
{
$sql = 'SELECT t.tgargs as args
FROM
pg_trigger t,pg_class c,pg_proc p
WHERE
t.tgenabled AND
t.tgrelid = c.oid AND
t.tgfoid = p.oid AND
p.proname = \'RI_FKey_check_ins\' AND
c.relname = \''.strtolower($table).'\'
ORDER BY
t.tgrelid';
$rs =& $this->Execute($sql);
if ($rs && !$rs->EOF) {
$arr =& $rs->GetArray();
$a = array();
foreach($arr as $v)
{
$data = explode(chr(0), $v['args']);
if ($upper) {
$a[strtoupper($data[2])][] = strtoupper($data[4].'='.$data[5]);
} else {
$a[$data[2]][] = $data[4].'='.$data[5];
}
}
return $a;
}
return false;
}
 
function _query($sql,$inputarr)
{
if (! $this->_bindInputArray) {
// We don't have native support for parameterized queries, so let's emulate it at the parent
return ADODB_postgres64::_query($sql, $inputarr);
}
// -- added Cristiano da Cunha Duarte
if ($inputarr) {
$sqlarr = explode('?',trim($sql));
$sql = '';
$i = 1;
$last = sizeof($sqlarr)-1;
foreach($sqlarr as $v) {
if ($last < $i) $sql .= $v;
else $sql .= $v.' $'.$i;
$i++;
}
$rez = pg_query_params($this->_connectionID,$sql, $inputarr);
} else {
$rez = pg_query($this->_connectionID,$sql);
}
// check if no data returned, then no need to create real recordset
if ($rez && pg_numfields($rez) <= 0) {
if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') {
pg_freeresult($this->_resultid);
}
$this->_resultid = $rez;
return true;
}
return $rez;
}
// this is a set of functions for managing client encoding - very important if the encodings
// of your database and your output target (i.e. HTML) don't match
//for instance, you may have UNICODE database and server it on-site as WIN1251 etc.
// GetCharSet - get the name of the character set the client is using now
// the functions should work with Postgres 7.0 and above, the set of charsets supported
// depends on compile flags of postgres distribution - if no charsets were compiled into the server
// it will return 'SQL_ANSI' always
function GetCharSet()
{
//we will use ADO's builtin property charSet
$this->charSet = @pg_client_encoding($this->_connectionID);
if (!$this->charSet) {
return false;
} else {
return $this->charSet;
}
}
// SetCharSet - switch the client encoding
function SetCharSet($charset_name)
{
$this->GetCharSet();
if ($this->charSet !== $charset_name) {
$if = pg_set_client_encoding($this->_connectionID, $charset_name);
if ($if == "0" & $this->GetCharSet() == $charset_name) {
return true;
} else return false;
} else return true;
}
 
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordSet_postgres7 extends ADORecordSet_postgres64{
 
var $databaseType = "postgres7";
function ADORecordSet_postgres7($queryID,$mode=false)
{
$this->ADORecordSet_postgres64($queryID,$mode);
}
// 10% speedup to move MoveNext to child class
function MoveNext()
{
if (!$this->EOF) {
$this->_currentRow++;
if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
if (is_array($this->fields)) {
if ($this->fields && isset($this->_blobArr)) $this->_fixblobs();
return true;
}
}
$this->fields = false;
$this->EOF = true;
}
return false;
}
 
}
 
class ADORecordSet_assoc_postgres7 extends ADORecordSet_postgres64{
 
var $databaseType = "postgres7";
function ADORecordSet_assoc_postgres7($queryID,$mode=false)
{
$this->ADORecordSet_postgres64($queryID,$mode);
}
function _fetch()
{
if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0)
return false;
 
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
if ($this->fields) {
if (isset($this->_blobArr)) $this->_fixblobs();
$this->_updatefields();
}
return (is_array($this->fields));
}
// Create associative array
function _updatefields()
{
if (ADODB_ASSOC_CASE == 2) return; // native
$arr = array();
$lowercase = (ADODB_ASSOC_CASE == 0);
foreach($this->fields as $k => $v) {
if (is_integer($k)) $arr[$k] = $v;
else {
if ($lowercase)
$arr[strtolower($k)] = $v;
else
$arr[strtoupper($k)] = $v;
}
}
$this->fields = $arr;
}
function MoveNext()
{
if (!$this->EOF) {
$this->_currentRow++;
if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
if (is_array($this->fields)) {
if ($this->fields) {
if (isset($this->_blobArr)) $this->_fixblobs();
$this->_updatefields();
}
return true;
}
}
$this->fields = false;
$this->EOF = true;
}
return false;
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-postgres8.inc.php
0,0 → 1,12
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4.
NOTE: The "postgres8" driver is remapped to "postgres7".
*/
 
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-proxy.inc.php
0,0 → 1,33
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4.
Synonym for csv driver.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (! defined("_ADODB_PROXY_LAYER")) {
define("_ADODB_PROXY_LAYER", 1 );
include(ADODB_DIR."/drivers/adodb-csv.inc.php");
class ADODB_proxy extends ADODB_csv {
var $databaseType = 'proxy';
var $databaseProvider = 'csv';
}
class ADORecordset_proxy extends ADORecordset_csv {
var $databaseType = "proxy";
function ADORecordset_proxy($id,$mode=false)
{
$this->ADORecordset($id,$mode);
}
};
} // define
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-sapdb.inc.php
0,0 → 1,184
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
SAPDB data driver. Requires ODBC.
 
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('_ADODB_ODBC_LAYER')) {
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
}
if (!defined('ADODB_SAPDB')){
define('ADODB_SAPDB',1);
 
class ADODB_SAPDB extends ADODB_odbc {
var $databaseType = "sapdb";
var $concat_operator = '||';
var $sysDate = 'DATE';
var $sysTimeStamp = 'TIMESTAMP';
var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database
var $fmtTimeStamp = "'Y-m-d H:i:s'"; /// used by DBTimeStamp as the default timestamp fmt.
var $hasInsertId = true;
var $_bindInputArray = true;
function ADODB_SAPDB()
{
//if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
$this->ADODB_odbc();
}
function ServerInfo()
{
$info = ADODB_odbc::ServerInfo();
if (!$info['version'] && preg_match('/([0-9.]+)/',$info['description'],$matches)) {
$info['version'] = $matches[1];
}
return $info;
}
 
function MetaPrimaryKeys($table)
{
$table = $this->Quote(strtoupper($table));
 
return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos");
}
function &MetaIndexes ($table, $primary = FALSE)
{
$table = $this->Quote(strtoupper($table));
 
$sql = "SELECT INDEXNAME,TYPE,COLUMNNAME FROM INDEXCOLUMNS ".
" WHERE TABLENAME=$table".
" ORDER BY INDEXNAME,COLUMNNO";
 
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
$rs = $this->Execute($sql);
if (isset($savem)) {
$this->SetFetchMode($savem);
}
$ADODB_FETCH_MODE = $save;
 
if (!is_object($rs)) {
return FALSE;
}
 
$indexes = array();
while ($row = $rs->FetchRow()) {
$indexes[$row[0]]['unique'] = $row[1] == 'UNIQUE';
$indexes[$row[0]]['columns'][] = $row[2];
}
if ($primary) {
$indexes['SYSPRIMARYKEYINDEX'] = array(
'unique' => True, // by definition
'columns' => $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"),
);
}
return $indexes;
}
function &MetaColumns ($table)
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
$table = $this->Quote(strtoupper($table));
$retarr = array();
foreach($this->GetAll("SELECT COLUMNNAME,DATATYPE,LEN,DEC,NULLABLE,MODE,\"DEFAULT\",CASE WHEN \"DEFAULT\" IS NULL THEN 0 ELSE 1 END AS HAS_DEFAULT FROM COLUMNS WHERE tablename=$table ORDER BY pos") as $column)
{
$fld = new ADOFieldObject();
$fld->name = $column[0];
$fld->type = $column[1];
$fld->max_length = $fld->type == 'LONG' ? 2147483647 : $column[2];
$fld->scale = $column[3];
$fld->not_null = $column[4] == 'NO';
$fld->primary_key = $column[5] == 'KEY';
if ($fld->has_default = $column[7]) {
if ($fld->primary_key && $column[6] == 'DEFAULT SERIAL (1)') {
$fld->auto_increment = true;
$fld->has_default = false;
} else {
$fld->default_value = $column[6];
switch($fld->type) {
case 'VARCHAR':
case 'CHARACTER':
case 'LONG':
$fld->default_value = $column[6];
break;
default:
$fld->default_value = trim($column[6]);
break;
}
}
}
$retarr[$fld->name] = $fld;
}
if (isset($savem)) {
$this->SetFetchMode($savem);
}
$ADODB_FETCH_MODE = $save;
 
return $retarr;
}
function MetaColumnNames($table)
{
$table = $this->Quote(strtoupper($table));
 
return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table ORDER BY pos");
}
// unlike it seems, this depends on the db-session and works in a multiuser environment
function _insertid($table,$column)
{
return empty($table) ? False : $this->GetOne("SELECT $table.CURRVAL FROM DUAL");
}
 
/*
SelectLimit implementation problems:
The following will return random 10 rows as order by performed after "WHERE rowno<10"
which is not ideal...
select * from table where rowno < 10 order by 1
This means that we have to use the adoconnection base class SelectLimit when
there is an "order by".
See http://listserv.sap.com/pipermail/sapdb.general/2002-January/010405.html
*/
};
 
class ADORecordSet_sapdb extends ADORecordSet_odbc {
var $databaseType = "sapdb";
function ADORecordSet_sapdb($id,$mode=false)
{
$this->ADORecordSet_odbc($id,$mode);
}
}
 
} //define
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-sqlanywhere.inc.php
0,0 → 1,169
<?php
/*
version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights
reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
 
Latest version is available at http://adodb.sourceforge.net
 
21.02.2002 - Wade Johnson wade@wadejohnson.de
Extended ODBC class for Sybase SQLAnywhere.
1) Added support to retrieve the last row insert ID on tables with
primary key column using autoincrement function.
 
2) Added blob support. Usage:
a) create blob variable on db server:
 
$dbconn->create_blobvar($blobVarName);
 
b) load blob var from file. $filename must be complete path
 
$dbcon->load_blobvar_from_file($blobVarName, $filename);
 
c) Use the $blobVarName in SQL insert or update statement in the values
clause:
 
$recordSet = $dbconn->Execute('INSERT INTO tabname (idcol, blobcol) '
.
'VALUES (\'test\', ' . $blobVarName . ')');
 
instead of loading blob from a file, you can also load from
an unformatted (raw) blob variable:
$dbcon->load_blobvar_from_var($blobVarName, $varName);
 
d) drop blob variable on db server to free up resources:
$dbconn->drop_blobvar($blobVarName);
 
Sybase_SQLAnywhere data driver. Requires ODBC.
 
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('_ADODB_ODBC_LAYER')) {
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
}
 
if (!defined('ADODB_SYBASE_SQLANYWHERE')){
 
define('ADODB_SYBASE_SQLANYWHERE',1);
 
class ADODB_sqlanywhere extends ADODB_odbc {
var $databaseType = "sqlanywhere";
var $hasInsertID = true;
function ADODB_sqlanywhere()
{
$this->ADODB_odbc();
}
 
function _insertid() {
return $this->GetOne('select @@identity');
}
 
function create_blobvar($blobVarName) {
$this->Execute("create variable $blobVarName long binary");
return;
}
 
function drop_blobvar($blobVarName) {
$this->Execute("drop variable $blobVarName");
return;
}
 
function load_blobvar_from_file($blobVarName, $filename) {
$chunk_size = 1000;
 
$fd = fopen ($filename, "rb");
 
$integer_chunks = (integer)filesize($filename) / $chunk_size;
$modulus = filesize($filename) % $chunk_size;
if ($modulus != 0){
$integer_chunks += 1;
}
 
for($loop=1;$loop<=$integer_chunks;$loop++){
$contents = fread ($fd, $chunk_size);
$contents = bin2hex($contents);
 
$hexstring = '';
 
for($loop2=0;$loop2<strlen($contents);$loop2+=2){
$hexstring .= '\x' . substr($contents,$loop2,2);
}
 
$hexstring = $this->qstr($hexstring);
 
$this->Execute("set $blobVarName = $blobVarName || " . $hexstring);
}
 
fclose ($fd);
return;
}
 
function load_blobvar_from_var($blobVarName, &$varName) {
$chunk_size = 1000;
 
$integer_chunks = (integer)strlen($varName) / $chunk_size;
$modulus = strlen($varName) % $chunk_size;
if ($modulus != 0){
$integer_chunks += 1;
}
 
for($loop=1;$loop<=$integer_chunks;$loop++){
$contents = substr ($varName, (($loop - 1) * $chunk_size), $chunk_size);
$contents = bin2hex($contents);
 
$hexstring = '';
 
for($loop2=0;$loop2<strlen($contents);$loop2+=2){
$hexstring .= '\x' . substr($contents,$loop2,2);
}
 
$hexstring = $this->qstr($hexstring);
 
$this->Execute("set $blobVarName = $blobVarName || " . $hexstring);
}
 
return;
}
 
/*
Insert a null into the blob field of the table first.
Then use UpdateBlob to store the blob.
 
Usage:
 
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
*/
function UpdateBlob($table,$column,&$val,$where,$blobtype='BLOB')
{
$blobVarName = 'hold_blob';
$this->create_blobvar($blobVarName);
$this->load_blobvar_from_var($blobVarName, $val);
$this->Execute("UPDATE $table SET $column=$blobVarName WHERE $where");
$this->drop_blobvar($blobVarName);
return true;
}
}; //class
 
class ADORecordSet_sqlanywhere extends ADORecordSet_odbc {
 
var $databaseType = "sqlanywhere";
 
function ADORecordSet_sqlanywhere($id,$mode=false)
{
$this->ADORecordSet_odbc($id,$mode);
}
 
 
}; //class
 
 
} //define
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-sqlite.inc.php
0,0 → 1,398
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
 
Latest version is available at http://adodb.sourceforge.net
SQLite info: http://www.hwaci.com/sw/sqlite/
Install Instructions:
====================
1. Place this in adodb/drivers
2. Rename the file, remove the .txt prefix.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB_sqlite extends ADOConnection {
var $databaseType = "sqlite";
var $replaceQuote = "''"; // string to use to replace quotes
var $concat_operator='||';
var $_errorNo = 0;
var $hasLimit = true;
var $hasInsertID = true; /// supports autoincrement ID?
var $hasAffectedRows = true; /// supports affected rows for update/delete?
var $metaTablesSQL = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";
var $sysDate = "adodb_date('Y-m-d')";
var $sysTimeStamp = "adodb_date('Y-m-d H:i:s')";
var $fmtTimeStamp = "'Y-m-d H:i:s'";
function ADODB_sqlite()
{
}
/*
function __get($name)
{
switch($name) {
case 'sysDate': return "'".date($this->fmtDate)."'";
case 'sysTimeStamp' : return "'".date($this->sysTimeStamp)."'";
}
}*/
function ServerInfo()
{
$arr['version'] = sqlite_libversion();
$arr['description'] = 'SQLite ';
$arr['encoding'] = sqlite_libencoding();
return $arr;
}
function BeginTrans()
{
if ($this->transOff) return true;
$ret = $this->Execute("BEGIN TRANSACTION");
$this->transCnt += 1;
return true;
}
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
$ret = $this->Execute("COMMIT");
if ($this->transCnt>0)$this->transCnt -= 1;
return !empty($ret);
}
function RollbackTrans()
{
if ($this->transOff) return true;
$ret = $this->Execute("ROLLBACK");
if ($this->transCnt>0)$this->transCnt -= 1;
return !empty($ret);
}
// mark newnham
function &MetaColumns($tab)
{
global $ADODB_FETCH_MODE;
$false = false;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
$rs = $this->Execute("PRAGMA table_info('$tab')");
if (isset($savem)) $this->SetFetchMode($savem);
if (!$rs) {
$ADODB_FETCH_MODE = $save;
return $false;
}
$arr = array();
while ($r = $rs->FetchRow()) {
$type = explode('(',$r['type']);
$size = '';
if (sizeof($type)==2)
$size = trim($type[1],')');
$fn = strtoupper($r['name']);
$fld = new ADOFieldObject;
$fld->name = $r['name'];
$fld->type = $type[0];
$fld->max_length = $size;
$fld->not_null = $r['notnull'];
$fld->default_value = $r['dflt_value'];
$fld->scale = 0;
if ($save == ADODB_FETCH_NUM) $arr[] = $fld;
else $arr[strtoupper($fld->name)] = $fld;
}
$rs->Close();
$ADODB_FETCH_MODE = $save;
return $arr;
}
function _init($parentDriver)
{
$parentDriver->hasTransactions = false;
$parentDriver->hasInsertID = true;
}
 
function _insertid()
{
return sqlite_last_insert_rowid($this->_connectionID);
}
function _affectedrows()
{
return sqlite_changes($this->_connectionID);
}
function ErrorMsg()
{
if ($this->_logsql) return $this->_errorMsg;
return ($this->_errorNo) ? sqlite_error_string($this->_errorNo) : '';
}
function ErrorNo()
{
return $this->_errorNo;
}
function SQLDate($fmt, $col=false)
{
$fmt = $this->qstr($fmt);
return ($col) ? "adodb_date2($fmt,$col)" : "adodb_date($fmt)";
}
function _createFunctions()
{
@sqlite_create_function($this->_connectionID, 'adodb_date', 'adodb_date', 1);
@sqlite_create_function($this->_connectionID, 'adodb_date2', 'adodb_date2', 2);
}
 
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('sqlite_open')) return null;
if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename;
$this->_connectionID = sqlite_open($argHostname);
if ($this->_connectionID === false) return false;
$this->_createFunctions();
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('sqlite_open')) return null;
if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename;
$this->_connectionID = sqlite_popen($argHostname);
if ($this->_connectionID === false) return false;
$this->_createFunctions();
return true;
}
 
// returns query ID if successful, otherwise false
function _query($sql,$inputarr=false)
{
$rez = sqlite_query($sql,$this->_connectionID);
if (!$rez) {
$this->_errorNo = sqlite_last_error($this->_connectionID);
}
return $rez;
}
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
{
$offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
$limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : '');
if ($secs2cache)
$rs =& $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
else
$rs =& $this->Execute($sql."$limitStr$offsetStr",$inputarr);
return $rs;
}
/*
This algorithm is not very efficient, but works even if table locking
is not available.
Will return false if unable to generate an ID after $MAXLOOPS attempts.
*/
var $_genSeqSQL = "create table %s (id integer)";
function GenID($seq='adodbseq',$start=1)
{
// if you have to modify the parameter below, your database is overloaded,
// or you need to implement generation of id's yourself!
$MAXLOOPS = 100;
//$this->debug=1;
while (--$MAXLOOPS>=0) {
@($num = $this->GetOne("select id from $seq"));
if ($num === false) {
$this->Execute(sprintf($this->_genSeqSQL ,$seq));
$start -= 1;
$num = '0';
$ok = $this->Execute("insert into $seq values($start)");
if (!$ok) return false;
}
$this->Execute("update $seq set id=id+1 where id=$num");
if ($this->affected_rows() > 0) {
$num += 1;
$this->genID = $num;
return $num;
}
}
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
}
return false;
}
 
function CreateSequence($seqname='adodbseq',$start=1)
{
if (empty($this->_genSeqSQL)) return false;
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
if (!$ok) return false;
$start -= 1;
return $this->Execute("insert into $seqname values($start)");
}
var $_dropSeqSQL = 'drop table %s';
function DropSequence($seqname)
{
if (empty($this->_dropSeqSQL)) return false;
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
}
// returns true or false
function _close()
{
return @sqlite_close($this->_connectionID);
}
 
function &MetaIndexes($table, $primary = FALSE, $owner=false)
{
$false = false;
// save old fetch mode
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->fetchMode !== FALSE) {
$savem = $this->SetFetchMode(FALSE);
}
$SQL=sprintf("SELECT name,sql FROM sqlite_master WHERE type='index' AND tbl_name='%s'", strtolower($table));
$rs = $this->Execute($SQL);
if (!is_object($rs)) {
if (isset($savem))
$this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
return $false;
}
 
$indexes = array ();
while ($row = $rs->FetchRow()) {
if ($primary && preg_match("/primary/i",$row[1]) == 0) continue;
if (!isset($indexes[$row[0]])) {
 
$indexes[$row[0]] = array(
'unique' => preg_match("/unique/i",$row[1]),
'columns' => array());
}
/**
* There must be a more elegant way of doing this,
* the index elements appear in the SQL statement
* in cols[1] between parentheses
* e.g CREATE UNIQUE INDEX ware_0 ON warehouse (org,warehouse)
*/
$cols = explode("(",$row[1]);
$cols = explode(")",$cols[1]);
array_pop($cols);
$indexes[$row[0]]['columns'] = $cols;
}
if (isset($savem)) {
$this->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
}
return $indexes;
}
 
}
 
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordset_sqlite extends ADORecordSet {
 
var $databaseType = "sqlite";
var $bind = false;
 
function ADORecordset_sqlite($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch($mode) {
case ADODB_FETCH_NUM: $this->fetchMode = SQLITE_NUM; break;
case ADODB_FETCH_ASSOC: $this->fetchMode = SQLITE_ASSOC; break;
default: $this->fetchMode = SQLITE_BOTH; break;
}
$this->adodbFetchMode = $mode;
$this->_queryID = $queryID;
$this->_inited = true;
$this->fields = array();
if ($queryID) {
$this->_currentRow = 0;
$this->EOF = !$this->_fetch();
@$this->_initrs();
} else {
$this->_numOfRows = 0;
$this->_numOfFields = 0;
$this->EOF = true;
}
return $this->_queryID;
}
 
 
function &FetchField($fieldOffset = -1)
{
$fld = new ADOFieldObject;
$fld->name = sqlite_field_name($this->_queryID, $fieldOffset);
$fld->type = 'VARCHAR';
$fld->max_length = -1;
return $fld;
}
function _initrs()
{
$this->_numOfRows = @sqlite_num_rows($this->_queryID);
$this->_numOfFields = @sqlite_num_fields($this->_queryID);
}
 
function Fields($colname)
{
if ($this->fetchMode != SQLITE_NUM) return $this->fields[$colname];
if (!$this->bind) {
$this->bind = array();
for ($i=0; $i < $this->_numOfFields; $i++) {
$o = $this->FetchField($i);
$this->bind[strtoupper($o->name)] = $i;
}
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
function _seek($row)
{
return sqlite_seek($this->_queryID, $row);
}
 
function _fetch($ignore_fields=false)
{
$this->fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode);
return !empty($this->fields);
}
function _close()
{
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-sqlitepo.inc.php
0,0 → 1,62
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
 
Portable version of sqlite driver, to make it more similar to other database drivers.
The main differences are
 
1. When selecting (joining) multiple tables, in assoc mode the table
names are included in the assoc keys in the "sqlite" driver.
In "sqlitepo" driver, the table names are stripped from the returned column names.
When this results in a conflict, the first field get preference.
 
Contributed by Herman Kuiper herman#ozuzo.net
*/
 
if (!defined('ADODB_DIR')) die();
 
include_once(ADODB_DIR.'/drivers/adodb-sqlite.inc.php');
 
class ADODB_sqlitepo extends ADODB_sqlite {
var $databaseType = 'sqlitepo';
 
function ADODB_sqlitepo()
{
$this->ADODB_sqlite();
}
}
 
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
 
class ADORecordset_sqlitepo extends ADORecordset_sqlite {
 
var $databaseType = 'sqlitepo';
 
function ADORecordset_sqlitepo($queryID,$mode=false)
{
$this->ADORecordset_sqlite($queryID,$mode);
}
// Modified to strip table names from returned fields
function _fetch($ignore_fields=false)
{
$this->fields = array();
$fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode);
if(is_array($fields))
foreach($fields as $n => $v)
{
if(($p = strpos($n, ".")) !== false)
$n = substr($n, $p+1);
$this->fields[$n] = $v;
}
 
return !empty($this->fields);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-sybase.inc.php
0,0 → 1,418
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim. All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Sybase driver contributed by Toni (toni.tunkkari@finebyte.com)
- MSSQL date patch applied.
Date patch by Toni 15 Feb 2002
*/
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class ADODB_sybase extends ADOConnection {
var $databaseType = "sybase";
var $dataProvider = 'sybase';
var $replaceQuote = "''"; // string to use to replace quotes
var $fmtDate = "'Y-m-d'";
var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $hasInsertID = true;
var $hasAffectedRows = true;
var $metaTablesSQL="select name from sysobjects where type='U' or type='V'";
// see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
var $metaColumnsSQL = "SELECT c.column_name, c.column_type, c.width FROM syscolumn c, systable t WHERE t.table_name='%s' AND c.table_id=t.table_id AND t.table_type='BASE'";
/*
"select c.name,t.name,c.length from
syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id
where o.name='%s'";
*/
var $concat_operator = '+';
var $arrayClass = 'ADORecordSet_array_sybase';
var $sysDate = 'GetDate()';
var $leftOuter = '*=';
var $rightOuter = '=*';
function ADODB_sybase()
{
}
// might require begintrans -- committrans
function _insertid()
{
return $this->GetOne('select @@identity');
}
// might require begintrans -- committrans
function _affectedrows()
{
return $this->GetOne('select @@rowcount');
}
 
function BeginTrans()
{
if ($this->transOff) return true;
$this->transCnt += 1;
$this->Execute('BEGIN TRAN');
return true;
}
function CommitTrans($ok=true)
{
if ($this->transOff) return true;
if (!$ok) return $this->RollbackTrans();
$this->transCnt -= 1;
$this->Execute('COMMIT TRAN');
return true;
}
function RollbackTrans()
{
if ($this->transOff) return true;
$this->transCnt -= 1;
$this->Execute('ROLLBACK TRAN');
return true;
}
// http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4
function RowLock($tables,$where,$flds='top 1 null as ignore')
{
if (!$this->_hastrans) $this->BeginTrans();
$tables = str_replace(',',' HOLDLOCK,',$tables);
return $this->GetOne("select $flds from $tables HOLDLOCK where $where");
}
function SelectDB($dbName)
{
$this->database = $dbName;
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
if ($this->_connectionID) {
return @sybase_select_db($dbName);
}
else return false;
}
 
/* Returns: the last error message from previous database operation
Note: This function is NOT available for Microsoft SQL Server. */
 
function ErrorMsg()
{
if ($this->_logsql) return $this->_errorMsg;
if (function_exists('sybase_get_last_message'))
$this->_errorMsg = sybase_get_last_message();
else
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform';
return $this->_errorMsg;
}
 
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('sybase_connect')) return null;
$this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('sybase_connect')) return null;
$this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword);
if ($this->_connectionID === false) return false;
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
// returns query ID if successful, otherwise false
function _query($sql,$inputarr)
{
global $ADODB_COUNTRECS;
if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300)
return sybase_unbuffered_query($sql,$this->_connectionID);
else
return sybase_query($sql,$this->_connectionID);
}
// See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
{
if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset
$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
return $rs;
}
$nrows = (integer) $nrows;
$offset = (integer) $offset;
$cnt = ($nrows >= 0) ? $nrows : 999999999;
if ($offset > 0 && $cnt) $cnt += $offset;
$this->Execute("set rowcount $cnt");
$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0);
$this->Execute("set rowcount 0");
return $rs;
}
 
// returns true or false
function _close()
{
return @sybase_close($this->_connectionID);
}
function UnixDate($v)
{
return ADORecordSet_array_sybase::UnixDate($v);
}
function UnixTimeStamp($v)
{
return ADORecordSet_array_sybase::UnixTimeStamp($v);
}
 
# Added 2003-10-05 by Chris Phillipson
# Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25
# to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
// Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false)
{
if (!$col) $col = $this->sysTimeStamp;
$s = '';
 
$len = strlen($fmt);
for ($i=0; $i < $len; $i++) {
if ($s) $s .= '+';
$ch = $fmt[$i];
switch($ch) {
case 'Y':
case 'y':
$s .= "datename(yy,$col)";
break;
case 'M':
$s .= "convert(char(3),$col,0)";
break;
case 'm':
$s .= "replace(str(month($col),2),' ','0')";
break;
case 'Q':
case 'q':
$s .= "datename(qq,$col)";
break;
case 'D':
case 'd':
$s .= "replace(str(datepart(dd,$col),2),' ','0')";
break;
case 'h':
$s .= "substring(convert(char(14),$col,0),13,2)";
break;
 
case 'H':
$s .= "replace(str(datepart(hh,$col),2),' ','0')";
break;
 
case 'i':
$s .= "replace(str(datepart(mi,$col),2),' ','0')";
break;
case 's':
$s .= "replace(str(datepart(ss,$col),2),' ','0')";
break;
case 'a':
case 'A':
$s .= "substring(convert(char(19),$col,0),18,2)";
break;
 
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
$s .= $this->qstr($ch);
break;
}
}
return $s;
}
# Added 2003-10-07 by Chris Phillipson
# Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
# to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
function MetaPrimaryKeys($table)
{
$sql = "SELECT c.column_name " .
"FROM syscolumn c, systable t " .
"WHERE t.table_name='$table' AND c.table_id=t.table_id " .
"AND t.table_type='BASE' " .
"AND c.pkey = 'Y' " .
"ORDER BY c.column_id";
 
$a = $this->GetCol($sql);
if ($a && sizeof($a)>0) return $a;
return false;
}
}
/*--------------------------------------------------------------------------------------
Class Name: Recordset
--------------------------------------------------------------------------------------*/
global $ADODB_sybase_mths;
$ADODB_sybase_mths = array(
'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,
'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
 
class ADORecordset_sybase extends ADORecordSet {
 
var $databaseType = "sybase";
var $canSeek = true;
// _mths works only in non-localised system
var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
 
function ADORecordset_sybase($id,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC;
else $this->fetchMode = $mode;
$this->ADORecordSet($id,$mode);
}
/* Returns: an object containing field information.
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
fetchField() is retrieved. */
function &FetchField($fieldOffset = -1)
{
if ($fieldOffset != -1) {
$o = @sybase_fetch_field($this->_queryID, $fieldOffset);
}
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
$o = @sybase_fetch_field($this->_queryID);
}
// older versions of PHP did not support type, only numeric
if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar';
return $o;
}
function _initrs()
{
global $ADODB_COUNTRECS;
$this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1;
$this->_numOfFields = @sybase_num_fields($this->_queryID);
}
function _seek($row)
{
return @sybase_data_seek($this->_queryID, $row);
}
 
function _fetch($ignore_fields=false)
{
if ($this->fetchMode == ADODB_FETCH_NUM) {
$this->fields = @sybase_fetch_row($this->_queryID);
} else if ($this->fetchMode == ADODB_FETCH_ASSOC) {
$this->fields = @sybase_fetch_row($this->_queryID);
if (is_array($this->fields)) {
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
return true;
}
return false;
} else {
$this->fields = @sybase_fetch_array($this->_queryID);
}
if ( is_array($this->fields)) {
return true;
}
 
return false;
}
/* close() only needs to be called if you are worried about using too much memory while your script
is running. All associated result memory for the specified result identifier will automatically be freed. */
function _close() {
return @sybase_free_result($this->_queryID);
}
// sybase/mssql uses a default date like Dec 30 2000 12:00AM
function UnixDate($v)
{
return ADORecordSet_array_sybase::UnixDate($v);
}
function UnixTimeStamp($v)
{
return ADORecordSet_array_sybase::UnixTimeStamp($v);
}
}
 
class ADORecordSet_array_sybase extends ADORecordSet_array {
function ADORecordSet_array_sybase($id=-1)
{
$this->ADORecordSet_array($id);
}
// sybase/mssql uses a default date like Dec 30 2000 12:00AM
function UnixDate($v)
{
global $ADODB_sybase_mths;
//Dec 30 2000 12:00AM
if (!ereg( "([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})"
,$v, $rr)) return parent::UnixDate($v);
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
$themth = substr(strtoupper($rr[1]),0,3);
$themth = $ADODB_sybase_mths[$themth];
if ($themth <= 0) return false;
// h-m-s-MM-DD-YY
return mktime(0,0,0,$themth,$rr[2],$rr[3]);
}
function UnixTimeStamp($v)
{
global $ADODB_sybase_mths;
//11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com
//Changed [0-9] to [0-9 ] in day conversion
if (!ereg( "([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})"
,$v, $rr)) return parent::UnixTimeStamp($v);
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
$themth = substr(strtoupper($rr[1]),0,3);
$themth = $ADODB_sybase_mths[$themth];
if ($themth <= 0) return false;
switch (strtoupper($rr[6])) {
case 'P':
if ($rr[4]<12) $rr[4] += 12;
break;
case 'A':
if ($rr[4]==12) $rr[4] = 0;
break;
default:
break;
}
// h-m-s-MM-DD-YY
return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-sybase_ase.inc.php
0,0 → 1,115
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4.
Contributed by Interakt Online. Thx Cristian MARIN cristic#interaktonline.com
*/
class ADODB_sybase_ase extends ADODB_sybase {
var $databaseType = "sybase_ase";
var $metaTablesSQL="SELECT sysobjects.name FROM sysobjects, sysusers WHERE sysobjects.type='U' AND sysobjects.uid = sysusers.uid";
var $metaColumnsSQL = "SELECT syscolumns.name AS field_name, systypes.name AS type, systypes.length AS width FROM sysobjects, syscolumns, systypes WHERE sysobjects.name='%s' AND syscolumns.id = sysobjects.id AND systypes.type=syscolumns.type";
var $metaDatabasesSQL ="SELECT a.name FROM master.dbo.sysdatabases a, master.dbo.syslogins b WHERE a.suid = b.suid and a.name like '%' and a.name != 'tempdb' and a.status3 != 256 order by 1";
 
function ADODB_sybase_ase()
{
}
// split the Views, Tables and procedures.
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
{
$false = false;
if ($this->metaTablesSQL) {
// complicated state saving by the need for backward compat
if ($ttype == 'VIEWS'){
$sql = str_replace('U', 'V', $this->metaTablesSQL);
}elseif (false === $ttype){
$sql = str_replace('U',"U' OR type='V", $this->metaTablesSQL);
}else{ // TABLES OR ANY OTHER
$sql = $this->metaTablesSQL;
}
$rs = $this->Execute($sql);
if ($rs === false || !method_exists($rs, 'GetArray')){
return $false;
}
$arr =& $rs->GetArray();
 
$arr2 = array();
foreach($arr as $key=>$value){
$arr2[] = trim($value['name']);
}
return $arr2;
}
return $false;
}
 
function MetaDatabases()
{
$arr = array();
if ($this->metaDatabasesSQL!='') {
$rs = $this->Execute($this->metaDatabasesSQL);
if ($rs && !$rs->EOF){
while (!$rs->EOF){
$arr[] = $rs->Fields('name');
$rs->MoveNext();
}
return $arr;
}
}
return false;
}
 
// fix a bug which prevent the metaColumns query to be executed for Sybase ASE
function &MetaColumns($table,$upper=false)
{
$false = false;
if (!empty($this->metaColumnsSQL)) {
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
if ($rs === false) return $false;
 
$retarr = array();
while (!$rs->EOF) {
$fld =& new ADOFieldObject();
$fld->name = $rs->Fields('field_name');
$fld->type = $rs->Fields('type');
$fld->max_length = $rs->Fields('width');
$retarr[strtoupper($fld->name)] = $fld;
$rs->MoveNext();
}
$rs->Close();
return $retarr;
}
return $false;
}
function getProcedureList($schema)
{
return false;
}
 
function ErrorMsg()
{
if (!function_exists('sybase_connect')){
return 'Your PHP doesn\'t contain the Sybase connection module!';
}
return parent::ErrorMsg();
}
}
 
class adorecordset_sybase_ase extends ADORecordset_sybase {
var $databaseType = "sybase_ase";
function ADORecordset_sybase_ase($id,$mode=false)
{
$this->ADORecordSet_sybase($id,$mode);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/drivers/adodb-vfp.inc.php
0,0 → 1,107
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Microsoft Visual FoxPro data driver. Requires ODBC. Works only on MS Windows.
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
if (!defined('_ADODB_ODBC_LAYER')) {
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
}
if (!defined('ADODB_VFP')){
define('ADODB_VFP',1);
class ADODB_vfp extends ADODB_odbc {
var $databaseType = "vfp";
var $fmtDate = "{^Y-m-d}";
var $fmtTimeStamp = "{^Y-m-d, h:i:sA}";
var $replaceQuote = "'+chr(39)+'" ;
var $true = '.T.';
var $false = '.F.';
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
var $_bindInputArray = false; // strangely enough, setting to true does not work reliably
var $sysTimeStamp = 'datetime()';
var $sysDate = 'date()';
var $ansiOuter = true;
var $hasTransactions = false;
var $curmode = false ; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L
function ADODB_vfp()
{
$this->ADODB_odbc();
}
function Time()
{
return time();
}
function BeginTrans() { return false;}
// quote string to be sent back to database
function qstr($s,$nofixquotes=false)
{
if (!$nofixquotes) return "'".str_replace("\r\n","'+chr(13)+'",str_replace("'",$this->replaceQuote,$s))."'";
return "'".$s."'";
}
 
// TOP requires ORDER BY for VFP
function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
{
$this->hasTop = preg_match('/ORDER[ \t\r\n]+BY/is',$sql) ? 'top' : false;
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
return $ret;
}
 
 
};
 
class ADORecordSet_vfp extends ADORecordSet_odbc {
var $databaseType = "vfp";
 
function ADORecordSet_vfp($id,$mode=false)
{
return $this->ADORecordSet_odbc($id,$mode);
}
 
function MetaType($t,$len=-1)
{
if (is_object($t)) {
$fieldobj = $t;
$t = $fieldobj->type;
$len = $fieldobj->max_length;
}
switch (strtoupper($t)) {
case 'C':
if ($len <= $this->blobSize) return 'C';
case 'M':
return 'X';
case 'D': return 'D';
case 'T': return 'T';
case 'L': return 'L';
case 'I': return 'I';
default: return 'N';
}
}
}
 
} //define
?>
/web/kaklik's_web/torrentflux/adodb/drivers/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/adodb/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-ar.inc.php
0,0 → 1,34
<?php
// by "El-Shamaa, Khaled" <k.el-shamaa#cgiar.org>
$ADODB_LANG_ARRAY = array (
'LANG' => 'ar',
DB_ERROR => 'ÎØà ÛíÑ ãÍÏÏ',
DB_ERROR_ALREADY_EXISTS => 'ãæÌæÏ ãÓÈÞÇ',
DB_ERROR_CANNOT_CREATE => 'áÇ íãßä ÅäÔÇÁ',
DB_ERROR_CANNOT_DELETE => 'áÇ íãßä ÍÐÝ',
DB_ERROR_CANNOT_DROP => 'áÇ íãßä ÍÐÝ',
DB_ERROR_CONSTRAINT => 'ÚãáíÉ ÅÏÎÇá ããäæÚÉ',
DB_ERROR_DIVZERO => 'ÚãáíÉ ÇáÊÞÓíã Úáì ÕÝÑ',
DB_ERROR_INVALID => 'ÛíÑ ÕÍíÍ',
DB_ERROR_INVALID_DATE => 'ÕíÛÉ æÞÊ Ãæ ÊÇÑíÎ ÛíÑ ÕÍíÍÉ',
DB_ERROR_INVALID_NUMBER => 'ÕíÛÉ ÑÞã ÛíÑ ÕÍíÍÉ',
DB_ERROR_MISMATCH => 'ÛíÑ ãÊØÇÈÞ',
DB_ERROR_NODBSELECTED => 'áã íÊã ÅÎÊíÇÑ ÞÇÚÏÉ ÇáÈíÇäÇÊ ÈÚÏ',
DB_ERROR_NOSUCHFIELD => 'áíÓ åäÇáß ÍÞá ÈåÐÇ ÇáÇÓã',
DB_ERROR_NOSUCHTABLE => 'áíÓ åäÇáß ÌÏæá ÈåÐÇ ÇáÇÓã',
DB_ERROR_NOT_CAPABLE => 'ÞÇÚÏÉ ÇáÈíÇäÇÊ ÇáãÑÊÈØ ÈåÇ ÛíÑ ÞÇÏÑÉ',
DB_ERROR_NOT_FOUND => 'áã íÊã ÅíÌÇÏå',
DB_ERROR_NOT_LOCKED => 'ÛíÑ ãÞÝæá',
DB_ERROR_SYNTAX => 'ÎØÃ Ýí ÇáÕíÛÉ',
DB_ERROR_UNSUPPORTED => 'ÛíÑ ãÏÚæã',
DB_ERROR_VALUE_COUNT_ON_ROW => 'ÚÏÏ ÇáÞíã Ýí ÇáÓÌá',
DB_ERROR_INVALID_DSN => 'DSN ÛíÑ ÕÍíÍ',
DB_ERROR_CONNECT_FAILED => 'ÝÔá ÚãáíÉ ÇáÅÊÕÇá',
0 => 'áíÓ åäÇáß ÃÎØÇÁ', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'ÇáÈíÇäÇÊ ÇáãÒæÏÉ ÛíÑ ßÇÝíÉ',
DB_ERROR_EXTENSION_NOT_FOUND=> 'áã íÊã ÅíÌÇÏ ÇáÅÖÇÝÉ ÇáãÊÚáÞÉ',
DB_ERROR_NOSUCHDB => 'áíÓ åäÇáß ÞÇÚÏÉ ÈíÇäÇÊ ÈåÐÇ ÇáÇÓã',
DB_ERROR_ACCESS_VIOLATION => 'ÓãÇÍíÇÊ ÛíÑ ßÇÝíÉ'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-bg.inc.php
0,0 → 1,38
<?php
/*
Bulgarian language, v1.0, 25.03.2004, encoding by Windows-1251 charset
contributed by Valentin Sheiretsky <valio#valio.eu.org>
*/
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'bg',
DB_ERROR => 'íåèçâåñòíà ãðåøêà',
DB_ERROR_ALREADY_EXISTS => 'âå÷å ñúùåñòâóâà',
DB_ERROR_CANNOT_CREATE => 'íå ìîæå äà áúäå ñúçäàäåíà',
DB_ERROR_CANNOT_DELETE => 'íå ìîæå äà áúäå èçòðèòà',
DB_ERROR_CANNOT_DROP => 'íå ìîæå äà áúäå óíèùîæåíà',
DB_ERROR_CONSTRAINT => 'íàðóøåíî óñëîâèå',
DB_ERROR_DIVZERO => 'äåëåíèå íà íóëà',
DB_ERROR_INVALID => 'íåïðàâèëíî',
DB_ERROR_INVALID_DATE => 'íåêîðåêòíà äàòà èëè ÷àñ',
DB_ERROR_INVALID_NUMBER => 'íåâàëèäåí íîìåð',
DB_ERROR_MISMATCH => 'ïîãðåøíà óïîòðåáà',
DB_ERROR_NODBSELECTED => 'íå å èçáðàíà áàçà äàííè',
DB_ERROR_NOSUCHFIELD => 'íåñúùåñòâóâàùî ïîëå',
DB_ERROR_NOSUCHTABLE => 'íåñúùåñòâóâàùà òàáëèöà',
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
DB_ERROR_NOT_FOUND => 'íå å íàìåðåíà',
DB_ERROR_NOT_LOCKED => 'íå å çàêëþ÷åíà',
DB_ERROR_SYNTAX => 'ãðåøåí ñèíòàêñèñ',
DB_ERROR_UNSUPPORTED => 'íå ñå ïîääúðæà',
DB_ERROR_VALUE_COUNT_ON_ROW => 'íåêîðåêòåí áðîé êîëîíè â ðåäà',
DB_ERROR_INVALID_DSN => 'íåâàëèäåí DSN',
DB_ERROR_CONNECT_FAILED => 'âðúçêàòà íå ìîæå äà áúäå îñúùåñòâåíà',
0 => 'íÿìà ãðåøêè', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'ïðåäîñòàâåíèòå äàííè ñà íåäîñòàòú÷íè',
DB_ERROR_EXTENSION_NOT_FOUND=> 'ðàçøèðåíèåòî íå å íàìåðåíî',
DB_ERROR_NOSUCHDB => 'íåñúùåñòâóâàùà áàçà äàííè',
DB_ERROR_ACCESS_VIOLATION => 'íÿìàòå äîñòàòú÷íî ïðàâà'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-bgutf8.inc.php
0,0 → 1,38
<?php
/*
Bulgarian language, v1.0, 25.03.2004, encoding by UTF-8 charset
contributed by Valentin Sheiretsky <valio#valio.eu.org>
*/
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'bgutf8',
DB_ERROR => 'неизвестна грешка',
DB_ERROR_ALREADY_EXISTS => 'вече съществува',
DB_ERROR_CANNOT_CREATE => 'не може да бъде създадена',
DB_ERROR_CANNOT_DELETE => 'не може да бъде изтрита',
DB_ERROR_CANNOT_DROP => 'не може да бъде унищожена',
DB_ERROR_CONSTRAINT => 'нарушено условие',
DB_ERROR_DIVZERO => 'деление на нула',
DB_ERROR_INVALID => 'неправилно',
DB_ERROR_INVALID_DATE => 'некоректна дата или час',
DB_ERROR_INVALID_NUMBER => 'невалиден номер',
DB_ERROR_MISMATCH => 'погрешна употреба',
DB_ERROR_NODBSELECTED => 'не е избрана база данни',
DB_ERROR_NOSUCHFIELD => 'несъществуващо поле',
DB_ERROR_NOSUCHTABLE => 'несъществуваща таблица',
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
DB_ERROR_NOT_FOUND => 'не е намерена',
DB_ERROR_NOT_LOCKED => 'не е заключена',
DB_ERROR_SYNTAX => 'грешен синтаксис',
DB_ERROR_UNSUPPORTED => 'не се поддържа',
DB_ERROR_VALUE_COUNT_ON_ROW => 'некоректен брой колони в реда',
DB_ERROR_INVALID_DSN => 'невалиден DSN',
DB_ERROR_CONNECT_FAILED => 'връзката не може да бъде осъществена',
0 => 'няма грешки', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'предоставените данни са недостатъчни',
DB_ERROR_EXTENSION_NOT_FOUND=> 'разширението не е намерено',
DB_ERROR_NOSUCHDB => 'несъществуваща база данни',
DB_ERROR_ACCESS_VIOLATION => 'нямате достатъчно права'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-ca.inc.php
0,0 → 1,35
<?php
// Catalan language
// contributed by "Josep Lladonosa" jlladono#pie.xtec.es
$ADODB_LANG_ARRAY = array (
'LANG' => 'ca',
DB_ERROR => 'error desconegut',
DB_ERROR_ALREADY_EXISTS => 'ja existeix',
DB_ERROR_CANNOT_CREATE => 'no es pot crear',
DB_ERROR_CANNOT_DELETE => 'no es pot esborrar',
DB_ERROR_CANNOT_DROP => 'no es pot eliminar',
DB_ERROR_CONSTRAINT => 'violació de constraint',
DB_ERROR_DIVZERO => 'divisió per zero',
DB_ERROR_INVALID => 'no és vàlid',
DB_ERROR_INVALID_DATE => 'la data o l\'hora no són vàlides',
DB_ERROR_INVALID_NUMBER => 'el nombre no és vàlid',
DB_ERROR_MISMATCH => 'no hi ha coincidència',
DB_ERROR_NODBSELECTED => 'cap base de dades seleccionada',
DB_ERROR_NOSUCHFIELD => 'camp inexistent',
DB_ERROR_NOSUCHTABLE => 'taula inexistent',
DB_ERROR_NOT_CAPABLE => 'l\'execució secundària de DB no pot',
DB_ERROR_NOT_FOUND => 'no trobat',
DB_ERROR_NOT_LOCKED => 'no blocat',
DB_ERROR_SYNTAX => 'error de sintaxi',
DB_ERROR_UNSUPPORTED => 'no suportat',
DB_ERROR_VALUE_COUNT_ON_ROW => 'el nombre de columnes no coincideix amb el nombre de valors en la fila',
DB_ERROR_INVALID_DSN => 'el DSN no és vàlid',
DB_ERROR_CONNECT_FAILED => 'connexió fallida',
0 => 'cap error', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'les dades subministrades són insuficients',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensió no trobada',
DB_ERROR_NOSUCHDB => 'base de dades inexistent',
DB_ERROR_ACCESS_VIOLATION => 'permisos insuficients'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-cn.inc.php
0,0 → 1,35
<?php
// Chinese language file contributed by "Cuiyan (cysoft)" cysoft#php.net.
// Encode by GB2312
// Simplified Chinese
$ADODB_LANG_ARRAY = array (
'LANG' => 'cn',
DB_ERROR => 'δ֪´íÎó',
DB_ERROR_ALREADY_EXISTS => 'ÒѾ­´æÔÚ',
DB_ERROR_CANNOT_CREATE => '²»ÄÜ´´½¨',
DB_ERROR_CANNOT_DELETE => '²»ÄÜɾ³ý',
DB_ERROR_CANNOT_DROP => '²»ÄܶªÆú',
DB_ERROR_CONSTRAINT => 'Ô¼ÊøÏÞÖÆ',
DB_ERROR_DIVZERO => '±»0³ý',
DB_ERROR_INVALID => 'ÎÞЧ',
DB_ERROR_INVALID_DATE => 'ÎÞЧµÄÈÕÆÚ»òÕßʱ¼ä',
DB_ERROR_INVALID_NUMBER => 'ÎÞЧµÄÊý×Ö',
DB_ERROR_MISMATCH => '²»Æ¥Åä',
DB_ERROR_NODBSELECTED => 'ûÓÐÊý¾Ý¿â±»Ñ¡Ôñ',
DB_ERROR_NOSUCHFIELD => 'ûÓÐÏàÓ¦µÄ×Ö¶Î',
DB_ERROR_NOSUCHTABLE => 'ûÓÐÏàÓ¦µÄ±í',
DB_ERROR_NOT_CAPABLE => 'Êý¾Ý¿âºǫ́²»¼æÈÝ',
DB_ERROR_NOT_FOUND => 'ûÓз¢ÏÖ',
DB_ERROR_NOT_LOCKED => 'ûÓб»Ëø¶¨',
DB_ERROR_SYNTAX => 'Óï·¨´íÎó',
DB_ERROR_UNSUPPORTED => '²»Ö§³Ö',
DB_ERROR_VALUE_COUNT_ON_ROW => 'ÔÚÐÐÉÏÀÛ¼ÆÖµ',
DB_ERROR_INVALID_DSN => 'ÎÞЧµÄÊý¾ÝÔ´ (DSN)',
DB_ERROR_CONNECT_FAILED => 'Á¬½Óʧ°Ü',
0 => 'ûÓдíÎó', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'ÌṩµÄÊý¾Ý²»ÄÜ·ûºÏÒªÇó',
DB_ERROR_EXTENSION_NOT_FOUND=> 'À©Õ¹Ã»Óб»·¢ÏÖ',
DB_ERROR_NOSUCHDB => 'ûÓÐÏàÓ¦µÄÊý¾Ý¿â',
DB_ERROR_ACCESS_VIOLATION => 'ûÓкÏÊʵÄȨÏÞ'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-cz.inc.php
0,0 → 1,40
<?php
 
# Czech language, encoding by ISO 8859-2 charset (Iso Latin-2)
# For convert to MS Windows use shell command:
# iconv -f ISO_8859-2 -t CP1250 < adodb-cz.inc.php
# For convert to ASCII use shell command:
# unaccent ISO_8859-2 < adodb-cz.inc.php
# v1.0, 19.06.2003 Kamil Jakubovic <jake@host.sk>
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'cz',
DB_ERROR => 'neznámá chyba',
DB_ERROR_ALREADY_EXISTS => 'ji? existuje',
DB_ERROR_CANNOT_CREATE => 'nelze vytvo?it',
DB_ERROR_CANNOT_DELETE => 'nelze smazat',
DB_ERROR_CANNOT_DROP => 'nelze odstranit',
DB_ERROR_CONSTRAINT => 'poru?ení omezující podmínky',
DB_ERROR_DIVZERO => 'd?lení nulou',
DB_ERROR_INVALID => 'neplatné',
DB_ERROR_INVALID_DATE => 'neplatné datum nebo ?as',
DB_ERROR_INVALID_NUMBER => 'neplatné ?íslo',
DB_ERROR_MISMATCH => 'nesouhlasí',
DB_ERROR_NODBSELECTED => '?ádná databáze není vybrána',
DB_ERROR_NOSUCHFIELD => 'pole nenalezeno',
DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena',
DB_ERROR_NOT_CAPABLE => 'nepodporováno',
DB_ERROR_NOT_FOUND => 'nenalezeno',
DB_ERROR_NOT_LOCKED => 'nezam?eno',
DB_ERROR_SYNTAX => 'syntaktická chyba',
DB_ERROR_UNSUPPORTED => 'nepodporováno',
DB_ERROR_VALUE_COUNT_ON_ROW => '',
DB_ERROR_INVALID_DSN => 'neplatné DSN',
DB_ERROR_CONNECT_FAILED => 'p?ipojení selhalo',
0 => 'bez chyb', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'málo zdrojových dat',
DB_ERROR_EXTENSION_NOT_FOUND=> 'roz?í?ení nenalezeno',
DB_ERROR_NOSUCHDB => 'databáze neexistuje',
DB_ERROR_ACCESS_VIOLATION => 'nedostate?ná práva'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-da.inc.php
0,0 → 1,33
<?php
// Arne Eckmann bananstat#users.sourceforge.net
$ADODB_LANG_ARRAY = array (
'LANG' => 'da',
DB_ERROR => 'ukendt fejl',
DB_ERROR_ALREADY_EXISTS => 'eksisterer allerede',
DB_ERROR_CANNOT_CREATE => 'kan ikke oprette',
DB_ERROR_CANNOT_DELETE => 'kan ikke slette',
DB_ERROR_CANNOT_DROP => 'kan ikke droppe',
DB_ERROR_CONSTRAINT => 'begr&aelig;nsning kr&aelig;nket',
DB_ERROR_DIVZERO => 'division med nul',
DB_ERROR_INVALID => 'ugyldig',
DB_ERROR_INVALID_DATE => 'ugyldig dato eller klokkeslet',
DB_ERROR_INVALID_NUMBER => 'ugyldigt tal',
DB_ERROR_MISMATCH => 'mismatch',
DB_ERROR_NODBSELECTED => 'ingen database valgt',
DB_ERROR_NOSUCHFIELD => 'felt findes ikke',
DB_ERROR_NOSUCHTABLE => 'tabel findes ikke',
DB_ERROR_NOT_CAPABLE => 'DB backend opgav',
DB_ERROR_NOT_FOUND => 'ikke fundet',
DB_ERROR_NOT_LOCKED => 'ikke l&aring;st',
DB_ERROR_SYNTAX => 'syntaksfejl',
DB_ERROR_UNSUPPORTED => 'ikke underst&oslash;ttet',
DB_ERROR_VALUE_COUNT_ON_ROW => 'resulterende antal felter svarer ikke til foresp&oslash;rgslens antal felter',
DB_ERROR_INVALID_DSN => 'ugyldig DSN',
DB_ERROR_CONNECT_FAILED => 'tilslutning mislykkedes',
0 => 'ingen fejl', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'utilstr&aelig;kkelige data angivet',
DB_ERROR_EXTENSION_NOT_FOUND=> 'udvidelse ikke fundet',
DB_ERROR_NOSUCHDB => 'database ikke fundet',
DB_ERROR_ACCESS_VIOLATION => 'utilstr&aelig;kkelige rettigheder'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-de.inc.php
0,0 → 1,33
<?php
// contributed by "Heinz Hombergs" <opn@hhombergs.de>
$ADODB_LANG_ARRAY = array (
'LANG' => 'de',
DB_ERROR => 'Unbekannter Fehler',
DB_ERROR_ALREADY_EXISTS => 'existiert bereits',
DB_ERROR_CANNOT_CREATE => 'kann nicht erstellen',
DB_ERROR_CANNOT_DELETE => 'kann nicht l&ouml;schen',
DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gel&ouml;scht werden',
DB_ERROR_CONSTRAINT => 'Constraint Verletzung',
DB_ERROR_DIVZERO => 'Division durch Null',
DB_ERROR_INVALID => 'ung&uml;ltig',
DB_ERROR_INVALID_DATE => 'ung&uml;ltiges Datum oder Zeit',
DB_ERROR_INVALID_NUMBER => 'ung&uml;ltige Zahl',
DB_ERROR_MISMATCH => 'Unvertr&auml;glichkeit',
DB_ERROR_NODBSELECTED => 'keine Dantebank ausgew&auml;hlt',
DB_ERROR_NOSUCHFIELD => 'Feld nicht vorhanden',
DB_ERROR_NOSUCHTABLE => 'Tabelle nicht vorhanden',
DB_ERROR_NOT_CAPABLE => 'Funktion nicht installiert',
DB_ERROR_NOT_FOUND => 'nicht gefunden',
DB_ERROR_NOT_LOCKED => 'nicht gesperrt',
DB_ERROR_SYNTAX => 'Syntaxfehler',
DB_ERROR_UNSUPPORTED => 'nicht Unterst&uml;tzt',
DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur&uml;ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage',
DB_ERROR_INVALID_DSN => 'ung&uml;ltiger DSN',
DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden',
0 => 'kein Fehler', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'Nicht gen&uml;gend Daten geliefert',
DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden',
DB_ERROR_NOSUCHDB => 'keine Datenbank',
DB_ERROR_ACCESS_VIOLATION => 'ungen&uml;gende Rechte'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-en.inc.php
0,0 → 1,34
<?php
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'en',
DB_ERROR => 'unknown error',
DB_ERROR_ALREADY_EXISTS => 'already exists',
DB_ERROR_CANNOT_CREATE => 'can not create',
DB_ERROR_CANNOT_DELETE => 'can not delete',
DB_ERROR_CANNOT_DROP => 'can not drop',
DB_ERROR_CONSTRAINT => 'constraint violation',
DB_ERROR_DIVZERO => 'division by zero',
DB_ERROR_INVALID => 'invalid',
DB_ERROR_INVALID_DATE => 'invalid date or time',
DB_ERROR_INVALID_NUMBER => 'invalid number',
DB_ERROR_MISMATCH => 'mismatch',
DB_ERROR_NODBSELECTED => 'no database selected',
DB_ERROR_NOSUCHFIELD => 'no such field',
DB_ERROR_NOSUCHTABLE => 'no such table',
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
DB_ERROR_NOT_FOUND => 'not found',
DB_ERROR_NOT_LOCKED => 'not locked',
DB_ERROR_SYNTAX => 'syntax error',
DB_ERROR_UNSUPPORTED => 'not supported',
DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
DB_ERROR_INVALID_DSN => 'invalid DSN',
DB_ERROR_CONNECT_FAILED => 'connect failed',
0 => 'no error', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',
DB_ERROR_NOSUCHDB => 'no such database',
DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-es.inc.php
0,0 → 1,33
<?php
// contributed by "Horacio Degiorgi" <horaciod@codigophp.com>
$ADODB_LANG_ARRAY = array (
'LANG' => 'es',
DB_ERROR => 'error desconocido',
DB_ERROR_ALREADY_EXISTS => 'ya existe',
DB_ERROR_CANNOT_CREATE => 'imposible crear',
DB_ERROR_CANNOT_DELETE => 'imposible borrar',
DB_ERROR_CANNOT_DROP => 'imposible hacer drop',
DB_ERROR_CONSTRAINT => 'violacion de constraint',
DB_ERROR_DIVZERO => 'division por cero',
DB_ERROR_INVALID => 'invalido',
DB_ERROR_INVALID_DATE => 'fecha u hora invalida',
DB_ERROR_INVALID_NUMBER => 'numero invalido',
DB_ERROR_MISMATCH => 'error',
DB_ERROR_NODBSELECTED => 'no hay base de datos seleccionada',
DB_ERROR_NOSUCHFIELD => 'campo invalido',
DB_ERROR_NOSUCHTABLE => 'tabla no existe',
DB_ERROR_NOT_CAPABLE => 'capacidad invalida para esta DB',
DB_ERROR_NOT_FOUND => 'no encontrado',
DB_ERROR_NOT_LOCKED => 'no bloqueado',
DB_ERROR_SYNTAX => 'error de sintaxis',
DB_ERROR_UNSUPPORTED => 'no soportado',
DB_ERROR_VALUE_COUNT_ON_ROW => 'la cantidad de columnas no corresponden a la cantidad de valores',
DB_ERROR_INVALID_DSN => 'DSN invalido',
DB_ERROR_CONNECT_FAILED => 'fallo la conexion',
0 => 'sin error', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'insuficientes datos',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension no encontrada',
DB_ERROR_NOSUCHDB => 'base de datos no encontrada',
DB_ERROR_ACCESS_VIOLATION => 'permisos insuficientes'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-esperanto.inc.php
0,0 → 1,35
<?php
// Vivu Esperanto cxiam!
// Traduko fare de Antono Vasiljev (anders[#]brainactive.org)
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'eo',
DB_ERROR => 'nekonata eraro',
DB_ERROR_ALREADY_EXISTS => 'jam ekzistas',
DB_ERROR_CANNOT_CREATE => 'maleblas krei',
DB_ERROR_CANNOT_DELETE => 'maleblas elimini',
DB_ERROR_CANNOT_DROP => 'maleblas elimini (drop)',
DB_ERROR_CONSTRAINT => 'rompo de kondicxoj de provo',
DB_ERROR_DIVZERO => 'divido per 0 (nul)',
DB_ERROR_INVALID => 'malregule',
DB_ERROR_INVALID_DATE => 'malregula dato kaj tempo',
DB_ERROR_INVALID_NUMBER => 'malregula nombro',
DB_ERROR_MISMATCH => 'eraro',
DB_ERROR_NODBSELECTED => 'datumbazo ne elektita',
DB_ERROR_NOSUCHFIELD => 'ne ekzistas kampo',
DB_ERROR_NOSUCHTABLE => 'ne ekzistas tabelo',
DB_ERROR_NOT_CAPABLE => 'DBMS ne povas',
DB_ERROR_NOT_FOUND => 'ne trovita',
DB_ERROR_NOT_LOCKED => 'ne blokita',
DB_ERROR_SYNTAX => 'sintaksa eraro',
DB_ERROR_UNSUPPORTED => 'ne apogata',
DB_ERROR_VALUE_COUNT_ON_ROW => 'nombrilo de valoroj en linio',
DB_ERROR_INVALID_DSN => 'malregula DSN-o',
DB_ERROR_CONNECT_FAILED => 'konekto malsukcesa',
0 => 'cxio bone', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'ne suficxe da datumo',
DB_ERROR_EXTENSION_NOT_FOUND=> 'etendo ne trovita',
DB_ERROR_NOSUCHDB => 'datumbazo ne ekzistas',
DB_ERROR_ACCESS_VIOLATION => 'ne suficxe da rajto por atingo'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-fr.inc.php
0,0 → 1,33
<?php
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'fr',
DB_ERROR => 'erreur inconnue',
DB_ERROR_ALREADY_EXISTS => 'existe d&eacute;j&agrave;',
DB_ERROR_CANNOT_CREATE => 'cr&eacute;tion impossible',
DB_ERROR_CANNOT_DELETE => 'effacement impossible',
DB_ERROR_CANNOT_DROP => 'suppression impossible',
DB_ERROR_CONSTRAINT => 'violation de contrainte',
DB_ERROR_DIVZERO => 'division par z&eacute;ro',
DB_ERROR_INVALID => 'invalide',
DB_ERROR_INVALID_DATE => 'date ou heure invalide',
DB_ERROR_INVALID_NUMBER => 'nombre invalide',
DB_ERROR_MISMATCH => 'erreur de concordance',
DB_ERROR_NODBSELECTED => 'pas de base de donn&eacute;ess&eacute;lectionn&eacute;e',
DB_ERROR_NOSUCHFIELD => 'nom de colonne invalide',
DB_ERROR_NOSUCHTABLE => 'table ou vue inexistante',
DB_ERROR_NOT_CAPABLE => 'fonction optionnelle non install&eacute;e',
DB_ERROR_NOT_FOUND => 'pas trouv&eacute;',
DB_ERROR_NOT_LOCKED => 'non verrouill&eacute;',
DB_ERROR_SYNTAX => 'erreur de syntaxe',
DB_ERROR_UNSUPPORTED => 'non support&eacute;',
DB_ERROR_VALUE_COUNT_ON_ROW => 'valeur ins&eacute;r&eacute;e trop grande pour colonne',
DB_ERROR_INVALID_DSN => 'DSN invalide',
DB_ERROR_CONNECT_FAILED => '&eacute;chec &agrave; la connexion',
0 => "pas d'erreur", // DB_OK
DB_ERROR_NEED_MORE_DATA => 'donn&eacute;es fournies insuffisantes',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension non trouv&eacute;e',
DB_ERROR_NOSUCHDB => 'base de donn&eacute;es inconnue',
DB_ERROR_ACCESS_VIOLATION => 'droits insuffisants'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-hu.inc.php
0,0 → 1,34
<?php
# Hungarian language, encoding by ISO 8859-2 charset (Iso Latin-2)
# Halászvári Gábor <g.halaszvari#portmax.hu>
$ADODB_LANG_ARRAY = array (
'LANG' => 'hu',
DB_ERROR => 'ismeretlen hiba',
DB_ERROR_ALREADY_EXISTS => 'már létezik',
DB_ERROR_CANNOT_CREATE => 'nem sikerült létrehozni',
DB_ERROR_CANNOT_DELETE => 'nem sikerült törölni',
DB_ERROR_CANNOT_DROP => 'nem sikerült eldobni',
DB_ERROR_CONSTRAINT => 'szabályok megszegése',
DB_ERROR_DIVZERO => 'osztás nullával',
DB_ERROR_INVALID => 'érvénytelen',
DB_ERROR_INVALID_DATE => 'érvénytelen dátum vagy idõ',
DB_ERROR_INVALID_NUMBER => 'érvénytelen szám',
DB_ERROR_MISMATCH => 'nem megfelelõ',
DB_ERROR_NODBSELECTED => 'nincs kiválasztott adatbázis',
DB_ERROR_NOSUCHFIELD => 'nincs ilyen mezõ',
DB_ERROR_NOSUCHTABLE => 'nincs ilyen tábla',
DB_ERROR_NOT_CAPABLE => 'DB backend nem támogatja',
DB_ERROR_NOT_FOUND => 'nem található',
DB_ERROR_NOT_LOCKED => 'nincs lezárva',
DB_ERROR_SYNTAX => 'szintaktikai hiba',
DB_ERROR_UNSUPPORTED => 'nem támogatott',
DB_ERROR_VALUE_COUNT_ON_ROW => 'soron végzett érték számlálás',
DB_ERROR_INVALID_DSN => 'hibás DSN',
DB_ERROR_CONNECT_FAILED => 'sikertelen csatlakozás',
0 => 'nincs hiba', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'túl kevés az adat',
DB_ERROR_EXTENSION_NOT_FOUND=> 'bõvítmény nem található',
DB_ERROR_NOSUCHDB => 'nincs ilyen adatbázis',
DB_ERROR_ACCESS_VIOLATION => 'nincs jogosultság'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-it.inc.php
0,0 → 1,34
<?php
// Italian language file contributed by Tiraboschi Massimiliano aka TiMax
// www.maxdev.com timax@maxdev.com
$ADODB_LANG_ARRAY = array (
'LANG' => 'it',
DB_ERROR => 'errore sconosciuto',
DB_ERROR_ALREADY_EXISTS => 'esiste gi&agrave;',
DB_ERROR_CANNOT_CREATE => 'non posso creare',
DB_ERROR_CANNOT_DELETE => 'non posso cancellare',
DB_ERROR_CANNOT_DROP => 'non posso eliminare',
DB_ERROR_CONSTRAINT => 'violazione constraint',
DB_ERROR_DIVZERO => 'divisione per zero',
DB_ERROR_INVALID => 'non valido',
DB_ERROR_INVALID_DATE => 'data od ora non valida',
DB_ERROR_INVALID_NUMBER => 'numero non valido',
DB_ERROR_MISMATCH => 'diversi',
DB_ERROR_NODBSELECTED => 'nessun database selezionato',
DB_ERROR_NOSUCHFIELD => 'nessun campo trovato',
DB_ERROR_NOSUCHTABLE => 'nessuna tabella trovata',
DB_ERROR_NOT_CAPABLE => 'DB backend non abilitato',
DB_ERROR_NOT_FOUND => 'non trovato',
DB_ERROR_NOT_LOCKED => 'non bloccato',
DB_ERROR_SYNTAX => 'errore di sintassi',
DB_ERROR_UNSUPPORTED => 'non supportato',
DB_ERROR_VALUE_COUNT_ON_ROW => 'valore inserito troppo grande per una colonna',
DB_ERROR_INVALID_DSN => 'DSN non valido',
DB_ERROR_CONNECT_FAILED => 'connessione fallita',
0 => 'nessun errore', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'dati inseriti insufficienti',
DB_ERROR_EXTENSION_NOT_FOUND=> 'estensione non trovata',
DB_ERROR_NOSUCHDB => 'database non trovato',
DB_ERROR_ACCESS_VIOLATION => 'permessi insufficienti'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-nl.inc.php
0,0 → 1,33
<?php
// Translated by Pim Koeman (pim#wittenborg-university.com)
$ADODB_LANG_ARRAY = array (
'LANG' => 'nl',
DB_ERROR => 'onbekende fout',
DB_ERROR_ALREADY_EXISTS => 'bestaat al',
DB_ERROR_CANNOT_CREATE => 'kan niet aanmaken',
DB_ERROR_CANNOT_DELETE => 'kan niet wissen',
DB_ERROR_CANNOT_DROP => 'kan niet verwijderen',
DB_ERROR_CONSTRAINT => 'constraint overtreding',
DB_ERROR_DIVZERO => 'poging tot delen door nul',
DB_ERROR_INVALID => 'ongeldig',
DB_ERROR_INVALID_DATE => 'ongeldige datum of tijd',
DB_ERROR_INVALID_NUMBER => 'ongeldig nummer',
DB_ERROR_MISMATCH => 'is incorrect',
DB_ERROR_NODBSELECTED => 'geen database geselecteerd',
DB_ERROR_NOSUCHFIELD => 'onbekend veld',
DB_ERROR_NOSUCHTABLE => 'onbekende tabel',
DB_ERROR_NOT_CAPABLE => 'database systeem is niet tot uitvoer in staat',
DB_ERROR_NOT_FOUND => 'niet gevonden',
DB_ERROR_NOT_LOCKED => 'niet vergrendeld',
DB_ERROR_SYNTAX => 'syntaxis fout',
DB_ERROR_UNSUPPORTED => 'niet ondersteund',
DB_ERROR_VALUE_COUNT_ON_ROW => 'waarde telling op rij',
DB_ERROR_INVALID_DSN => 'ongeldige DSN',
DB_ERROR_CONNECT_FAILED => 'connectie mislukt',
0 => 'geen fout', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'onvoldoende data gegeven',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie niet gevonden',
DB_ERROR_NOSUCHDB => 'onbekende database',
DB_ERROR_ACCESS_VIOLATION => 'onvoldoende rechten'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-pl.inc.php
0,0 → 1,36
<?php
 
// Contributed by Grzegorz Pacan <gp#dione.cc>
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'pl',
DB_ERROR => 'niezidentyfikowany b³±d',
DB_ERROR_ALREADY_EXISTS => 'ju¿ istniej±',
DB_ERROR_CANNOT_CREATE => 'nie mo¿na stworzyæ',
DB_ERROR_CANNOT_DELETE => 'nie mo¿na usun±æ',
DB_ERROR_CANNOT_DROP => 'nie mo¿na porzuciæ',
DB_ERROR_CONSTRAINT => 'pogwa³cenie uprawnieñ',
DB_ERROR_DIVZERO => 'dzielenie przez zero',
DB_ERROR_INVALID => 'b³êdny',
DB_ERROR_INVALID_DATE => 'b³êdna godzina lub data',
DB_ERROR_INVALID_NUMBER => 'b³êdny numer',
DB_ERROR_MISMATCH => 'niedopasowanie',
DB_ERROR_NODBSELECTED => 'baza danych nie zosta³a wybrana',
DB_ERROR_NOSUCHFIELD => 'nie znaleziono pola',
DB_ERROR_NOSUCHTABLE => 'nie znaleziono tabeli',
DB_ERROR_NOT_CAPABLE => 'nie zdolny',
DB_ERROR_NOT_FOUND => 'nie znaleziono',
DB_ERROR_NOT_LOCKED => 'nie zakmniêty',
DB_ERROR_SYNTAX => 'b³±d sk³adni',
DB_ERROR_UNSUPPORTED => 'nie obs³uguje',
DB_ERROR_VALUE_COUNT_ON_ROW => 'warto¶æ liczona w szeregu',
DB_ERROR_INVALID_DSN => 'b³êdny DSN',
DB_ERROR_CONNECT_FAILED => 'po³±czenie nie zosta³o zrealizowane',
0 => 'brak b³êdów', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'niedostateczna ilo¶æ informacji',
DB_ERROR_EXTENSION_NOT_FOUND=> 'nie znaleziono rozszerzenia',
DB_ERROR_NOSUCHDB => 'nie znaleziono bazy',
DB_ERROR_ACCESS_VIOLATION => 'niedostateczne uprawnienia'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-pt-br.inc.php
0,0 → 1,35
<?php
// contributed by "Levi Fukumori" levi _AT_ fukumori _DOT_ com _DOT_ br
// portugese (brazilian)
$ADODB_LANG_ARRAY = array (
'LANG' => 'pt-br',
DB_ERROR => 'erro desconhecido',
DB_ERROR_ALREADY_EXISTS => 'já existe',
DB_ERROR_CANNOT_CREATE => 'impossível criar',
DB_ERROR_CANNOT_DELETE => 'impossível excluír',
DB_ERROR_CANNOT_DROP => 'impossível remover',
DB_ERROR_CONSTRAINT => 'violação do confinamente',
DB_ERROR_DIVZERO => 'divisão por zero',
DB_ERROR_INVALID => 'inválido',
DB_ERROR_INVALID_DATE => 'data ou hora inválida',
DB_ERROR_INVALID_NUMBER => 'número inválido',
DB_ERROR_MISMATCH => 'erro',
DB_ERROR_NODBSELECTED => 'nenhum banco de dados selecionado',
DB_ERROR_NOSUCHFIELD => 'campo inválido',
DB_ERROR_NOSUCHTABLE => 'tabela inexistente',
DB_ERROR_NOT_CAPABLE => 'capacidade inválida para este BD',
DB_ERROR_NOT_FOUND => 'não encontrado',
DB_ERROR_NOT_LOCKED => 'não bloqueado',
DB_ERROR_SYNTAX => 'erro de sintaxe',
DB_ERROR_UNSUPPORTED =>
'não suportado',
DB_ERROR_VALUE_COUNT_ON_ROW => 'a quantidade de colunas não corresponde ao de valores',
DB_ERROR_INVALID_DSN => 'DSN inválido',
DB_ERROR_CONNECT_FAILED => 'falha na conexão',
0 => 'sem erro', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'dados insuficientes',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensão não encontrada',
DB_ERROR_NOSUCHDB => 'banco de dados não encontrado',
DB_ERROR_ACCESS_VIOLATION => 'permissão insuficiente'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-ro.inc.php
0,0 → 1,36
<?php
 
/* Romanian - by "bogdan stefan" <sbogdan#rsb.ro> */
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'ro',
DB_ERROR => 'eroare necunoscuta',
DB_ERROR_ALREADY_EXISTS => 'deja exista',
DB_ERROR_CANNOT_CREATE => 'nu se poate creea',
DB_ERROR_CANNOT_DELETE => 'nu se poate sterge',
DB_ERROR_CANNOT_DROP => 'nu se poate executa drop',
DB_ERROR_CONSTRAINT => 'violare de constrain',
DB_ERROR_DIVZERO => 'se divide la zero',
DB_ERROR_INVALID => 'invalid',
DB_ERROR_INVALID_DATE => 'data sau timp invalide',
DB_ERROR_INVALID_NUMBER => 'numar invalid',
DB_ERROR_MISMATCH => 'nepotrivire-mismatch',
DB_ERROR_NODBSELECTED => 'nu exista baza de date selectata',
DB_ERROR_NOSUCHFIELD => 'camp inexistent',
DB_ERROR_NOSUCHTABLE => 'tabela inexistenta',
DB_ERROR_NOT_CAPABLE => 'functie optionala neinstalata',
DB_ERROR_NOT_FOUND => 'negasit',
DB_ERROR_NOT_LOCKED => 'neblocat',
DB_ERROR_SYNTAX => 'eroare de sintaxa',
DB_ERROR_UNSUPPORTED => 'nu e suportat',
DB_ERROR_VALUE_COUNT_ON_ROW => 'valoare prea mare pentru coloana',
DB_ERROR_INVALID_DSN => 'DSN invalid',
DB_ERROR_CONNECT_FAILED => 'conectare esuata',
0 => 'fara eroare', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'data introduse insuficiente',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie negasita',
DB_ERROR_NOSUCHDB => 'nu exista baza de date',
DB_ERROR_ACCESS_VIOLATION => 'permisiuni insuficiente'
);
?>
 
/web/kaklik's_web/torrentflux/adodb/lang/adodb-ru1251.inc.php
0,0 → 1,35
<?php
 
// Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru.
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'ru1251',
DB_ERROR => 'íåèçâåñòíàÿ îøèáêà',
DB_ERROR_ALREADY_EXISTS => 'óæå ñóùåñòâóåò',
DB_ERROR_CANNOT_CREATE => 'íåâîçìîæíî ñîçäàòü',
DB_ERROR_CANNOT_DELETE => 'íåâîçìîæíî óäàëèòü',
DB_ERROR_CANNOT_DROP => 'íåâîçìîæíî óäàëèòü (drop)',
DB_ERROR_CONSTRAINT => 'íàðóøåíèå óñëîâèé ïðîâåðêè',
DB_ERROR_DIVZERO => 'äåëåíèå íà 0',
DB_ERROR_INVALID => 'íåïðàâèëüíî',
DB_ERROR_INVALID_DATE => 'íåêîððåêòíàÿ äàòà èëè âðåìÿ',
DB_ERROR_INVALID_NUMBER => 'íåêîððåêòíîå ÷èñëî',
DB_ERROR_MISMATCH => 'îøèáêà',
DB_ERROR_NODBSELECTED => 'ÁÄ íå âûáðàíà',
DB_ERROR_NOSUCHFIELD => 'íå ñóùåñòâóåò ïîëå',
DB_ERROR_NOSUCHTABLE => 'íå ñóùåñòâóåò òàáëèöà',
DB_ERROR_NOT_CAPABLE => 'ÑÓÁÄ íå â ñîñòîÿíèè',
DB_ERROR_NOT_FOUND => 'íå íàéäåíî',
DB_ERROR_NOT_LOCKED => 'íå çàáëîêèðîâàíî',
DB_ERROR_SYNTAX => 'ñèíòàêñè÷åñêàÿ îøèáêà',
DB_ERROR_UNSUPPORTED => 'íå ïîääåðæèâàåòñÿ',
DB_ERROR_VALUE_COUNT_ON_ROW => 'ñ÷åò÷èê çíà÷åíèé â ñòðîêå',
DB_ERROR_INVALID_DSN => 'íåïðàâèëüíàÿ DSN',
DB_ERROR_CONNECT_FAILED => 'ñîåäèíåíèå íåóñïåøíî',
0 => 'íåò îøèáêè', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'ïðåäîñòàâëåíî íåäîñòàòî÷íî äàííûõ',
DB_ERROR_EXTENSION_NOT_FOUND=> 'ðàñøèðåíèå íå íàéäåíî',
DB_ERROR_NOSUCHDB => 'íå ñóùåñòâóåò ÁÄ',
DB_ERROR_ACCESS_VIOLATION => 'íåäîñòàòî÷íî ïðàâ äîñòóïà'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-sv.inc.php
0,0 → 1,33
<?php
// Christian Tiberg" christian@commsoft.nu
$ADODB_LANG_ARRAY = array (
'LANG' => 'en',
DB_ERROR => 'Okänt fel',
DB_ERROR_ALREADY_EXISTS => 'finns redan',
DB_ERROR_CANNOT_CREATE => 'kan inte skapa',
DB_ERROR_CANNOT_DELETE => 'kan inte ta bort',
DB_ERROR_CANNOT_DROP => 'kan inte släppa',
DB_ERROR_CONSTRAINT => 'begränsning kränkt',
DB_ERROR_DIVZERO => 'division med noll',
DB_ERROR_INVALID => 'ogiltig',
DB_ERROR_INVALID_DATE => 'ogiltigt datum eller tid',
DB_ERROR_INVALID_NUMBER => 'ogiltigt tal',
DB_ERROR_MISMATCH => 'felaktig matchning',
DB_ERROR_NODBSELECTED => 'ingen databas vald',
DB_ERROR_NOSUCHFIELD => 'inget sådant fält',
DB_ERROR_NOSUCHTABLE => 'ingen sådan tabell',
DB_ERROR_NOT_CAPABLE => 'DB backend klarar det inte',
DB_ERROR_NOT_FOUND => 'finns inte',
DB_ERROR_NOT_LOCKED => 'inte låst',
DB_ERROR_SYNTAX => 'syntaxfel',
DB_ERROR_UNSUPPORTED => 'stöds ej',
DB_ERROR_VALUE_COUNT_ON_ROW => 'värde räknat på rad',
DB_ERROR_INVALID_DSN => 'ogiltig DSN',
DB_ERROR_CONNECT_FAILED => 'anslutning misslyckades',
0 => 'inget fel', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'otillräckligt med data angivet',
DB_ERROR_EXTENSION_NOT_FOUND=> 'utökning hittades ej',
DB_ERROR_NOSUCHDB => 'ingen sådan databas',
DB_ERROR_ACCESS_VIOLATION => 'otillräckliga rättigheter'
);
?>
/web/kaklik's_web/torrentflux/adodb/lang/adodb-uk1251.inc.php
0,0 → 1,35
<?php
 
// Ukrainian language file contributed by Alex Rootoff rootoff{AT}pisem.net.
 
$ADODB_LANG_ARRAY = array (
'LANG' => 'uk1251',
DB_ERROR => 'íåâ³äîìà ïîìèëêà',
DB_ERROR_ALREADY_EXISTS => 'âæå ³ñíóº',
DB_ERROR_CANNOT_CREATE => 'íåìîæëèâî ñòâîðèòè',
DB_ERROR_CANNOT_DELETE => 'íåìîæëèâî âèäàëèòè',
DB_ERROR_CANNOT_DROP => 'íåìîæëèâî çíèùèòè (drop)',
DB_ERROR_CONSTRAINT => 'ïîðóøåííÿ óìîâ ïåðåâ³ðêè',
DB_ERROR_DIVZERO => 'ä³ëåííÿ íà 0',
DB_ERROR_INVALID => 'íåïðàâèëüíî',
DB_ERROR_INVALID_DATE => 'íåïðàâèëüíà äàòà ÷è ÷àñ',
DB_ERROR_INVALID_NUMBER => 'íåïðàâèëüíå ÷èñëî',
DB_ERROR_MISMATCH => 'ïîìèëêà',
DB_ERROR_NODBSELECTED => 'íå âèáðàíî ÁÄ',
DB_ERROR_NOSUCHFIELD => 'íå ³ñíóº ïîëå',
DB_ERROR_NOSUCHTABLE => 'íå ³ñíóº òàáëèöÿ',
DB_ERROR_NOT_CAPABLE => 'ÑÓÁÄ íå â ñòàí³',
DB_ERROR_NOT_FOUND => 'íå çíàéäåíî',
DB_ERROR_NOT_LOCKED => 'íå çàáëîêîâàíî',
DB_ERROR_SYNTAX => 'ñèíòàêñè÷íà ïîìèëêà',
DB_ERROR_UNSUPPORTED => 'íå ï³äòðèìóºòüñÿ',
DB_ERROR_VALUE_COUNT_ON_ROW => 'ðàõ³âíèê çíà÷åíü â ñòð³÷ö³',
DB_ERROR_INVALID_DSN => 'íåïðàâèëüíà DSN',
DB_ERROR_CONNECT_FAILED => 'ç\'ºäíàííÿ íåóñï³øíå',
0 => 'âñå ãàðàçä', // DB_OK
DB_ERROR_NEED_MORE_DATA => 'íàäàíî íåäîñòàòíüî äàíèõ',
DB_ERROR_EXTENSION_NOT_FOUND=> 'ðîçøèðåííÿ íå çíàéäåíî',
DB_ERROR_NOSUCHDB => 'íå ³ñíóº ÁÄ',
DB_ERROR_ACCESS_VIOLATION => 'íåäîñòàòíüî ïðàâ äîñòóïà'
);
?>
/web/kaklik's_web/torrentflux/adodb/license.txt
0,0 → 1,182
ADOdb is dual licensed using BSD and LGPL.
 
In plain English, you do not need to distribute your application in source code form, nor do you need to distribute ADOdb source code, provided you follow the rest of terms of the BSD license.
 
For more info about ADOdb, visit http://adodb.sourceforge.net/
 
BSD Style-License
=================
 
Copyright (c) 2000, 2001, 2002, 2003, 2004 John Lim
All rights reserved.
 
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
 
Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.
 
Redistributions in binary form must reproduce the above copyright notice, this list
of conditions and the following disclaimer in the documentation and/or other materials
provided with the distribution.
 
Neither the name of the John Lim nor the names of its contributors may be used to
endorse or promote products derived from this software without specific prior written
permission.
 
DISCLAIMER:
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
JOHN LIM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
==========================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
 
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
 
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
 
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
 
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
 
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
 
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
 
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
 
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
 
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
 
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
 
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
 
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
 
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
 
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
 
 
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
 
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
 
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
 
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
 
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
 
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
 
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
 
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
 
 
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
 
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
 
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
 
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
 
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
 
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
 
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
 
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
 
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
 
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
 
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
 
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
 
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
 
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
 
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
 
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
 
 
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
 
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
 
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
 
 
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
 
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
 
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
 
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
 
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
 
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
 
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
 
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
 
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
 
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
 
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
 
NO WARRANTY
 
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
 
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 
 
END OF TERMS AND CONDITIONS
/web/kaklik's_web/torrentflux/adodb/pear/Auth/Container/ADOdb.php
0,0 → 1,413
<?php
//
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Martin Jansen <mj@php.net>
// | Richard Tango-Lowy <richtl@arscognita.com> |
// +----------------------------------------------------------------------+
//
// $Id: ADOdb.php,v 1.3 2005/05/18 06:58:47 jlim Exp $
//
 
require_once 'Auth/Container.php';
require_once 'adodb.inc.php';
require_once 'adodb-pear.inc.php';
require_once 'adodb-errorpear.inc.php';
 
/**
* Storage driver for fetching login data from a database using ADOdb-PHP.
*
* This storage driver can use all databases which are supported
* by the ADBdb DB abstraction layer to fetch login data.
* See http://php.weblogs.com/adodb for information on ADOdb.
* NOTE: The ADOdb directory MUST be in your PHP include_path!
*
* @author Richard Tango-Lowy <richtl@arscognita.com>
* @package Auth
* @version $Revision: 1.3 $
*/
class Auth_Container_ADOdb extends Auth_Container
{
 
/**
* Additional options for the storage container
* @var array
*/
var $options = array();
 
/**
* DB object
* @var object
*/
var $db = null;
var $dsn = '';
/**
* User that is currently selected from the DB.
* @var string
*/
var $activeUser = '';
 
// {{{ Constructor
 
/**
* Constructor of the container class
*
* Initate connection to the database via PEAR::ADOdb
*
* @param string Connection data or DB object
* @return object Returns an error object if something went wrong
*/
function Auth_Container_ADOdb($dsn)
{
$this->_setDefaults();
if (is_array($dsn)) {
$this->_parseOptions($dsn);
 
if (empty($this->options['dsn'])) {
PEAR::raiseError('No connection parameters specified!');
}
} else {
// Extract db_type from dsn string.
$this->options['dsn'] = $dsn;
}
}
 
// }}}
// {{{ _connect()
 
/**
* Connect to database by using the given DSN string
*
* @access private
* @param string DSN string
* @return mixed Object on error, otherwise bool
*/
function _connect($dsn)
{
if (is_string($dsn) || is_array($dsn)) {
if(!$this->db) {
$this->db = &ADONewConnection($dsn);
if( $err = ADODB_Pear_error() ) {
return PEAR::raiseError($err);
}
}
} else {
return PEAR::raiseError('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__,
41,
PEAR_ERROR_RETURN,
null,
null
);
}
if(!$this->db) {
return PEAR::raiseError(ADODB_Pear_error());
} else {
return true;
}
}
 
// }}}
// {{{ _prepare()
 
/**
* Prepare database connection
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
*
* @access private
* @return mixed True or a DB error object.
*/
function _prepare()
{
if(!$this->db) {
$res = $this->_connect($this->options['dsn']);
}
return true;
}
 
// }}}
// {{{ query()
 
/**
* Prepare query to the database
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
* After that the query is passed to the database.
*
* @access public
* @param string Query string
* @return mixed a DB_result object or DB_OK on success, a DB
* or PEAR error on failure
*/
function query($query)
{
$err = $this->_prepare();
if ($err !== true) {
return $err;
}
return $this->db->query($query);
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
* @return void
*/
function _setDefaults()
{
$this->options['db_type'] = 'mysql';
$this->options['table'] = 'auth';
$this->options['usernamecol'] = 'username';
$this->options['passwordcol'] = 'password';
$this->options['dsn'] = '';
$this->options['db_fields'] = '';
$this->options['cryptType'] = 'md5';
}
 
// }}}
// {{{ _parseOptions()
 
/**
* Parse options passed to the container class
*
* @access private
* @param array
*/
function _parseOptions($array)
{
foreach ($array as $key => $value) {
if (isset($this->options[$key])) {
$this->options[$key] = $value;
}
}
 
/* Include additional fields if they exist */
if(!empty($this->options['db_fields'])){
if(is_array($this->options['db_fields'])){
$this->options['db_fields'] = join($this->options['db_fields'], ', ');
}
$this->options['db_fields'] = ', '.$this->options['db_fields'];
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from database
*
* This function uses the given username to fetch
* the corresponding login data from the database
* table. If an account that matches the passed username
* and password is found, the function returns true.
* Otherwise it returns false.
*
* @param string Username
* @param string Password
* @return mixed Error object or boolean
*/
function fetchData($username, $password)
{
// Prepare for a database query
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
// Find if db_fields contains a *, i so assume all col are selected
if(strstr($this->options['db_fields'], '*')){
$sql_from = "*";
}
else{
$sql_from = $this->options['usernamecol'] . ", ".$this->options['passwordcol'].$this->options['db_fields'];
}
$query = "SELECT ".$sql_from.
" FROM ".$this->options['table'].
" WHERE ".$this->options['usernamecol']." = " . $this->db->Quote($username);
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rset = $this->db->Execute( $query );
$res = $rset->fetchRow();
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
}
if (!is_array($res)) {
$this->activeUser = '';
return false;
}
if ($this->verifyPassword(trim($password, "\r\n"),
trim($res[$this->options['passwordcol']], "\r\n"),
$this->options['cryptType'])) {
// Store additional field values in the session
foreach ($res as $key => $value) {
if ($key == $this->options['passwordcol'] ||
$key == $this->options['usernamecol']) {
continue;
}
// Use reference to the auth object if exists
// This is because the auth session variable can change so a static call to setAuthData does not make sence
if(is_object($this->_auth_obj)){
$this->_auth_obj->setAuthData($key, $value);
} else {
Auth::setAuthData($key, $value);
}
}
 
return true;
}
 
$this->activeUser = $res[$this->options['usernamecol']];
return false;
}
 
// }}}
// {{{ listUsers()
 
function listUsers()
{
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
$retVal = array();
 
// Find if db_fileds contains a *, i so assume all col are selected
if(strstr($this->options['db_fields'], '*')){
$sql_from = "*";
}
else{
$sql_from = $this->options['usernamecol'] . ", ".$this->options['passwordcol'].$this->options['db_fields'];
}
 
$query = sprintf("SELECT %s FROM %s",
$sql_from,
$this->options['table']
);
$res = $this->db->getAll($query, null, DB_FETCHMODE_ASSOC);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
foreach ($res as $user) {
$user['username'] = $user[$this->options['usernamecol']];
$retVal[] = $user;
}
}
return $retVal;
}
 
// }}}
// {{{ addUser()
 
/**
* Add user to the storage container
*
* @access public
* @param string Username
* @param string Password
* @param mixed Additional information that are stored in the DB
*
* @return mixed True on success, otherwise error object
*/
function addUser($username, $password, $additional = "")
{
if (function_exists($this->options['cryptType'])) {
$cryptFunction = $this->options['cryptType'];
} else {
$cryptFunction = 'md5';
}
 
$additional_key = '';
$additional_value = '';
 
if (is_array($additional)) {
foreach ($additional as $key => $value) {
$additional_key .= ', ' . $key;
$additional_value .= ", '" . $value . "'";
}
}
 
$query = sprintf("INSERT INTO %s (%s, %s%s) VALUES ('%s', '%s'%s)",
$this->options['table'],
$this->options['usernamecol'],
$this->options['passwordcol'],
$additional_key,
$username,
$cryptFunction($password),
$additional_value
);
 
$res = $this->query($query);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
return true;
}
}
 
// }}}
// {{{ removeUser()
 
/**
* Remove user from the storage container
*
* @access public
* @param string Username
*
* @return mixed True on success, otherwise error object
*/
function removeUser($username)
{
$query = sprintf("DELETE FROM %s WHERE %s = '%s'",
$this->options['table'],
$this->options['usernamecol'],
$username
);
 
$res = $this->query($query);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
return true;
}
}
 
// }}}
}
 
function showDbg( $string ) {
print "
-- $string</P>";
}
function dump( $var, $str, $vardump = false ) {
print "<H4>$str</H4><pre>";
( !$vardump ) ? ( print_r( $var )) : ( var_dump( $var ));
print "</pre>";
}
?>
/web/kaklik's_web/torrentflux/adodb/pear/readme.Auth.txt
0,0 → 1,20
From: Rich Tango-Lowy (richtl#arscognita.com)
Date: Sat, May 29, 2004 11:20 am
 
OK, I hacked out an ADOdb container for PEAR-Auth. The error handling's
a bit of a mess, but all the methods work.
 
Copy ADOdb.php to your pear/Auth/Container/ directory.
 
Use the ADOdb container exactly as you would the DB
container, but specify 'ADOdb' instead of 'DB':
 
$dsn = "mysql://myuser:mypass@localhost/authdb";
$a = new Auth("ADOdb", $dsn, "loginFunction");
 
 
-------------------
 
John Lim adds:
 
See http://pear.php.net/manual/en/package.authentication.php
/web/kaklik's_web/torrentflux/adodb/perf/perf-db2.inc.php
0,0 → 1,102
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Library for basic performance monitoring and tuning
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
// Simple guide to configuring db2: so-so http://www.devx.com/gethelpon/10MinuteSolution/16575
 
// SELECT * FROM TABLE(SNAPSHOT_APPL('SAMPLE', -1)) as t
class perf_db2 extends adodb_perf{
var $createTableSQL = "CREATE TABLE adodb_logsql (
created TIMESTAMP NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 varchar(4000) NOT NULL,
params varchar(3000) NOT NULL,
tracer varchar(500) NOT NULL,
timer decimal(16,6) NOT NULL
)";
var $settings = array(
'Ratios',
'data cache hit ratio' => array('RATIO',
"SELECT
case when sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)=0 then 0
else 100*(1-sum(POOL_DATA_P_READS+POOL_INDEX_P_READS)/sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)) end
FROM TABLE(SNAPSHOT_APPL('',-2)) as t",
'=WarnCacheRatio'),
'Data Cache',
'data cache buffers' => array('DATAC',
'select sum(npages) from SYSCAT.BUFFERPOOLS',
'See <a href=http://www7b.boulder.ibm.com/dmdd/library/techarticle/anshum/0107anshum.html#bufferpoolsize>tuning reference</a>.' ),
'cache blocksize' => array('DATAC',
'select avg(pagesize) from SYSCAT.BUFFERPOOLS',
'' ),
'data cache size' => array('DATAC',
'select sum(npages*pagesize) from SYSCAT.BUFFERPOOLS',
'' ),
'Connections',
'current connections' => array('SESS',
"SELECT count(*) FROM TABLE(SNAPSHOT_APPL_INFO('',-2)) as t",
''),
 
false
);
 
 
function perf_db2(&$conn)
{
$this->conn =& $conn;
}
function Explain($sql,$partial=false)
{
$save = $this->conn->LogSQL(false);
if ($partial) {
$sqlq = $this->conn->qstr($sql.'%');
$arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
if ($arr) {
foreach($arr as $row) {
$sql = reset($row);
if (crc32($sql) == $partial) break;
}
}
}
$qno = rand();
$ok = $this->conn->Execute("EXPLAIN PLAN SET QUERYNO=$qno FOR $sql");
ob_start();
if (!$ok) echo "<p>Have EXPLAIN tables been created?</p>";
else {
$rs = $this->conn->Execute("select * from explain_statement where queryno=$qno");
if ($rs) rs2html($rs);
}
$s = ob_get_contents();
ob_end_clean();
$this->conn->LogSQL($save);
$s .= $this->Tracer($sql);
return $s;
}
function Tables()
{
$rs = $this->conn->Execute("select tabschema,tabname,card as rows,
npages pages_used,fpages pages_allocated, tbspace tablespace
from syscat.tables where tabschema not in ('SYSCAT','SYSIBM','SYSSTAT') order by 1,2");
return rs2html($rs,false,false,false,false);
}
}
?>
/web/kaklik's_web/torrentflux/adodb/perf/perf-informix.inc.php
0,0 → 1,70
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Library for basic performance monitoring and tuning
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
//
// Thx to Fernando Ortiz, mailto:fortiz#lacorona.com.mx
// With info taken from http://www.oninit.com/oninit/sysmaster/index.html
//
class perf_informix extends adodb_perf{
 
// Maximum size on varchar upto 9.30 255 chars
// better truncate varchar to 255 than char(4000) ?
var $createTableSQL = "CREATE TABLE adodb_logsql (
created datetime year to second NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 varchar(255) NOT NULL,
params varchar(255) NOT NULL,
tracer varchar(255) NOT NULL,
timer decimal(16,6) NOT NULL
)";
var $tablesSQL = "select a.tabname tablename, ti_nptotal*2 size_in_k, ti_nextns extents, ti_nrows records from systables c, sysmaster:systabnames a, sysmaster:systabinfo b where c.tabname not matches 'sys*' and c.partnum = a.partnum and c.partnum = b.ti_partnum";
var $settings = array(
'Ratios',
'data cache hit ratio' => array('RATIOH',
"select round((1-(wt.value / (rd.value + wr.value)))*100,2)
from sysmaster:sysprofile wr, sysmaster:sysprofile rd, sysmaster:sysprofile wt
where rd.name = 'pagreads' and
wr.name = 'pagwrites' and
wt.name = 'buffwts'",
'=WarnCacheRatio'),
'IO',
'data reads' => array('IO',
"select value from sysmaster:sysprofile where name='pagreads'",
'Page reads'),
'data writes' => array('IO',
"select value from sysmaster:sysprofile where name='pagwrites'",
'Page writes'),
'Connections',
'current connections' => array('SESS',
'select count(*) from sysmaster:syssessions',
'Number of sessions'),
false
);
function perf_informix(&$conn)
{
$this->conn =& $conn;
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/perf/perf-mssql.inc.php
0,0 → 1,164
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Library for basic performance monitoring and tuning
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
/*
MSSQL has moved most performance info to Performance Monitor
*/
class perf_mssql extends adodb_perf{
var $sql1 = 'cast(sql1 as text)';
var $createTableSQL = "CREATE TABLE adodb_logsql (
created datetime NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 varchar(4000) NOT NULL,
params varchar(3000) NOT NULL,
tracer varchar(500) NOT NULL,
timer decimal(16,6) NOT NULL
)";
var $settings = array(
'Ratios',
'data cache hit ratio' => array('RATIO',
"select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'",
'=WarnCacheRatio'),
'prepared sql hit ratio' => array('RATIO',
array('dbcc cachestats','Prepared',1,100),
''),
'adhoc sql hit ratio' => array('RATIO',
array('dbcc cachestats','Adhoc',1,100),
''),
'IO',
'data reads' => array('IO',
"select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"),
'data writes' => array('IO',
"select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"),
'Data Cache',
'data cache size' => array('DATAC',
"select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'",
'' ),
'data cache blocksize' => array('DATAC',
"select 8192",'page size'),
'Connections',
'current connections' => array('SESS',
'=sp_who',
''),
'max connections' => array('SESS',
"SELECT @@MAX_CONNECTIONS",
''),
 
false
);
function perf_mssql(&$conn)
{
if ($conn->dataProvider == 'odbc') {
$this->sql1 = 'sql1';
//$this->explain = false;
}
$this->conn =& $conn;
}
function Explain($sql,$partial=false)
{
$save = $this->conn->LogSQL(false);
if ($partial) {
$sqlq = $this->conn->qstr($sql.'%');
$arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
if ($arr) {
foreach($arr as $row) {
$sql = reset($row);
if (crc32($sql) == $partial) break;
}
}
}
$s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
$this->conn->Execute("SET SHOWPLAN_ALL ON;");
$sql = str_replace('?',"''",$sql);
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs =& $this->conn->Execute($sql);
//adodb_printr($rs);
$ADODB_FETCH_MODE = $save;
if ($rs) {
$rs->MoveNext();
$s .= '<table bgcolor=white border=0 cellpadding="1" callspacing=0><tr><td nowrap align=center> Rows<td nowrap align=center> IO<td nowrap align=center> CPU<td align=left> &nbsp; &nbsp; Plan</tr>';
while (!$rs->EOF) {
$s .= '<tr><td>'.round($rs->fields[8],1).'<td>'.round($rs->fields[9],3).'<td align=right>'.round($rs->fields[10],3).'<td nowrap><pre>'.htmlspecialchars($rs->fields[0])."</td></pre></tr>\n"; ## NOTE CORRUPT </td></pre> tag is intentional!!!!
$rs->MoveNext();
}
$s .= '</table>';
$rs->NextRecordSet();
}
$this->conn->Execute("SET SHOWPLAN_ALL OFF;");
$this->conn->LogSQL($save);
$s .= $this->Tracer($sql);
return $s;
}
function Tables()
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
//$this->conn->debug=1;
$s = '<table border=1 bgcolor=white><tr><td><b>tablename</b></td><td><b>size_in_k</b></td><td><b>index size</b></td><td><b>reserved size</b></td></tr>';
$rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'");
if ($rs1) {
while (!$rs1->EOF) {
$tab = $rs1->fields[0];
$tabq = $this->conn->qstr($tab);
$rs2 = $this->conn->Execute("sp_spaceused $tabq");
if ($rs2) {
$s .= '<tr><td>'.$tab.'</td><td align=right>'.$rs2->fields[3].'</td><td align=right>'.$rs2->fields[4].'</td><td align=right>'.$rs2->fields[2].'</td></tr>';
$rs2->Close();
}
$rs1->MoveNext();
}
$rs1->Close();
}
$ADODB_FETCH_MODE = $save;
return $s.'</table>';
}
function sp_who()
{
$arr = $this->conn->GetArray('sp_who');
return sizeof($arr);
}
function HealthCheck($cli=false)
{
$this->conn->Execute('dbcc traceon(3604)');
$html = adodb_perf::HealthCheck($cli);
$this->conn->Execute('dbcc traceoff(3604)');
return $html;
}
}
 
?>
/web/kaklik's_web/torrentflux/adodb/perf/perf-mysql.inc.php
0,0 → 1,315
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Library for basic performance monitoring and tuning
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class perf_mysql extends adodb_perf{
var $tablesSQL = 'show table status';
var $createTableSQL = "CREATE TABLE adodb_logsql (
created datetime NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 text NOT NULL,
params text NOT NULL,
tracer text NOT NULL,
timer decimal(16,6) NOT NULL
)";
var $settings = array(
'Ratios',
'MyISAM cache hit ratio' => array('RATIO',
'=GetKeyHitRatio',
'=WarnCacheRatio'),
'InnoDB cache hit ratio' => array('RATIO',
'=GetInnoDBHitRatio',
'=WarnCacheRatio'),
'data cache hit ratio' => array('HIDE', # only if called
'=FindDBHitRatio',
'=WarnCacheRatio'),
'sql cache hit ratio' => array('RATIO',
'=GetQHitRatio',
''),
'IO',
'data reads' => array('IO',
'=GetReads',
'Number of selects (Key_reads is not accurate)'),
'data writes' => array('IO',
'=GetWrites',
'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'),
'Data Cache',
'MyISAM data cache size' => array('DATAC',
array("show variables", 'key_buffer_size'),
'' ),
'BDB data cache size' => array('DATAC',
array("show variables", 'bdb_cache_size'),
'' ),
'InnoDB data cache size' => array('DATAC',
array("show variables", 'innodb_buffer_pool_size'),
'' ),
'Memory Usage',
'read buffer size' => array('CACHE',
array("show variables", 'read_buffer_size'),
'(per session)'),
'sort buffer size' => array('CACHE',
array("show variables", 'sort_buffer_size'),
'Size of sort buffer (per session)' ),
'table cache' => array('CACHE',
array("show variables", 'table_cache'),
'Number of tables to keep open'),
'Connections',
'current connections' => array('SESS',
array('show status','Threads_connected'),
''),
'max connections' => array( 'SESS',
array("show variables",'max_connections'),
''),
false
);
function perf_mysql(&$conn)
{
$this->conn =& $conn;
}
function Explain($sql,$partial=false)
{
if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return '<p>Unable to EXPLAIN non-select statement</p>';
$save = $this->conn->LogSQL(false);
if ($partial) {
$sqlq = $this->conn->qstr($sql.'%');
$arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
if ($arr) {
foreach($arr as $row) {
$sql = reset($row);
if (crc32($sql) == $partial) break;
}
}
}
$sql = str_replace('?',"''",$sql);
if ($partial) {
$sqlq = $this->conn->qstr($sql.'%');
$sql = $this->conn->GetOne("select sql1 from adodb_logsql where sql1 like $sqlq");
}
$s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
$rs = $this->conn->Execute('EXPLAIN '.$sql);
$s .= rs2html($rs,false,false,false,false);
$this->conn->LogSQL($save);
$s .= $this->Tracer($sql);
return $s;
}
function Tables()
{
if (!$this->tablesSQL) return false;
$rs = $this->conn->Execute($this->tablesSQL);
if (!$rs) return false;
$html = rs2html($rs,false,false,false,false);
return $html;
}
function GetReads()
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$rs = $this->conn->Execute('show status');
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!$rs) return 0;
$val = 0;
while (!$rs->EOF) {
switch($rs->fields[0]) {
case 'Com_select':
$val = $rs->fields[1];
$rs->Close();
return $val;
}
$rs->MoveNext();
}
$rs->Close();
return $val;
}
function GetWrites()
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$rs = $this->conn->Execute('show status');
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!$rs) return 0;
$val = 0.0;
while (!$rs->EOF) {
switch($rs->fields[0]) {
case 'Com_insert':
$val += $rs->fields[1]; break;
case 'Com_delete':
$val += $rs->fields[1]; break;
case 'Com_update':
$val += $rs->fields[1]/2;
$rs->Close();
return $val;
}
$rs->MoveNext();
}
$rs->Close();
return $val;
}
function FindDBHitRatio()
{
// first find out type of table
//$this->conn->debug=1;
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$rs = $this->conn->Execute('show table status');
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!$rs) return '';
$type = strtoupper($rs->fields[1]);
$rs->Close();
switch($type){
case 'MYISAM':
case 'ISAM':
return $this->DBParameter('MyISAM cache hit ratio').' (MyISAM)';
case 'INNODB':
return $this->DBParameter('InnoDB cache hit ratio').' (InnoDB)';
default:
return $type.' not supported';
}
}
function GetQHitRatio()
{
//Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached
$hits = $this->_DBParameter(array("show status","Qcache_hits"));
$total = $this->_DBParameter(array("show status","Qcache_inserts"));
$total += $this->_DBParameter(array("show status","Qcache_not_cached"));
$total += $hits;
if ($total) return round(($hits*100)/$total,2);
return 0;
}
/*
Use session variable to store Hit percentage, because MySQL
does not remember last value of SHOW INNODB STATUS hit ratio
# 1st query to SHOW INNODB STATUS
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000
# 2nd query to SHOW INNODB STATUS
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool activity since the last printout
*/
function GetInnoDBHitRatio()
{
global $ADODB_FETCH_MODE;
$save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$rs = $this->conn->Execute('show innodb status');
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_FETCH_MODE = $save;
if (!$rs || $rs->EOF) return 0;
$stat = $rs->fields[0];
$rs->Close();
$at = strpos($stat,'Buffer pool hit rate');
$stat = substr($stat,$at,200);
if (preg_match('!Buffer pool hit rate\s*([0-9]*) / ([0-9]*)!',$stat,$arr)) {
$val = 100*$arr[1]/$arr[2];
$_SESSION['INNODB_HIT_PCT'] = $val;
return round($val,2);
} else {
if (isset($_SESSION['INNODB_HIT_PCT'])) return $_SESSION['INNODB_HIT_PCT'];
return 0;
}
return 0;
}
function GetKeyHitRatio()
{
$hits = $this->_DBParameter(array("show status","Key_read_requests"));
$reqs = $this->_DBParameter(array("show status","Key_reads"));
if ($reqs == 0) return 0;
return round(($hits/($reqs+$hits))*100,2);
}
// start hack
var $optimizeTableLow = 'CHECK TABLE %s FAST QUICK';
var $optimizeTableHigh = 'OPTIMIZE TABLE %s';
/**
* @see adodb_perf#optimizeTable
*/
function optimizeTable( $table, $mode = ADODB_OPT_LOW)
{
if ( !is_string( $table)) return false;
$conn = $this->conn;
if ( !$conn) return false;
$sql = '';
switch( $mode) {
case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break;
case ADODB_OPT_HIGH : $sql = $this->optimizeTableHigh; break;
default :
{
// May dont use __FUNCTION__ constant for BC (__FUNCTION__ Added in PHP 4.3.0)
ADOConnection::outp( sprintf( "<p>%s: '%s' using of undefined mode '%s'</p>", __CLASS__, __FUNCTION__, $mode));
return false;
}
}
$sql = sprintf( $sql, $table);
return $conn->Execute( $sql) !== false;
}
// end hack
}
?>
/web/kaklik's_web/torrentflux/adodb/perf/perf-oci8.inc.php
0,0 → 1,509
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Library for basic performance monitoring and tuning
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
class perf_oci8 extends ADODB_perf{
var $tablesSQL = "select segment_name as \"tablename\", sum(bytes)/1024 as \"size_in_k\",tablespace_name as \"tablespace\",count(*) \"extents\" from sys.user_extents
group by segment_name,tablespace_name";
var $version;
var $createTableSQL = "CREATE TABLE adodb_logsql (
created date NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 varchar(4000) NOT NULL,
params varchar(4000),
tracer varchar(4000),
timer decimal(16,6) NOT NULL
)";
var $settings = array(
'Ratios',
'data cache hit ratio' => array('RATIOH',
"select round((1-(phy.value / (cur.value + con.value)))*100,2)
from v\$sysstat cur, v\$sysstat con, v\$sysstat phy
where cur.name = 'db block gets' and
con.name = 'consistent gets' and
phy.name = 'physical reads'",
'=WarnCacheRatio'),
'sql cache hit ratio' => array( 'RATIOH',
'select round(100*(sum(pins)-sum(reloads))/sum(pins),2) from v$librarycache',
'increase <i>shared_pool_size</i> if too ratio low'),
'datadict cache hit ratio' => array('RATIOH',
"select
round((1 - (sum(getmisses) / (sum(gets) +
sum(getmisses))))*100,2)
from v\$rowcache",
'increase <i>shared_pool_size</i> if too ratio low'),
'memory sort ratio' => array('RATIOH',
"SELECT ROUND((100 * b.VALUE) /DECODE ((a.VALUE + b.VALUE),
0,1,(a.VALUE + b.VALUE)),2)
FROM v\$sysstat a,
v\$sysstat b
WHERE a.name = 'sorts (disk)'
AND b.name = 'sorts (memory)'",
"% of memory sorts compared to disk sorts - should be over 95%"),
 
'IO',
'data reads' => array('IO',
"select value from v\$sysstat where name='physical reads'"),
'data writes' => array('IO',
"select value from v\$sysstat where name='physical writes'"),
'Data Cache',
'data cache buffers' => array( 'DATAC',
"select a.value/b.value from v\$parameter a, v\$parameter b
where a.name = 'db_cache_size' and b.name= 'db_block_size'",
'Number of cache buffers. Tune <i>db_cache_size</i> if the <i>data cache hit ratio</i> is too low.'),
'data cache blocksize' => array('DATAC',
"select value from v\$parameter where name='db_block_size'",
'' ),
'Memory Pools',
'data cache size' => array('DATAC',
"select value from v\$parameter where name = 'db_cache_size'",
'db_cache_size' ),
'shared pool size' => array('DATAC',
"select value from v\$parameter where name = 'shared_pool_size'",
'shared_pool_size, which holds shared sql, stored procedures, dict cache and similar shared structs' ),
'java pool size' => array('DATAJ',
"select value from v\$parameter where name = 'java_pool_size'",
'java_pool_size' ),
'large pool buffer size' => array('CACHE',
"select value from v\$parameter where name='large_pool_size'",
'this pool is for large mem allocations (not because it is larger than shared pool), for MTS sessions, parallel queries, io buffers (large_pool_size) ' ),
 
'pga buffer size' => array('CACHE',
"select value from v\$parameter where name='pga_aggregate_target'",
'program global area is private memory for sorting, and hash and bitmap merges - since oracle 9i (pga_aggregate_target)' ),
 
'Connections',
'current connections' => array('SESS',
'select count(*) from sys.v_$session where username is not null',
''),
'max connections' => array( 'SESS',
"select value from v\$parameter where name='sessions'",
''),
 
'Memory Utilization',
'data cache utilization ratio' => array('RATIOU',
"select round((1-bytes/sgasize)*100, 2)
from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f
where name = 'free memory' and pool = 'shared pool'",
'Percentage of data cache actually in use - should be over 85%'),
'shared pool utilization ratio' => array('RATIOU',
'select round((sga.bytes/p.value)*100,2)
from v$sgastat sga, v$parameter p
where sga.name = \'free memory\' and sga.pool = \'shared pool\'
and p.name = \'shared_pool_size\'',
'Percentage of shared pool actually used - too low is bad, too high is worse'),
'large pool utilization ratio' => array('RATIOU',
"select round((1-bytes/sgasize)*100, 2)
from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f
where name = 'free memory' and pool = 'large pool'",
'Percentage of large_pool actually in use - too low is bad, too high is worse'),
'sort buffer size' => array('CACHE',
"select value from v\$parameter where name='sort_area_size'",
'max in-mem sort_area_size (per query), uses memory in pga' ),
 
'pga usage at peak' => array('RATIOU',
'=PGA','Mb utilization at peak transactions (requires Oracle 9i+)'),
'Transactions',
'rollback segments' => array('ROLLBACK',
"select count(*) from sys.v_\$rollstat",
''),
'peak transactions' => array('ROLLBACK',
"select max_utilization tx_hwm
from sys.v_\$resource_limit
where resource_name = 'transactions'",
'Taken from high-water-mark'),
'max transactions' => array('ROLLBACK',
"select value from v\$parameter where name = 'transactions'",
'max transactions / rollback segments < 3.5 (or transactions_per_rollback_segment)'),
'Parameters',
'cursor sharing' => array('CURSOR',
"select value from v\$parameter where name = 'cursor_sharing'",
'Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR (9i+). See <a href=http://www.praetoriate.com/oracle_tips_cursor_sharing.htm>cursor_sharing</a>.'),
/*
'cursor reuse' => array('CURSOR',
"select count(*) from (select sql_text_wo_constants, count(*)
from t1
group by sql_text_wo_constants
having count(*) > 100)",'These are sql statements that should be using bind variables'),*/
'index cache cost' => array('COST',
"select value from v\$parameter where name = 'optimizer_index_caching'",
'=WarnIndexCost'),
'random page cost' => array('COST',
"select value from v\$parameter where name = 'optimizer_index_cost_adj'",
'=WarnPageCost'),
false
);
function perf_oci8(&$conn)
{
$savelog = $conn->LogSQL(false);
$this->version = $conn->ServerInfo();
$conn->LogSQL($savelog);
$this->conn =& $conn;
}
function WarnPageCost($val)
{
if ($val == 100) $s = '<font color=red><b>Too High</b>. </font>';
else $s = '';
return $s.'Recommended is 20-50 for TP, and 50 for data warehouses. Default is 100. See <a href=http://www.dba-oracle.com/oracle_tips_cost_adj.htm>optimizer_index_cost_adj</a>. ';
}
function WarnIndexCost($val)
{
if ($val == 0) $s = '<font color=red><b>Too Low</b>. </font>';
else $s = '';
return $s.'Percentage of indexed data blocks expected in the cache.
Recommended is 20 (fast disk array) to 50 (slower hard disks). Default is 0.
See <a href=http://www.dba-oracle.com/oracle_tips_cbo_part1.htm>optimizer_index_caching</a>.';
}
function PGA()
{
if ($this->version['version'] < 9) return 'Oracle 9i or later required';
$rs = $this->conn->Execute("select a.mb,a.targ as pga_size_pct,a.pct from
(select round(pga_target_for_estimate/1024.0/1024.0,0) Mb,
pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r
from v\$pga_target_advice) a left join
(select round(pga_target_for_estimate/1024.0/1024.0,0) Mb,
pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r
from v\$pga_target_advice) b on
a.r = b.r+1 where
b.pct < 100");
if (!$rs) return "Only in 9i or later";
$rs->Close();
if ($rs->EOF) return "PGA could be too big";
return reset($rs->fields);
}
function Explain($sql,$partial=false)
{
$savelog = $this->conn->LogSQL(false);
$rs =& $this->conn->SelectLimit("select ID FROM PLAN_TABLE");
if (!$rs) {
echo "<p><b>Missing PLAN_TABLE</b></p>
<pre>
CREATE TABLE PLAN_TABLE (
STATEMENT_ID VARCHAR2(30),
TIMESTAMP DATE,
REMARKS VARCHAR2(80),
OPERATION VARCHAR2(30),
OPTIONS VARCHAR2(30),
OBJECT_NODE VARCHAR2(128),
OBJECT_OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(30),
OBJECT_INSTANCE NUMBER(38),
OBJECT_TYPE VARCHAR2(30),
OPTIMIZER VARCHAR2(255),
SEARCH_COLUMNS NUMBER,
ID NUMBER(38),
PARENT_ID NUMBER(38),
POSITION NUMBER(38),
COST NUMBER(38),
CARDINALITY NUMBER(38),
BYTES NUMBER(38),
OTHER_TAG VARCHAR2(255),
PARTITION_START VARCHAR2(255),
PARTITION_STOP VARCHAR2(255),
PARTITION_ID NUMBER(38),
OTHER LONG,
DISTRIBUTION VARCHAR2(30)
);
</pre>";
return false;
}
$rs->Close();
// $this->conn->debug=1;
if ($partial) {
$sqlq = $this->conn->qstr($sql.'%');
$arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq");
if ($arr) {
foreach($arr as $row) {
$sql = reset($row);
if (crc32($sql) == $partial) break;
}
}
}
$s = "<p><b>Explain</b>: ".htmlspecialchars($sql)."</p>";
$this->conn->BeginTrans();
$id = "ADODB ".microtime();
 
$rs =& $this->conn->Execute("EXPLAIN PLAN SET STATEMENT_ID='$id' FOR $sql");
$m = $this->conn->ErrorMsg();
if ($m) {
$this->conn->RollbackTrans();
$this->conn->LogSQL($savelog);
$s .= "<p>$m</p>";
return $s;
}
$rs =& $this->conn->Execute("
select
'<pre>'||lpad('--', (level-1)*2,'-') || trim(operation) || ' ' || trim(options)||'</pre>' as Operation,
object_name,COST,CARDINALITY,bytes
FROM plan_table
START WITH id = 0 and STATEMENT_ID='$id'
CONNECT BY prior id=parent_id and statement_id='$id'");
$s .= rs2html($rs,false,false,false,false);
$this->conn->RollbackTrans();
$this->conn->LogSQL($savelog);
$s .= $this->Tracer($sql,$partial);
return $s;
}
function CheckMemory()
{
if ($this->version['version'] < 9) return 'Oracle 9i or later required';
$rs =& $this->conn->Execute("
select a.size_for_estimate as cache_mb_estimate,
case when a.size_factor=1 then
'&lt;&lt;= current'
when a.estd_physical_read_factor-b.estd_physical_read_factor > 0 and a.estd_physical_read_factor<1 then
'- BETTER - '
else ' ' end as currsize,
a.estd_physical_read_factor-b.estd_physical_read_factor as best_when_0
from (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) a ,
(select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) b where a.r = b.r-1");
if (!$rs) return false;
/*
The v$db_cache_advice utility show the marginal changes in physical data block reads for different sizes of db_cache_size
*/
$s = "<h3>Data Cache Estimate</h3>";
if ($rs->EOF) {
$s .= "<p>Cache that is 50% of current size is still too big</p>";
} else {
$s .= "Ideal size of Data Cache is when \"best_when_0\" changes from a positive number and becomes zero.";
$s .= rs2html($rs,false,false,false,false);
}
return $s;
}
/*
Generate html for suspicious/expensive sql
*/
function tohtml(&$rs,$type)
{
$o1 = $rs->FetchField(0);
$o2 = $rs->FetchField(1);
$o3 = $rs->FetchField(2);
if ($rs->EOF) return '<p>None found</p>';
$check = '';
$sql = '';
$s = "\n\n<table border=1 bgcolor=white><tr><td><b>".$o1->name.'</b></td><td><b>'.$o2->name.'</b></td><td><b>'.$o3->name.'</b></td></tr>';
while (!$rs->EOF) {
if ($check != $rs->fields[0].'::'.$rs->fields[1]) {
if ($check) {
$carr = explode('::',$check);
$prefix = "<a href=\"?$type=1&sql=".rawurlencode($sql).'&x#explain">';
$suffix = '</a>';
if (strlen($prefix)>2000) {
$prefix = '';
$suffix = '';
}
$s .= "\n<tr><td align=right>".$carr[0].'</td><td align=right>'.$carr[1].'</td><td>'.$prefix.$sql.$suffix.'</td></tr>';
}
$sql = $rs->fields[2];
$check = $rs->fields[0].'::'.$rs->fields[1];
} else
$sql .= $rs->fields[2];
if (substr($sql,strlen($sql)-1) == "\0") $sql = substr($sql,0,strlen($sql)-1);
$rs->MoveNext();
}
$rs->Close();
$carr = explode('::',$check);
$prefix = "<a target=".rand()." href=\"?&hidem=1&$type=1&sql=".rawurlencode($sql).'&x#explain">';
$suffix = '</a>';
if (strlen($prefix)>2000) {
$prefix = '';
$suffix = '';
}
$s .= "\n<tr><td align=right>".$carr[0].'</td><td align=right>'.$carr[1].'</td><td>'.$prefix.$sql.$suffix.'</td></tr>';
return $s."</table>\n\n";
}
// code thanks to Ixora.
// http://www.ixora.com.au/scripts/query_opt.htm
// requires oracle 8.1.7 or later
function SuspiciousSQL($numsql=10)
{
$sql = "
select
substr(to_char(s.pct, '99.00'), 2) || '%' load,
s.executions executes,
p.sql_text
from
(
select
address,
buffer_gets,
executions,
pct,
rank() over (order by buffer_gets desc) ranking
from
(
select
address,
buffer_gets,
executions,
100 * ratio_to_report(buffer_gets) over () pct
from
sys.v_\$sql
where
command_type != 47 and module != 'T.O.A.D.'
)
where
buffer_gets > 50 * executions
) s,
sys.v_\$sqltext p
where
s.ranking <= $numsql and
p.address = s.address
order by
1 desc, s.address, p.piece";
 
global $ADODB_CACHE_MODE;
if (isset($_GET['expsixora']) && isset($_GET['sql'])) {
$partial = empty($_GET['part']);
echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
}
 
if (isset($_GET['sql'])) return $this->_SuspiciousSQL($numsql);
$s = '';
$s .= $this->_SuspiciousSQL($numsql);
$s .= '<p>';
$save = $ADODB_CACHE_MODE;
$ADODB_CACHE_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$savelog = $this->conn->LogSQL(false);
$rs =& $this->conn->SelectLimit($sql);
$this->conn->LogSQL($savelog);
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_CACHE_MODE = $save;
if ($rs) {
$s .= "\n<h3>Ixora Suspicious SQL</h3>";
$s .= $this->tohtml($rs,'expsixora');
}
return $s;
}
// code thanks to Ixora.
// http://www.ixora.com.au/scripts/query_opt.htm
// requires oracle 8.1.7 or later
function ExpensiveSQL($numsql = 10)
{
$sql = "
select
substr(to_char(s.pct, '99.00'), 2) || '%' load,
s.executions executes,
p.sql_text
from
(
select
address,
disk_reads,
executions,
pct,
rank() over (order by disk_reads desc) ranking
from
(
select
address,
disk_reads,
executions,
100 * ratio_to_report(disk_reads) over () pct
from
sys.v_\$sql
where
command_type != 47 and module != 'T.O.A.D.'
)
where
disk_reads > 50 * executions
) s,
sys.v_\$sqltext p
where
s.ranking <= $numsql and
p.address = s.address
order by
1 desc, s.address, p.piece
";
global $ADODB_CACHE_MODE;
if (isset($_GET['expeixora']) && isset($_GET['sql'])) {
$partial = empty($_GET['part']);
echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
}
if (isset($_GET['sql'])) {
$var = $this->_ExpensiveSQL($numsql);
return $var;
}
$s = '';
$s .= $this->_ExpensiveSQL($numsql);
$s .= '<p>';
$save = $ADODB_CACHE_MODE;
$ADODB_CACHE_MODE = ADODB_FETCH_NUM;
if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
$savelog = $this->conn->LogSQL(false);
$rs =& $this->conn->Execute($sql);
$this->conn->LogSQL($savelog);
if (isset($savem)) $this->conn->SetFetchMode($savem);
$ADODB_CACHE_MODE = $save;
if ($rs) {
$s .= "\n<h3>Ixora Expensive SQL</h3>";
$s .= $this->tohtml($rs,'expeixora');
}
return $s;
}
}
?>
/web/kaklik's_web/torrentflux/adodb/perf/perf-postgres.inc.php
0,0 → 1,124
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt.
Set tabs to 4 for best viewing.
Latest version is available at http://adodb.sourceforge.net
Library for basic performance monitoring and tuning
*/
 
// security - hide paths
if (!defined('ADODB_DIR')) die();
 
/*
Notice that PostgreSQL has no sql query cache
*/
class perf_postgres extends adodb_perf{
var $tablesSQL =
"select a.relname as tablename,(a.relpages+CASE WHEN b.relpages is null THEN 0 ELSE b.relpages END+CASE WHEN c.relpages is null THEN 0 ELSE c.relpages END)*8 as size_in_K,a.relfilenode as \"OID\" from pg_class a left join pg_class b
on b.relname = 'pg_toast_'||trim(a.relfilenode)
left join pg_class c on c.relname = 'pg_toast_'||trim(a.relfilenode)||'_index'
where a.relname in (select tablename from pg_tables where tablename not like 'pg_%')";
var $createTableSQL = "CREATE TABLE adodb_logsql (
created timestamp NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 text NOT NULL,
params text NOT NULL,
tracer text NOT NULL,
timer decimal(16,6) NOT NULL
)";
var $settings = array(
'Ratios',
'statistics collector' => array('RATIO',
"select case when count(*)=3 then 'TRUE' else 'FALSE' end from pg_settings where (name='stats_block_level' or name='stats_row_level' or name='stats_start_collector') and setting='on' ",
'Value must be TRUE to enable hit ratio statistics (<i>stats_start_collector</i>,<i>stats_row_level</i> and <i>stats_block_level</i> must be set to true in postgresql.conf)'),
'data cache hit ratio' => array('RATIO',
"select case when blks_hit=0 then 0 else round( ((1-blks_read::float/blks_hit)*100)::numeric, 2) end from pg_stat_database where datname='\$DATABASE'",
'=WarnCacheRatio'),
'IO',
'data reads' => array('IO',
'select sum(heap_blks_read+toast_blks_read) from pg_statio_user_tables',
),
'data writes' => array('IO',
'select round((sum(n_tup_ins/4.0+n_tup_upd/8.0+n_tup_del/4.0)/16)::numeric,2) from pg_stat_user_tables',
'Count of inserts/updates/deletes * coef'),
 
'Data Cache',
'data cache buffers' => array('DATAC',
"select setting from pg_settings where name='shared_buffers'",
'Number of cache buffers. <a href=http://www.varlena.com/GeneralBits/Tidbits/perf.html#basic>Tuning</a>'),
'cache blocksize' => array('DATAC',
'select 8192',
'(estimate)' ),
'data cache size' => array( 'DATAC',
"select setting::integer*8192 from pg_settings where name='shared_buffers'",
'' ),
'operating system cache size' => array( 'DATA',
"select setting::integer*8192 from pg_settings where name='effective_cache_size'",
'(effective cache size)' ),
'Memory Usage',
# Postgres 7.5 changelog: Rename server parameters SortMem and VacuumMem to work_mem and maintenance_work_mem;
'sort/work buffer size' => array('CACHE',
"select setting::integer*1024 from pg_settings where name='sort_mem' or name = 'work_mem' order by name",
'Size of sort buffer (per query)' ),
'Connections',
'current connections' => array('SESS',
'select count(*) from pg_stat_activity',
''),
'max connections' => array('SESS',
"select setting from pg_settings where name='max_connections'",
''),
'Parameters',
'rollback buffers' => array('COST',
"select setting from pg_settings where name='wal_buffers'",
'WAL buffers'),
'random page cost' => array('COST',
"select setting from pg_settings where name='random_page_cost'",
'Cost of doing a seek (default=4). See <a href=http://www.varlena.com/GeneralBits/Tidbits/perf.html#less>random_page_cost</a>'),
false
);
function perf_postgres(&$conn)
{
$this->conn =& $conn;
}
function Explain($sql,$partial=false)
{
$save = $this->conn->LogSQL(false);
if ($partial) {
$sqlq = $this->conn->qstr($sql.'%');
$arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq");
if ($arr) {
foreach($arr as $row) {
$sql = reset($row);
if (crc32($sql) == $partial) break;
}
}
}
$sql = str_replace('?',"''",$sql);
$s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
$rs = $this->conn->Execute('EXPLAIN '.$sql);
$this->conn->LogSQL($save);
$s .= '<pre>';
if ($rs)
while (!$rs->EOF) {
$s .= reset($rs->fields)."\n";
$rs->MoveNext();
}
$s .= '</pre>';
$s .= $this->Tracer($sql,$partial);
return $s;
}
}
?>
/web/kaklik's_web/torrentflux/adodb/pivottable.inc.php
0,0 → 1,185
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://php.weblogs.com
*
* Requires PHP4.01pl2 or later because it uses include_once
*/
 
/*
* Concept from daniel.lucazeau@ajornet.com.
*
* @param db Adodb database connection
* @param tables List of tables to join
* @rowfields List of fields to display on each row
* @colfield Pivot field to slice and display in columns, if we want to calculate
* ranges, we pass in an array (see example2)
* @where Where clause. Optional.
* @aggfield This is the field to sum. Optional.
* Since 2.3.1, if you can use your own aggregate function
* instead of SUM, eg. $aggfield = 'fieldname'; $aggfn = 'AVG';
* @sumlabel Prefix to display in sum columns. Optional.
* @aggfn Aggregate function to use (could be AVG, SUM, COUNT)
* @showcount Show count of records
*
* @returns Sql generated
*/
function PivotTableSQL(&$db,$tables,$rowfields,$colfield, $where=false,
$aggfield = false,$sumlabel='Sum ',$aggfn ='SUM', $showcount = true)
{
if ($aggfield) $hidecnt = true;
else $hidecnt = false;
$iif = strpos($db->databaseType,'access') !== false;
// note - vfp still doesn' work even with IIF enabled || $db->databaseType == 'vfp';
//$hidecnt = false;
if ($where) $where = "\nWHERE $where";
if (!is_array($colfield)) $colarr = $db->GetCol("select distinct $colfield from $tables $where order by 1");
if (!$aggfield) $hidecnt = false;
$sel = "$rowfields, ";
if (is_array($colfield)) {
foreach ($colfield as $k => $v) {
$k = trim($k);
if (!$hidecnt) {
$sel .= $iif ?
"\n\t$aggfn(IIF($v,1,0)) AS \"$k\", "
:
"\n\t$aggfn(CASE WHEN $v THEN 1 ELSE 0 END) AS \"$k\", ";
}
if ($aggfield) {
$sel .= $iif ?
"\n\t$aggfn(IIF($v,$aggfield,0)) AS \"$sumlabel$k\", "
:
"\n\t$aggfn(CASE WHEN $v THEN $aggfield ELSE 0 END) AS \"$sumlabel$k\", ";
}
}
} else {
foreach ($colarr as $v) {
if (!is_numeric($v)) $vq = $db->qstr($v);
else $vq = $v;
$v = trim($v);
if (strlen($v) == 0 ) $v = 'null';
if (!$hidecnt) {
$sel .= $iif ?
"\n\t$aggfn(IIF($colfield=$vq,1,0)) AS \"$v\", "
:
"\n\t$aggfn(CASE WHEN $colfield=$vq THEN 1 ELSE 0 END) AS \"$v\", ";
}
if ($aggfield) {
if ($hidecnt) $label = $v;
else $label = "{$v}_$aggfield";
$sel .= $iif ?
"\n\t$aggfn(IIF($colfield=$vq,$aggfield,0)) AS \"$label\", "
:
"\n\t$aggfn(CASE WHEN $colfield=$vq THEN $aggfield ELSE 0 END) AS \"$label\", ";
}
}
}
if ($aggfield && $aggfield != '1'){
$agg = "$aggfn($aggfield)";
$sel .= "\n\t$agg as \"$sumlabel$aggfield\", ";
}
if ($showcount)
$sel .= "\n\tSUM(1) as Total";
else
$sel = substr($sel,0,strlen($sel)-2);
$sql = "SELECT $sel \nFROM $tables $where \nGROUP BY $rowfields";
return $sql;
}
 
/* EXAMPLES USING MS NORTHWIND DATABASE */
if (0) {
 
# example1
#
# Query the main "product" table
# Set the rows to CompanyName and QuantityPerUnit
# and the columns to the Categories
# and define the joins to link to lookup tables
# "categories" and "suppliers"
#
 
$sql = PivotTableSQL(
$gDB, # adodb connection
'products p ,categories c ,suppliers s', # tables
'CompanyName,QuantityPerUnit', # row fields
'CategoryName', # column fields
'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where
);
print "<pre>$sql";
$rs = $gDB->Execute($sql);
rs2html($rs);
/*
Generated SQL:
 
SELECT CompanyName,QuantityPerUnit,
SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products",
SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals",
SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry",
SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
SUM(1) as Total
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
GROUP BY CompanyName,QuantityPerUnit
*/
//=====================================================================
 
# example2
#
# Query the main "product" table
# Set the rows to CompanyName and QuantityPerUnit
# and the columns to the UnitsInStock for diiferent ranges
# and define the joins to link to lookup tables
# "categories" and "suppliers"
#
$sql = PivotTableSQL(
$gDB, # adodb connection
'products p ,categories c ,suppliers s', # tables
'CompanyName,QuantityPerUnit', # row fields
# column ranges
array(
' 0 ' => 'UnitsInStock <= 0',
"1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5',
"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10',
"11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',
"16+" =>'15 < UnitsInStock'
),
' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
'UnitsInStock', # sum this field
'Sum' # sum label prefix
);
print "<pre>$sql";
$rs = $gDB->Execute($sql);
rs2html($rs);
/*
Generated SQL:
SELECT CompanyName,QuantityPerUnit,
SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum 0 ",
SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5",
SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10",
SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15",
SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
SUM(UnitsInStock) AS "Sum UnitsInStock",
SUM(1) as Total
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
GROUP BY CompanyName,QuantityPerUnit
*/
}
?>
/web/kaklik's_web/torrentflux/adodb/readme.txt
0,0 → 1,62
>> ADODB Library for PHP4
 
(c) 2000-2004 John Lim (jlim@natsoft.com.my)
 
Released under both BSD and GNU Lesser GPL library license.
This means you can use it in proprietary products.
>> Introduction
 
PHP's database access functions are not standardised. This creates a
need for a database class library to hide the differences between the
different databases (encapsulate the differences) so we can easily
switch databases.
 
We currently support MySQL, Interbase, Sybase, PostgreSQL, Oracle,
Microsoft SQL server, Foxpro ODBC, Access ODBC, Informix, DB2,
Sybase SQL Anywhere, generic ODBC and Microsoft's ADO.
 
We hope more people will contribute drivers to support other databases.
 
 
>> Documentation and Examples
 
Refer to the adodb/docs directory for full documentation and examples.
There is also a tutorial tute.htm that contrasts ADODB code with
mysql code.
 
 
>>> Files
Adodb.inc.php is the main file. You need to include only this file.
 
Adodb-*.inc.php are the database specific driver code.
 
Test.php contains a list of test commands to exercise the class library.
 
Adodb-session.php is the PHP4 session handling code.
 
Testdatabases.inc.php contains the list of databases to apply the tests on.
 
Benchmark.php is a simple benchmark to test the throughput of a simple SELECT
statement for databases described in testdatabases.inc.php. The benchmark
tables are created in test.php.
 
readme.htm is the main documentation.
 
tute.htm is the tutorial.
 
 
>> More Info
 
For more information, including installation see readme.htm
or visit
http://adodb.sourceforge.net/
 
 
>> Feature Requests and Bug Reports
 
Email to jlim@natsoft.com.my
 
 
/web/kaklik's_web/torrentflux/adodb/rsfilter.inc.php
0,0 → 1,61
<?php
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Set tabs to 4 for best viewing.
*
* Latest version is available at http://php.weblogs.com
*
* Requires PHP4.01pl2 or later because it uses include_once
*/
 
/*
Filter all fields and all rows in a recordset and returns the
processed recordset. We scroll to the beginning of the new recordset
after processing.
We pass a recordset and function name to RSFilter($rs,'rowfunc');
and the function will be called multiple times, once
for each row in the recordset. The function will be passed
an array containing one row repeatedly.
Example:
// ucwords() every element in the recordset
function do_ucwords(&$arr,$rs)
{
foreach($arr as $k => $v) {
$arr[$k] = ucwords($v);
}
}
$rs = RSFilter($rs,'do_ucwords');
*/
function &RSFilter($rs,$fn)
{
if ($rs->databaseType != 'array') {
if (!$rs->connection) return false;
$rs = &$rs->connection->_rs2rs($rs);
}
$rows = $rs->RecordCount();
for ($i=0; $i < $rows; $i++) {
if (is_array ($fn)) {
$obj = $fn[0];
$method = $fn[1];
$obj->$method ($rs->_array[$i],$rs);
} else {
$fn($rs->_array[$i],$rs);
}
}
if (!$rs->EOF) {
$rs->_currentRow = 0;
$rs->fields = $rs->_array[0];
}
return $rs;
}
?>
/web/kaklik's_web/torrentflux/adodb/server.php
0,0 → 1,100
<?php
 
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
*/
/* Documentation on usage is at http://php.weblogs.com/adodb_csv
*
* Legal query string parameters:
*
* sql = holds sql string
* nrows = number of rows to return
* offset = skip offset rows of data
* fetch = $ADODB_FETCH_MODE
*
* example:
*
* http://localhost/php/server.php?select+*+from+table&nrows=10&offset=2
*/
 
 
/*
* Define the IP address you want to accept requests from
* as a security measure. If blank we accept anyone promisciously!
*/
$ACCEPTIP = '127.0.0.1';
 
/*
* Connection parameters
*/
$driver = 'mysql';
$host = 'localhost'; // DSN for odbc
$uid = 'root';
$pwd = 'garbase-it-is';
$database = 'test';
 
/*============================ DO NOT MODIFY BELOW HERE =================================*/
// $sep must match csv2rs() in adodb.inc.php
$sep = ' :::: ';
 
include('./adodb.inc.php');
include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
 
function err($s)
{
die('**** '.$s.' ');
}
 
// undo stupid magic quotes
function undomq(&$m)
{
if (get_magic_quotes_gpc()) {
// undo the damage
$m = str_replace('\\\\','\\',$m);
$m = str_replace('\"','"',$m);
$m = str_replace('\\\'','\'',$m);
}
return $m;
}
 
///////////////////////////////////////// DEFINITIONS
 
 
$remote = $_SERVER["REMOTE_ADDR"];
 
if (!empty($ACCEPTIP))
if ($remote != '127.0.0.1' && $remote != $ACCEPTIP)
err("Unauthorised client: '$remote'");
if (empty($_REQUEST['sql'])) err('No SQL');
 
 
$conn = &ADONewConnection($driver);
 
if (!$conn->Connect($host,$uid,$pwd,$database)) err($conn->ErrorNo(). $sep . $conn->ErrorMsg());
$sql = undomq($_REQUEST['sql']);
 
if (isset($_REQUEST['fetch']))
$ADODB_FETCH_MODE = $_REQUEST['fetch'];
if (isset($_REQUEST['nrows'])) {
$nrows = $_REQUEST['nrows'];
$offset = isset($_REQUEST['offset']) ? $_REQUEST['offset'] : -1;
$rs = $conn->SelectLimit($sql,$nrows,$offset);
} else
$rs = $conn->Execute($sql);
if ($rs){
//$rs->timeToLive = 1;
echo _rs2serialize($rs,$conn,$sql);
$rs->Close();
} else
err($conn->ErrorNo(). $sep .$conn->ErrorMsg());
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-compress-bzip2.php
0,0 → 1,118
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com).
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
 
*/
 
if (!function_exists('bzcompress')) {
trigger_error('bzip2 functions are not available', E_USER_ERROR);
return 0;
}
 
/*
*/
class ADODB_Compress_Bzip2 {
/**
*/
var $_block_size = null;
 
/**
*/
var $_work_level = null;
 
/**
*/
var $_min_length = 1;
 
/**
*/
function getBlockSize() {
return $this->_block_size;
}
 
/**
*/
function setBlockSize($block_size) {
assert('$block_size >= 1');
assert('$block_size <= 9');
$this->_block_size = (int) $block_size;
}
 
/**
*/
function getWorkLevel() {
return $this->_work_level;
}
 
/**
*/
function setWorkLevel($work_level) {
assert('$work_level >= 0');
assert('$work_level <= 250');
$this->_work_level = (int) $work_level;
}
 
/**
*/
function getMinLength() {
return $this->_min_length;
}
 
/**
*/
function setMinLength($min_length) {
assert('$min_length >= 0');
$this->_min_length = (int) $min_length;
}
 
/**
*/
function ADODB_Compress_Bzip2($block_size = null, $work_level = null, $min_length = null) {
if (!is_null($block_size)) {
$this->setBlockSize($block_size);
}
 
if (!is_null($work_level)) {
$this->setWorkLevel($work_level);
}
 
if (!is_null($min_length)) {
$this->setMinLength($min_length);
}
}
 
/**
*/
function write($data, $key) {
if (strlen($data) < $this->_min_length) {
return $data;
}
 
if (!is_null($this->_block_size)) {
if (!is_null($this->_work_level)) {
return bzcompress($data, $this->_block_size, $this->_work_level);
} else {
return bzcompress($data, $this->_block_size);
}
}
 
return bzcompress($data);
}
 
/**
*/
function read($data, $key) {
return $data ? bzdecompress($data) : $data;
}
 
}
 
return 1;
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-compress-gzip.php
0,0 → 1,93
<?php
 
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com).
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
 
*/
 
if (!function_exists('gzcompress')) {
trigger_error('gzip functions are not available', E_USER_ERROR);
return 0;
}
 
/*
*/
class ADODB_Compress_Gzip {
/**
*/
var $_level = null;
 
/**
*/
var $_min_length = 1;
 
/**
*/
function getLevel() {
return $this->_level;
}
 
/**
*/
function setLevel($level) {
assert('$level >= 0');
assert('$level <= 9');
$this->_level = (int) $level;
}
 
/**
*/
function getMinLength() {
return $this->_min_length;
}
 
/**
*/
function setMinLength($min_length) {
assert('$min_length >= 0');
$this->_min_length = (int) $min_length;
}
 
/**
*/
function ADODB_Compress_Gzip($level = null, $min_length = null) {
if (!is_null($level)) {
$this->setLevel($level);
}
 
if (!is_null($min_length)) {
$this->setMinLength($min_length);
}
}
 
/**
*/
function write($data, $key) {
if (strlen($data) < $this->_min_length) {
return $data;
}
 
if (!is_null($this->_level)) {
return gzcompress($data, $this->_level);
} else {
return gzcompress($data);
}
}
 
/**
*/
function read($data, $key) {
return $data ? gzuncompress($data) : $data;
}
 
}
 
return 1;
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-cryptsession.php
0,0 → 1,24
<?php
 
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com).
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
/*
 
This file is provided for backwards compatibility purposes
 
*/
 
require_once dirname(__FILE__) . '/adodb-session.php';
require_once ADODB_SESSION . '/adodb-encrypt-md5.php';
 
ADODB_Session::filter(new ADODB_Encrypt_MD5());
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-encrypt-mcrypt.php
0,0 → 1,109
<?php
 
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com).
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
 
*/
 
if (!function_exists('mcrypt_encrypt')) {
trigger_error('Mcrypt functions are not available', E_USER_ERROR);
return 0;
}
 
/**
*/
class ADODB_Encrypt_MCrypt {
/**
*/
var $_cipher;
 
/**
*/
var $_mode;
 
/**
*/
var $_source;
 
/**
*/
function getCipher() {
return $this->_cipher;
}
 
/**
*/
function setCipher($cipher) {
$this->_cipher = $cipher;
}
 
/**
*/
function getMode() {
return $this->_mode;
}
 
/**
*/
function setMode($mode) {
$this->_mode = $mode;
}
 
/**
*/
function getSource() {
return $this->_source;
}
 
/**
*/
function setSource($source) {
$this->_source = $source;
}
 
/**
*/
function ADODB_Encrypt_MCrypt($cipher = null, $mode = null, $source = null) {
if (!$cipher) {
$cipher = MCRYPT_RIJNDAEL_256;
}
if (!$mode) {
$mode = MCRYPT_MODE_ECB;
}
if (!$source) {
$source = MCRYPT_RAND;
}
 
$this->_cipher = $cipher;
$this->_mode = $mode;
$this->_source = $source;
}
 
/**
*/
function write($data, $key) {
$iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode);
$iv = mcrypt_create_iv($iv_size, $this->_source);
return mcrypt_encrypt($this->_cipher, $key, $data, $this->_mode, $iv);
}
 
/**
*/
function read($data, $key) {
$iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode);
$iv = mcrypt_create_iv($iv_size, $this->_source);
$rv = mcrypt_decrypt($this->_cipher, $key, $data, $this->_mode, $iv);
return rtrim($rv, "\0");
}
 
}
 
return 1;
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-encrypt-md5.php
0,0 → 1,39
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com).
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
 
*/
 
// security - hide paths
if (!defined('ADODB_SESSION')) die();
 
include_once ADODB_SESSION . '/crypt.inc.php';
 
/**
*/
class ADODB_Encrypt_MD5 {
/**
*/
function write($data, $key) {
$md5crypt =& new MD5Crypt();
return $md5crypt->encrypt($data, $key);
}
 
/**
*/
function read($data, $key) {
$md5crypt =& new MD5Crypt();
return $md5crypt->decrypt($data, $key);
}
 
}
 
return 1;
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-encrypt-secret.php
0,0 → 1,48
<?php
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com).
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
 
*/
 
@define('HORDE_BASE', dirname(dirname(dirname(__FILE__))) . '/horde');
 
if (!is_dir(HORDE_BASE)) {
trigger_error(sprintf('Directory not found: \'%s\'', HORDE_BASE), E_USER_ERROR);
return 0;
}
 
include_once HORDE_BASE . '/lib/Horde.php';
include_once HORDE_BASE . '/lib/Secret.php';
 
/**
 
NOTE: On Windows 2000 SP4 with PHP 4.3.1, MCrypt 2.4.x, and Apache 1.3.28,
the session didn't work properly.
 
This may be resolved with 4.3.3.
 
*/
class ADODB_Encrypt_Secret {
/**
*/
function write($data, $key) {
return Secret::write($key, $data);
}
 
/**
*/
function read($data, $key) {
return Secret::read($key, $data);
}
 
}
 
return 1;
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-encrypt-sha1.php
0,0 → 1,32
<?php
if (!defined('ADODB_SESSION')) die();
 
include_once ADODB_SESSION . '/crypt.inc.php';
 
 
/**
 
*/
 
class ADODB_Encrypt_SHA1 {
 
function write($data, $key)
{
$sha1crypt =& new SHA1Crypt();
return $sha1crypt->encrypt($data, $key);
 
}
 
 
function read($data, $key)
{
$sha1crypt =& new SHA1Crypt();
return $sha1crypt->decrypt($data, $key);
 
}
}
 
 
 
return 1;
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-sess.txt
0,0 → 1,131
John,
 
I have been an extremely satisfied ADODB user for several years now.
 
To give you something back for all your hard work, I've spent the last 3
days rewriting the adodb-session.php code.
 
----------
What's New
----------
 
Here's a list of the new code's benefits:
 
* Combines the functionality of the three files:
 
adodb-session.php
adodb-session-clob.php
adodb-cryptsession.php
 
each with very similar functionality, into a single file adodb-session.php.
This will ease maintenance and support issues.
 
* Supports multiple encryption and compression schemes.
Currently, we support:
 
MD5Crypt (crypt.inc.php)
MCrypt
Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)
GZip
BZip2
 
These can be stacked, so if you want to compress and then encrypt your
session data, it's easy.
Also, the built-in MCrypt functions will be *much* faster, and more secure,
than the MD5Crypt code.
 
* adodb-session.php contains a single class ADODB_Session that encapsulates
all functionality.
This eliminates the use of global vars and defines (though they are
supported for backwards compatibility).
 
* All user defined parameters are now static functions in the ADODB_Session
class.
 
New parameters include:
 
* encryptionKey(): Define the encryption key used to encrypt the session.
Originally, it was a hard coded string.
 
* persist(): Define if the database will be opened in persistent mode.
Originally, the user had to call adodb_sess_open().
 
* dataFieldName(): Define the field name used to store the session data, as
'DATA' appears to be a reserved word in the following cases:
ANSI SQL
IBM DB2
MS SQL Server
Postgres
SAP
 
* filter(): Used to support multiple, simulataneous encryption/compression
schemes.
 
* Debug support is improved thru _rsdump() function, which is called after
every database call.
 
------------
What's Fixed
------------
 
The new code includes several bug fixes and enhancements:
 
* sesskey is compared in BINARY mode for MySQL, to avoid problems with
session keys that differ only by case.
Of course, the user should define the sesskey field as BINARY, to
correctly fix this problem, otherwise performance will suffer.
 
* In ADODB_Session::gc(), if $expire_notify is true, the multiple DELETES in
the original code have been optimized to a single DELETE.
 
* In ADODB_Session::destroy(), since "SELECT expireref, sesskey FROM $table
WHERE sesskey = $qkey" will only return a single value, we don't loop on the
result, we simply process the row, if any.
 
* We close $rs after every use.
 
---------------
What's the Same
---------------
 
I know backwards compatibility is *very* important to you. Therefore, the
new code is 100% backwards compatible.
 
If you like my code, but don't "trust" it's backwards compatible, maybe we
offer it as beta code, in a new directory for a release or two?
 
------------
What's To Do
------------
 
I've vascillated over whether to use a single function to get/set
parameters:
 
$user = ADODB_Session::user(); // get
ADODB_Session::user($user); // set
 
or to use separate functions (which is the PEAR/Java way):
 
$user = ADODB_Session::getUser();
ADODB_Session::setUser($user);
 
I've chosen the former as it's makes for a simpler API, and reduces the
amount of code, but I'd be happy to change it to the latter.
 
Also, do you think the class should be a singleton class, versus a static
class?
 
Let me know if you find this code useful, and will be including it in the
next release of ADODB.
 
If so, I will modify the current documentation to detail the new
functionality. To that end, what file(s) contain the documentation? Please
send them to me if they are not publically available.
 
Also, if there is *anything* in the code that you like to see changed, let
me know.
 
Thanks,
 
Ross
 
/web/kaklik's_web/torrentflux/adodb/session/adodb-session-clob.php
0,0 → 1,23
<?php
 
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com).
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
/*
 
This file is provided for backwards compatibility purposes
 
*/
 
require_once dirname(__FILE__) . '/adodb-session.php';
 
ADODB_Session::clob('CLOB');
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-session.php
0,0 → 1,917
<?php
 
 
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com).
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
*/
 
/*
You may want to rename the 'data' field to 'session_data' as
'data' appears to be a reserved word for one or more of the following:
ANSI SQL
IBM DB2
MS SQL Server
Postgres
SAP
 
If you do, then execute:
 
ADODB_Session::dataFieldName('session_data');
 
*/
 
if (!defined('_ADODB_LAYER')) {
require_once realpath(dirname(__FILE__) . '/../adodb.inc.php');
}
 
if (defined('ADODB_SESSION')) return 1;
 
define('ADODB_SESSION', dirname(__FILE__));
 
 
/*
Unserialize session data manually. See http://phplens.com/lens/lensforum/msgs.php?id=9821
From Kerr Schere, to unserialize session data stored via ADOdb.
1. Pull the session data from the db and loop through it.
2. Inside the loop, you will need to urldecode the data column.
3. After urldecode, run the serialized string through this function:
 
*/
function adodb_unserialize( $serialized_string )
{
$variables = array( );
$a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
for( $i = 0; $i < count( $a ); $i = $i+2 ) {
$variables[$a[$i]] = unserialize( $a[$i+1] );
}
return( $variables );
}
 
/*
Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
Since adodb 4.61.
*/
function adodb_session_regenerate_id()
{
$conn =& ADODB_Session::_conn();
if (!$conn) return false;
 
$old_id = session_id();
if (function_exists('session_regenerate_id')) {
session_regenerate_id();
} else {
session_id(md5(uniqid(rand(), true)));
$ck = session_get_cookie_params();
setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
//@session_start();
}
$new_id = session_id();
$ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
/* it is possible that the update statement fails due to a collision */
if (!$ok) {
session_id($old_id);
if (empty($ck)) $ck = session_get_cookie_params();
setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
return false;
}
return true;
}
 
/*
Generate database table for session data
@see http://phplens.com/lens/lensforum/msgs.php?id=12280
@return 0 if failure, 1 if errors, 2 if successful.
@author Markus Staab http://www.public-4u.de
*/
function adodb_session_create_table($schemaFile=null,$conn = null)
{
// set default values
if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema.xml';
if ($conn===null) $conn =& ADODB_Session::_conn();
 
if (!$conn) return 0;
 
$schema = new adoSchema($conn);
$schema->ParseSchema($schemaFile);
return $schema->ExecuteSchema();
}
 
/*!
\static
*/
class ADODB_Session {
/////////////////////
// getter/setter methods
/////////////////////
/*
function Lock($lock=null)
{
static $_lock = false;
if (!is_null($lock)) $_lock = $lock;
return $lock;
}
*/
/*!
*/
function driver($driver = null) {
static $_driver = 'mysql';
static $set = false;
 
if (!is_null($driver)) {
$_driver = trim($driver);
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
return $GLOBALS['ADODB_SESSION_DRIVER'];
}
}
 
return $_driver;
}
 
/*!
*/
function host($host = null) {
static $_host = 'localhost';
static $set = false;
 
if (!is_null($host)) {
$_host = trim($host);
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
return $GLOBALS['ADODB_SESSION_CONNECT'];
}
}
 
return $_host;
}
 
/*!
*/
function user($user = null) {
static $_user = 'root';
static $set = false;
 
if (!is_null($user)) {
$_user = trim($user);
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESSION_USER'])) {
return $GLOBALS['ADODB_SESSION_USER'];
}
}
 
return $_user;
}
 
/*!
*/
function password($password = null) {
static $_password = '';
static $set = false;
 
if (!is_null($password)) {
$_password = $password;
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
return $GLOBALS['ADODB_SESSION_PWD'];
}
}
 
return $_password;
}
 
/*!
*/
function database($database = null) {
static $_database = 'xphplens_2';
static $set = false;
 
if (!is_null($database)) {
$_database = trim($database);
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESSION_DB'])) {
return $GLOBALS['ADODB_SESSION_DB'];
}
}
 
return $_database;
}
 
/*!
*/
function persist($persist = null)
{
static $_persist = true;
 
if (!is_null($persist)) {
$_persist = trim($persist);
}
 
return $_persist;
}
 
/*!
*/
function lifetime($lifetime = null) {
static $_lifetime;
static $set = false;
 
if (!is_null($lifetime)) {
$_lifetime = (int) $lifetime;
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
return $GLOBALS['ADODB_SESS_LIFE'];
}
}
if (!$_lifetime) {
$_lifetime = ini_get('session.gc_maxlifetime');
if ($_lifetime <= 1) {
// bug in PHP 4.0.3 pl 1 -- how about other versions?
//print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $lifetime</h3>";
$_lifetime = 1440;
}
}
 
return $_lifetime;
}
 
/*!
*/
function debug($debug = null) {
static $_debug = false;
static $set = false;
 
if (!is_null($debug)) {
$_debug = (bool) $debug;
 
$conn = ADODB_Session::_conn();
if ($conn) {
$conn->debug = $_debug;
}
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESS_DEBUG'])) {
return $GLOBALS['ADODB_SESS_DEBUG'];
}
}
 
return $_debug;
}
 
/*!
*/
function expireNotify($expire_notify = null) {
static $_expire_notify;
static $set = false;
 
if (!is_null($expire_notify)) {
$_expire_notify = $expire_notify;
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) {
return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'];
}
}
 
return $_expire_notify;
}
 
/*!
*/
function table($table = null) {
static $_table = 'sessions';
static $set = false;
 
if (!is_null($table)) {
$_table = trim($table);
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESSION_TBL'])) {
return $GLOBALS['ADODB_SESSION_TBL'];
}
}
 
return $_table;
}
 
/*!
*/
function optimize($optimize = null) {
static $_optimize = false;
static $set = false;
 
if (!is_null($optimize)) {
$_optimize = (bool) $optimize;
$set = true;
} elseif (!$set) {
// backwards compatibility
if (defined('ADODB_SESSION_OPTIMIZE')) {
return true;
}
}
 
return $_optimize;
}
 
/*!
*/
function syncSeconds($sync_seconds = null) {
static $_sync_seconds = 60;
static $set = false;
 
if (!is_null($sync_seconds)) {
$_sync_seconds = (int) $sync_seconds;
$set = true;
} elseif (!$set) {
// backwards compatibility
if (defined('ADODB_SESSION_SYNCH_SECS')) {
return ADODB_SESSION_SYNCH_SECS;
}
}
 
return $_sync_seconds;
}
 
/*!
*/
function clob($clob = null) {
static $_clob = false;
static $set = false;
 
if (!is_null($clob)) {
$_clob = strtolower(trim($clob));
$set = true;
} elseif (!$set) {
// backwards compatibility
if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) {
return $GLOBALS['ADODB_SESSION_USE_LOBS'];
}
}
 
return $_clob;
}
 
/*!
*/
function dataFieldName($data_field_name = null) {
static $_data_field_name = 'data';
 
if (!is_null($data_field_name)) {
$_data_field_name = trim($data_field_name);
}
 
return $_data_field_name;
}
 
/*!
*/
function filter($filter = null) {
static $_filter = array();
 
if (!is_null($filter)) {
if (!is_array($filter)) {
$filter = array($filter);
}
$_filter = $filter;
}
 
return $_filter;
}
 
/*!
*/
function encryptionKey($encryption_key = null) {
static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!';
 
if (!is_null($encryption_key)) {
$_encryption_key = $encryption_key;
}
 
return $_encryption_key;
}
 
/////////////////////
// private methods
/////////////////////
 
/*!
*/
function &_conn($conn=null) {
return $GLOBALS['ADODB_SESS_CONN'];
}
 
/*!
*/
function _crc($crc = null) {
static $_crc = false;
 
if (!is_null($crc)) {
$_crc = $crc;
}
 
return $_crc;
}
 
/*!
*/
function _init() {
session_module_name('user');
session_set_save_handler(
array('ADODB_Session', 'open'),
array('ADODB_Session', 'close'),
array('ADODB_Session', 'read'),
array('ADODB_Session', 'write'),
array('ADODB_Session', 'destroy'),
array('ADODB_Session', 'gc')
);
}
 
 
/*!
*/
function _sessionKey() {
// use this function to create the encryption key for crypted sessions
// crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt
return crypt(ADODB_Session::encryptionKey(), session_id());
}
 
/*!
*/
function _dumprs($rs) {
$conn =& ADODB_Session::_conn();
$debug = ADODB_Session::debug();
 
if (!$conn) {
return;
}
 
if (!$debug) {
return;
}
 
if (!$rs) {
echo "<br />\$rs is null or false<br />\n";
return;
}
 
//echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n";
 
if (!is_object($rs)) {
return;
}
 
require_once ADODB_SESSION.'/../tohtml.inc.php';
rs2html($rs);
}
 
/////////////////////
// public methods
/////////////////////
 
/*!
Create the connection to the database.
 
If $conn already exists, reuse that connection
*/
function open($save_path, $session_name, $persist = null) {
$conn =& ADODB_Session::_conn();
 
if ($conn) {
return true;
}
 
$database = ADODB_Session::database();
$debug = ADODB_Session::debug();
$driver = ADODB_Session::driver();
$host = ADODB_Session::host();
$password = ADODB_Session::password();
$user = ADODB_Session::user();
 
if (!is_null($persist)) {
ADODB_Session::persist($persist);
} else {
$persist = ADODB_Session::persist();
}
 
# these can all be defaulted to in php.ini
# assert('$database');
# assert('$driver');
# assert('$host');
 
// cannot use =& below - do not know why...
$conn =& ADONewConnection($driver);
 
if ($debug) {
$conn->debug = true;
// ADOConnection::outp( " driver=$driver user=$user pwd=$password db=$database ");
}
 
if ($persist) {
switch($persist) {
default:
case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;
case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;
case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;
}
} else {
$ok = $conn->Connect($host, $user, $password, $database);
}
 
if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;
else
ADOConnection::outp('<p>Session: connection failed</p>', false);
 
return $ok;
}
 
/*!
Close the connection
*/
function close() {
/*
$conn =& ADODB_Session::_conn();
if ($conn) $conn->Close();
*/
return true;
}
 
/*
Slurp in the session variables and return the serialized string
*/
function read($key) {
$conn =& ADODB_Session::_conn();
$data = ADODB_Session::dataFieldName();
$filter = ADODB_Session::filter();
$table = ADODB_Session::table();
 
if (!$conn) {
return '';
}
 
assert('$table');
 
$qkey = $conn->quote($key);
$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
$sql = "SELECT $data FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . time();
/* Lock code does not work as it needs to hold transaction within whole page, and we don't know if
developer has commited elsewhere... :(
*/
#if (ADODB_Session::Lock())
# $rs =& $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), $data);
#else
$rs =& $conn->Execute($sql);
//ADODB_Session::_dumprs($rs);
if ($rs) {
if ($rs->EOF) {
$v = '';
} else {
$v = reset($rs->fields);
$filter = array_reverse($filter);
foreach ($filter as $f) {
if (is_object($f)) {
$v = $f->read($v, ADODB_Session::_sessionKey());
}
}
$v = rawurldecode($v);
}
 
$rs->Close();
 
ADODB_Session::_crc(strlen($v) . crc32($v));
return $v;
}
 
return '';
}
 
/*!
Write the serialized data to a database.
 
If the data has not been modified since the last read(), we do not write.
*/
function write($key, $val) {
$clob = ADODB_Session::clob();
$conn =& ADODB_Session::_conn();
$crc = ADODB_Session::_crc();
$data = ADODB_Session::dataFieldName();
$debug = ADODB_Session::debug();
$driver = ADODB_Session::driver();
$expire_notify = ADODB_Session::expireNotify();
$filter = ADODB_Session::filter();
$lifetime = ADODB_Session::lifetime();
$table = ADODB_Session::table();
if (!$conn) {
return false;
}
$qkey = $conn->qstr($key);
assert('$table');
 
$expiry = time() + $lifetime;
 
$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
 
// crc32 optimization since adodb 2.1
// now we only update expiry date, thx to sebastian thom in adodb 2.32
if ($crc !== false && $crc == (strlen($val) . crc32($val))) {
if ($debug) {
echo '<p>Session: Only updating date - crc32 not changed</p>';
}
$sql = "UPDATE $table SET expiry = ".$conn->Param('0')." WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= ".$conn->Param('2');
$rs =& $conn->Execute($sql,array($expiry,$key,time()));
ADODB_Session::_dumprs($rs);
if ($rs) {
$rs->Close();
}
return true;
}
$val = rawurlencode($val);
foreach ($filter as $f) {
if (is_object($f)) {
$val = $f->write($val, ADODB_Session::_sessionKey());
}
}
 
$arr = array('sesskey' => $key, 'expiry' => $expiry, $data => $val, 'expireref' => '');
if ($expire_notify) {
$var = reset($expire_notify);
global $$var;
if (isset($$var)) {
$arr['expireref'] = $$var;
}
}
 
if (!$clob) { // no lobs, simply use replace()
$arr[$data] = $conn->qstr($val);
$rs = $conn->Replace($table, $arr, 'sesskey', $autoQuote = true);
ADODB_Session::_dumprs($rs);
} else {
// what value shall we insert/update for lob row?
switch ($driver) {
// empty_clob or empty_lob for oracle dbs
case 'oracle':
case 'oci8':
case 'oci8po':
case 'oci805':
$lob_value = sprintf('empty_%s()', strtolower($clob));
break;
 
// null for all other
default:
$lob_value = 'null';
break;
}
// do we insert or update? => as for sesskey
$rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey");
ADODB_Session::_dumprs($rs);
if ($rs && reset($rs->fields) > 0) {
$sql = "UPDATE $table SET expiry = $expiry, $data = $lob_value WHERE sesskey = $qkey";
} else {
$sql = "INSERT INTO $table (expiry, $data, sesskey) VALUES ($expiry, $lob_value, $qkey)";
}
if ($rs) {
$rs->Close();
}
 
$err = '';
$rs1 =& $conn->Execute($sql);
ADODB_Session::_dumprs($rs1);
if (!$rs1) {
$err = $conn->ErrorMsg()."\n";
}
$rs2 =& $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob));
ADODB_Session::_dumprs($rs2);
if (!$rs2) {
$err .= $conn->ErrorMsg()."\n";
}
$rs = ($rs && $rs2) ? true : false;
if ($rs1) {
$rs1->Close();
}
if (is_object($rs2)) {
$rs2->Close();
}
}
 
if (!$rs) {
ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);
return false;
} else {
// bug in access driver (could be odbc?) means that info is not committed
// properly unless select statement executed in Win2000
if ($conn->databaseType == 'access') {
$sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";
$rs =& $conn->Execute($sql);
ADODB_Session::_dumprs($rs);
if ($rs) {
$rs->Close();
}
}
}/*
if (ADODB_Session::Lock()) {
$conn->CommitTrans();
}*/
return $rs ? true : false;
}
 
/*!
*/
function destroy($key) {
$conn =& ADODB_Session::_conn();
$table = ADODB_Session::table();
$expire_notify = ADODB_Session::expireNotify();
 
if (!$conn) {
return false;
}
 
assert('$table');
 
$qkey = $conn->quote($key);
$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
 
if ($expire_notify) {
reset($expire_notify);
$fn = next($expire_notify);
$savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
$sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";
$rs =& $conn->Execute($sql);
ADODB_Session::_dumprs($rs);
$conn->SetFetchMode($savem);
if (!$rs) {
return false;
}
if (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
//assert('$ref');
//assert('$key');
$fn($ref, $key);
}
$rs->Close();
}
 
$sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
$rs =& $conn->Execute($sql);
ADODB_Session::_dumprs($rs);
if ($rs) {
$rs->Close();
}
 
return $rs ? true : false;
}
 
/*!
*/
function gc($maxlifetime) {
$conn =& ADODB_Session::_conn();
$debug = ADODB_Session::debug();
$expire_notify = ADODB_Session::expireNotify();
$optimize = ADODB_Session::optimize();
$sync_seconds = ADODB_Session::syncSeconds();
$table = ADODB_Session::table();
 
if (!$conn) {
return false;
}
 
assert('$table');
 
$time = time();
 
$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
 
if ($expire_notify) {
reset($expire_notify);
$fn = next($expire_notify);
$savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
$sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time";
$rs =& $conn->Execute($sql);
ADODB_Session::_dumprs($rs);
$conn->SetFetchMode($savem);
if ($rs) {
$conn->BeginTrans();
$keys = array();
while (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
$fn($ref, $key);
$del = $conn->Execute("DELETE FROM $table WHERE sesskey='$key'");
$rs->MoveNext();
}
$rs->Close();
$conn->CommitTrans();
}
} else {
if (1) {
$sql = "SELECT sesskey FROM $table WHERE expiry < $time";
$arr =& $conn->GetAll($sql);
foreach ($arr as $row) {
$sql2 = "DELETE FROM $table WHERE sesskey='$row[0]'";
$conn->Execute($sql2);
}
} else {
$sql = "DELETE FROM $table WHERE expiry < $time";
$rs =& $conn->Execute($sql);
ADODB_Session::_dumprs($rs);
if ($rs) $rs->Close();
}
if ($debug) {
ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>");
}
}
 
// suggested by Cameron, "GaM3R" <gamr@outworld.cx>
if ($optimize) {
$driver = ADODB_Session::driver();
 
if (preg_match('/mysql/i', $driver)) {
$sql = "OPTIMIZE TABLE $table";
}
if (preg_match('/postgres/i', $driver)) {
$sql = "VACUUM $table";
}
if (!empty($sql)) {
$conn->Execute($sql);
}
}
 
if ($sync_seconds) {
$sql = 'SELECT ';
if ($conn->dataProvider === 'oci8') {
$sql .= "TO_CHAR({$conn->sysTimeStamp}, 'RRRR-MM-DD HH24:MI:SS')";
} else {
$sql .= $conn->sysTimeStamp;
}
$sql .= " FROM $table";
 
$rs =& $conn->SelectLimit($sql, 1);
if ($rs && !$rs->EOF) {
$dbts = reset($rs->fields);
$rs->Close();
$dbt = $conn->UnixTimeStamp($dbts);
$t = time();
 
if (abs($dbt - $t) >= $sync_seconds) {
$msg = __FILE__ .
": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: " .
" database=$dbt ($dbts), webserver=$t (diff=". (abs($dbt - $t) / 60) . ' minutes)';
error_log($msg);
if ($debug) {
ADOConnection::outp("<p>$msg</p>");
}
}
}
}
 
return true;
}
}
 
ADODB_Session::_init();
register_shutdown_function('session_write_close');
 
// for backwards compatability only
function adodb_sess_open($save_path, $session_name, $persist = true) {
return ADODB_Session::open($save_path, $session_name, $persist);
}
 
// for backwards compatability only
function adodb_sess_gc($t)
{
return ADODB_Session::gc($t);
}
 
?>
/web/kaklik's_web/torrentflux/adodb/session/adodb-sessions.mysql.sql
0,0 → 1,16
-- $CVSHeader$
 
CREATE DATABASE /*! IF NOT EXISTS */ adodb_sessions;
 
USE adodb_sessions;
 
DROP TABLE /*! IF EXISTS */ sessions;
 
CREATE TABLE /*! IF NOT EXISTS */ sessions (
sesskey CHAR(32) /*! BINARY */ NOT NULL DEFAULT '',
expiry INT(11) /*! UNSIGNED */ NOT NULL DEFAULT 0,
expireref VARCHAR(64) DEFAULT '',
data LONGTEXT DEFAULT '',
PRIMARY KEY (sesskey),
INDEX expiry (expiry)
);
/web/kaklik's_web/torrentflux/adodb/session/adodb-sessions.oracle.clob.sql
0,0 → 1,15
-- $CVSHeader$
 
DROP TABLE adodb_sessions;
 
CREATE TABLE sessions (
sesskey CHAR(32) DEFAULT '' NOT NULL,
expiry INT DEFAULT 0 NOT NULL,
expireref VARCHAR(64) DEFAULT '',
data CLOB DEFAULT '',
PRIMARY KEY (sesskey)
);
 
CREATE INDEX ix_expiry ON sessions (expiry);
 
QUIT;
/web/kaklik's_web/torrentflux/adodb/session/adodb-sessions.oracle.sql
0,0 → 1,16
-- $CVSHeader$
 
DROP TABLE adodb_sessions;
 
CREATE TABLE sessions (
sesskey CHAR(32) DEFAULT '' NOT NULL,
expiry INT DEFAULT 0 NOT NULL,
expireref VARCHAR(64) DEFAULT '',
data VARCHAR(4000) DEFAULT '',
PRIMARY KEY (sesskey),
INDEX expiry (expiry)
);
 
CREATE INDEX ix_expiry ON sessions (expiry);
 
QUIT;
/web/kaklik's_web/torrentflux/adodb/session/crypt.inc.php
0,0 → 1,161
<?php
// Session Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com>
class MD5Crypt{
function keyED($txt,$encrypt_key)
{
$encrypt_key = md5($encrypt_key);
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++){
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
}
 
function Encrypt($txt,$key)
{
srand((double)microtime()*1000000);
$encrypt_key = md5(rand(0,32000));
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++)
{
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($encrypt_key,$ctr,1) .
(substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
$ctr++;
}
return base64_encode($this->keyED($tmp,$key));
}
 
function Decrypt($txt,$key)
{
$txt = $this->keyED(base64_decode($txt),$key);
$tmp = "";
for ($i=0;$i<strlen($txt);$i++){
$md5 = substr($txt,$i,1);
$i++;
$tmp.= (substr($txt,$i,1) ^ $md5);
}
return $tmp;
}
 
function RandPass()
{
$randomPassword = "";
srand((double)microtime()*1000000);
for($i=0;$i<8;$i++)
{
$randnumber = rand(48,120);
 
while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96))
{
$randnumber = rand(48,120);
}
 
$randomPassword .= chr($randnumber);
}
return $randomPassword;
}
 
}
 
 
class SHA1Crypt{
 
function keyED($txt,$encrypt_key)
{
 
$encrypt_key = sha1($encrypt_key);
$ctr=0;
$tmp = "";
 
for ($i=0;$i<strlen($txt);$i++){
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
 
}
 
 
 
function Encrypt($txt,$key)
{
 
srand((double)microtime()*1000000);
$encrypt_key = sha1(rand(0,32000));
$ctr=0;
$tmp = "";
 
for ($i=0;$i<strlen($txt);$i++)
 
{
 
if ($ctr==strlen($encrypt_key)) $ctr=0;
 
$tmp.= substr($encrypt_key,$ctr,1) .
 
(substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
 
$ctr++;
 
}
 
return base64_encode($this->keyED($tmp,$key));
 
}
 
 
 
function Decrypt($txt,$key)
{
 
$txt = $this->keyED(base64_decode($txt),$key);
 
$tmp = "";
 
for ($i=0;$i<strlen($txt);$i++){
 
$sha1 = substr($txt,$i,1);
 
$i++;
 
$tmp.= (substr($txt,$i,1) ^ $sha1);
 
}
 
return $tmp;
}
 
 
 
function RandPass()
{
$randomPassword = "";
srand((double)microtime()*1000000);
 
for($i=0;$i<8;$i++)
{
 
$randnumber = rand(48,120);
 
while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96))
{
$randnumber = rand(48,120);
}
 
$randomPassword .= chr($randnumber);
}
 
return $randomPassword;
 
}
 
 
 
}
?>
/web/kaklik's_web/torrentflux/adodb/session/old/adodb-cryptsession.php
0,0 → 1,324
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Made table name configurable - by David Johnson djohnson@inpro.net
Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com>
Set tabs to 4 for best viewing.
Latest version of ADODB is available at http://php.weblogs.com/adodb
======================================================================
This file provides PHP4 session management using the ADODB database
wrapper library.
Example
=======
include('adodb.inc.php');
#---------------------------------#
include('adodb-cryptsession.php');
#---------------------------------#
session_start();
session_register('AVAR');
$_SESSION['AVAR'] += 1;
print "
-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
 
Installation
============
1. Create a new database in MySQL or Access "sessions" like
so:
create table sessions (
SESSKEY char(32) not null,
EXPIRY int(11) unsigned not null,
EXPIREREF varchar(64),
DATA CLOB,
primary key (sesskey)
);
2. Then define the following parameters. You can either modify
this file, or define them before this file is included:
$ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
$ADODB_SESSION_CONNECT='server to connect to';
$ADODB_SESSION_USER ='user';
$ADODB_SESSION_PWD ='password';
$ADODB_SESSION_DB ='database';
$ADODB_SESSION_TBL = 'sessions'
3. Recommended is PHP 4.0.2 or later. There are documented
session bugs in earlier versions of PHP.
 
*/
 
 
include_once('crypt.inc.php');
 
if (!defined('_ADODB_LAYER')) {
include (dirname(__FILE__).'/adodb.inc.php');
}
 
/* if database time and system time is difference is greater than this, then give warning */
define('ADODB_SESSION_SYNCH_SECS',60);
 
if (!defined('ADODB_SESSION')) {
 
define('ADODB_SESSION',1);
GLOBAL $ADODB_SESSION_CONNECT,
$ADODB_SESSION_DRIVER,
$ADODB_SESSION_USER,
$ADODB_SESSION_PWD,
$ADODB_SESSION_DB,
$ADODB_SESS_CONN,
$ADODB_SESS_LIFE,
$ADODB_SESS_DEBUG,
$ADODB_SESS_INSERT,
$ADODB_SESSION_EXPIRE_NOTIFY,
$ADODB_SESSION_TBL;
 
//$ADODB_SESS_DEBUG = true;
/* SET THE FOLLOWING PARAMETERS */
if (empty($ADODB_SESSION_DRIVER)) {
$ADODB_SESSION_DRIVER='mysql';
$ADODB_SESSION_CONNECT='localhost';
$ADODB_SESSION_USER ='root';
$ADODB_SESSION_PWD ='';
$ADODB_SESSION_DB ='xphplens_2';
}
 
if (empty($ADODB_SESSION_TBL)){
$ADODB_SESSION_TBL = 'sessions';
}
 
if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
$ADODB_SESSION_EXPIRE_NOTIFY = false;
}
 
function ADODB_Session_Key()
{
$ADODB_CRYPT_KEY = 'CRYPTED ADODB SESSIONS ROCK!';
 
/* USE THIS FUNCTION TO CREATE THE ENCRYPTION KEY FOR CRYPTED SESSIONS */
/* Crypt the used key, $ADODB_CRYPT_KEY as key and session_ID as SALT */
return crypt($ADODB_CRYPT_KEY, session_ID());
}
 
$ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
if ($ADODB_SESS_LIFE <= 1) {
// bug in PHP 4.0.3 pl 1 -- how about other versions?
//print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
$ADODB_SESS_LIFE=1440;
}
 
function adodb_sess_open($save_path, $session_name)
{
GLOBAL $ADODB_SESSION_CONNECT,
$ADODB_SESSION_DRIVER,
$ADODB_SESSION_USER,
$ADODB_SESSION_PWD,
$ADODB_SESSION_DB,
$ADODB_SESS_CONN,
$ADODB_SESS_DEBUG;
$ADODB_SESS_INSERT = false;
if (isset($ADODB_SESS_CONN)) return true;
$ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
if (!empty($ADODB_SESS_DEBUG)) {
$ADODB_SESS_CONN->debug = true;
print" conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ";
}
return $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
$ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
}
 
function adodb_sess_close()
{
global $ADODB_SESS_CONN;
 
if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
return true;
}
 
function adodb_sess_read($key)
{
$Crypt = new MD5Crypt;
global $ADODB_SESS_CONN,$ADODB_SESS_INSERT,$ADODB_SESSION_TBL;
$rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
if ($rs) {
if ($rs->EOF) {
$ADODB_SESS_INSERT = true;
$v = '';
} else {
// Decrypt session data
$v = rawurldecode($Crypt->Decrypt(reset($rs->fields), ADODB_Session_Key()));
}
$rs->Close();
return $v;
}
else $ADODB_SESS_INSERT = true;
return '';
}
 
function adodb_sess_write($key, $val)
{
$Crypt = new MD5Crypt;
global $ADODB_SESS_INSERT,$ADODB_SESS_CONN, $ADODB_SESS_LIFE, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
 
$expiry = time() + $ADODB_SESS_LIFE;
 
// encrypt session data..
$val = $Crypt->Encrypt(rawurlencode($val), ADODB_Session_Key());
$arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
$var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
global $$var;
$arr['expireref'] = $$var;
}
$rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,
$arr,
'sesskey',$autoQuote = true);
 
if (!$rs) {
ADOConnection::outp( '
-- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false);
} else {
// bug in access driver (could be odbc?) means that info is not commited
// properly unless select statement executed in Win2000
if ($ADODB_SESS_CONN->databaseType == 'access') $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
}
return isset($rs);
}
 
function adodb_sess_destroy($key)
{
global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
reset($ADODB_SESSION_EXPIRE_NOTIFY);
$fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
$savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
$rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$ADODB_SESS_CONN->SetFetchMode($savem);
if ($rs) {
$ADODB_SESS_CONN->BeginTrans();
while (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
$fn($ref,$key);
$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$rs->MoveNext();
}
$ADODB_SESS_CONN->CommitTrans();
}
} else {
$qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
$rs = $ADODB_SESS_CONN->Execute($qry);
}
return $rs ? true : false;
}
 
 
function adodb_sess_gc($maxlifetime) {
global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY,$ADODB_SESS_DEBUG;
 
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
reset($ADODB_SESSION_EXPIRE_NOTIFY);
$fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
$savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
$t = time();
$rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
$ADODB_SESS_CONN->SetFetchMode($savem);
if ($rs) {
$ADODB_SESS_CONN->BeginTrans();
while (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
$fn($ref,$key);
//$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$rs->MoveNext();
}
$rs->Close();
$ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t");
$ADODB_SESS_CONN->CommitTrans();
}
} else {
$qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time();
$ADODB_SESS_CONN->Execute($qry);
}
// suggested by Cameron, "GaM3R" <gamr@outworld.cx>
if (defined('ADODB_SESSION_OPTIMIZE'))
{
global $ADODB_SESSION_DRIVER;
switch( $ADODB_SESSION_DRIVER ) {
case 'mysql':
case 'mysqlt':
$opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
break;
case 'postgresql':
case 'postgresql7':
$opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
break;
}
}
if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
$rs =& $ADODB_SESS_CONN->SelectLimit($sql,1);
if ($rs && !$rs->EOF) {
$dbts = reset($rs->fields);
$rs->Close();
$dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
$t = time();
if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
$msg =
__FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
error_log($msg);
if ($ADODB_SESS_DEBUG) ADOConnection::outp("
-- $msg</p>");
}
}
return true;
}
 
session_module_name('user');
session_set_save_handler(
"adodb_sess_open",
"adodb_sess_close",
"adodb_sess_read",
"adodb_sess_write",
"adodb_sess_destroy",
"adodb_sess_gc");
}
 
/* TEST SCRIPT -- UNCOMMENT */
/*
if (0) {
 
session_start();
session_register('AVAR');
$_SESSION['AVAR'] += 1;
print "
-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
}
*/
?>
/web/kaklik's_web/torrentflux/adodb/session/old/adodb-session-clob.php
0,0 → 1,448
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version of ADODB is available at http://php.weblogs.com/adodb
======================================================================
This file provides PHP4 session management using the ADODB database
wrapper library, using Oracle CLOB's to store data. Contributed by achim.gosse@ddd.de.
 
Example
=======
include('adodb.inc.php');
include('adodb-session.php');
session_start();
session_register('AVAR');
$_SESSION['AVAR'] += 1;
print "
-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
To force non-persistent connections, call adodb_session_open first before session_start():
 
include('adodb.inc.php');
include('adodb-session.php');
adodb_session_open(false,false,false);
session_start();
session_register('AVAR');
$_SESSION['AVAR'] += 1;
print "
-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
 
Installation
============
1. Create this table in your database (syntax might vary depending on your db):
create table sessions (
SESSKEY char(32) not null,
EXPIRY int(11) unsigned not null,
EXPIREREF varchar(64),
DATA CLOB,
primary key (sesskey)
);
 
 
2. Then define the following parameters in this file:
$ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
$ADODB_SESSION_CONNECT='server to connect to';
$ADODB_SESSION_USER ='user';
$ADODB_SESSION_PWD ='password';
$ADODB_SESSION_DB ='database';
$ADODB_SESSION_TBL = 'sessions'
$ADODB_SESSION_USE_LOBS = false; (or, if you wanna use CLOBS (= 'CLOB') or ( = 'BLOB')
3. Recommended is PHP 4.1.0 or later. There are documented
session bugs in earlier versions of PHP.
 
4. If you want to receive notifications when a session expires, then
you can tag a session with an EXPIREREF, and before the session
record is deleted, we can call a function that will pass the EXPIREREF
as the first parameter, and the session key as the second parameter.
To do this, define a notification function, say NotifyFn:
function NotifyFn($expireref, $sesskey)
{
}
Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY.
This is an array with 2 elements, the first being the name of the variable
you would like to store in the EXPIREREF field, and the 2nd is the
notification function's name.
In this example, we want to be notified when a user's session
has expired, so we store the user id in the global variable $USERID,
store this value in the EXPIREREF field:
$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
Then when the NotifyFn is called, we are passed the $USERID as the first
parameter, eg. NotifyFn($userid, $sesskey).
*/
 
if (!defined('_ADODB_LAYER')) {
include (dirname(__FILE__).'/adodb.inc.php');
}
 
if (!defined('ADODB_SESSION')) {
 
define('ADODB_SESSION',1);
/* if database time and system time is difference is greater than this, then give warning */
define('ADODB_SESSION_SYNCH_SECS',60);
 
/****************************************************************************************\
Global definitions
\****************************************************************************************/
GLOBAL $ADODB_SESSION_CONNECT,
$ADODB_SESSION_DRIVER,
$ADODB_SESSION_USER,
$ADODB_SESSION_PWD,
$ADODB_SESSION_DB,
$ADODB_SESS_CONN,
$ADODB_SESS_LIFE,
$ADODB_SESS_DEBUG,
$ADODB_SESSION_EXPIRE_NOTIFY,
$ADODB_SESSION_CRC,
$ADODB_SESSION_USE_LOBS,
$ADODB_SESSION_TBL;
if (!isset($ADODB_SESSION_USE_LOBS)) $ADODB_SESSION_USE_LOBS = 'CLOB';
$ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
if ($ADODB_SESS_LIFE <= 1) {
// bug in PHP 4.0.3 pl 1 -- how about other versions?
//print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
$ADODB_SESS_LIFE=1440;
}
$ADODB_SESSION_CRC = false;
//$ADODB_SESS_DEBUG = true;
//////////////////////////////////
/* SET THE FOLLOWING PARAMETERS */
//////////////////////////////////
if (empty($ADODB_SESSION_DRIVER)) {
$ADODB_SESSION_DRIVER='mysql';
$ADODB_SESSION_CONNECT='localhost';
$ADODB_SESSION_USER ='root';
$ADODB_SESSION_PWD ='';
$ADODB_SESSION_DB ='xphplens_2';
}
if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
$ADODB_SESSION_EXPIRE_NOTIFY = false;
}
// Made table name configurable - by David Johnson djohnson@inpro.net
if (empty($ADODB_SESSION_TBL)){
$ADODB_SESSION_TBL = 'sessions';
}
 
// defaulting $ADODB_SESSION_USE_LOBS
if (!isset($ADODB_SESSION_USE_LOBS) || empty($ADODB_SESSION_USE_LOBS)) {
$ADODB_SESSION_USE_LOBS = false;
}
 
/*
$ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER;
$ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT;
$ADODB_SESS['user'] = $ADODB_SESSION_USER;
$ADODB_SESS['pwd'] = $ADODB_SESSION_PWD;
$ADODB_SESS['db'] = $ADODB_SESSION_DB;
$ADODB_SESS['life'] = $ADODB_SESS_LIFE;
$ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
$ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
$ADODB_SESS['table'] = $ADODB_SESS_TBL;
*/
/****************************************************************************************\
Create the connection to the database.
If $ADODB_SESS_CONN already exists, reuse that connection
\****************************************************************************************/
function adodb_sess_open($save_path, $session_name,$persist=true)
{
GLOBAL $ADODB_SESS_CONN;
if (isset($ADODB_SESS_CONN)) return true;
GLOBAL $ADODB_SESSION_CONNECT,
$ADODB_SESSION_DRIVER,
$ADODB_SESSION_USER,
$ADODB_SESSION_PWD,
$ADODB_SESSION_DB,
$ADODB_SESS_DEBUG;
// cannot use & below - do not know why...
$ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
if (!empty($ADODB_SESS_DEBUG)) {
$ADODB_SESS_CONN->debug = true;
ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ");
}
if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
$ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT,
$ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
if (!$ok) ADOConnection::outp( "
-- Session: connection failed</p>",false);
}
 
/****************************************************************************************\
Close the connection
\****************************************************************************************/
function adodb_sess_close()
{
global $ADODB_SESS_CONN;
 
if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
return true;
}
 
/****************************************************************************************\
Slurp in the session variables and return the serialized string
\****************************************************************************************/
function adodb_sess_read($key)
{
global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC;
 
$rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
if ($rs) {
if ($rs->EOF) {
$v = '';
} else
$v = rawurldecode(reset($rs->fields));
$rs->Close();
// new optimization adodb 2.1
$ADODB_SESSION_CRC = strlen($v).crc32($v);
return $v;
}
return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com
}
 
/****************************************************************************************\
Write the serialized data to a database.
If the data has not been modified since adodb_sess_read(), we do not write.
\****************************************************************************************/
function adodb_sess_write($key, $val)
{
global
$ADODB_SESS_CONN,
$ADODB_SESS_LIFE,
$ADODB_SESSION_TBL,
$ADODB_SESS_DEBUG,
$ADODB_SESSION_CRC,
$ADODB_SESSION_EXPIRE_NOTIFY,
$ADODB_SESSION_DRIVER, // added
$ADODB_SESSION_USE_LOBS; // added
 
$expiry = time() + $ADODB_SESS_LIFE;
// crc32 optimization since adodb 2.1
// now we only update expiry date, thx to sebastian thom in adodb 2.32
if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) {
if ($ADODB_SESS_DEBUG) echo "
-- Session: Only updating date - crc32 not changed</p>";
$qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time();
$rs = $ADODB_SESS_CONN->Execute($qry);
return true;
}
$val = rawurlencode($val);
$arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
$var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
global $$var;
$arr['expireref'] = $$var;
}
 
if ($ADODB_SESSION_USE_LOBS === false) { // no lobs, simply use replace()
$rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr, 'sesskey',$autoQuote = true);
if (!$rs) {
$err = $ADODB_SESS_CONN->ErrorMsg();
}
} else {
// what value shall we insert/update for lob row?
switch ($ADODB_SESSION_DRIVER) {
// empty_clob or empty_lob for oracle dbs
case "oracle":
case "oci8":
case "oci8po":
case "oci805":
$lob_value = sprintf("empty_%s()", strtolower($ADODB_SESSION_USE_LOBS));
break;
 
// null for all other
default:
$lob_value = "null";
break;
}
 
// do we insert or update? => as for sesskey
$res = $ADODB_SESS_CONN->Execute("select count(*) as cnt from $ADODB_SESSION_TBL where sesskey = '$key'");
if ($res && reset($res->fields) > 0) {
$qry = sprintf("update %s set expiry = %d, data = %s where sesskey = '%s'", $ADODB_SESSION_TBL, $expiry, $lob_value, $key);
} else {
// insert
$qry = sprintf("insert into %s (sesskey, expiry, data) values ('%s', %d, %s)", $ADODB_SESSION_TBL, $key, $expiry, $lob_value);
}
 
$err = "";
$rs1 = $ADODB_SESS_CONN->Execute($qry);
if (!$rs1) {
$err .= $ADODB_SESS_CONN->ErrorMsg()."\n";
}
$rs2 = $ADODB_SESS_CONN->UpdateBlob($ADODB_SESSION_TBL, 'data', $val, "sesskey='$key'", strtoupper($ADODB_SESSION_USE_LOBS));
if (!$rs2) {
$err .= $ADODB_SESS_CONN->ErrorMsg()."\n";
}
$rs = ($rs1 && $rs2) ? true : false;
}
 
if (!$rs) {
ADOConnection::outp( '
-- Session Replace: '.nl2br($err).'</p>',false);
} else {
// bug in access driver (could be odbc?) means that info is not commited
// properly unless select statement executed in Win2000
if ($ADODB_SESS_CONN->databaseType == 'access')
$rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
}
return !empty($rs);
}
 
function adodb_sess_destroy($key)
{
global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
reset($ADODB_SESSION_EXPIRE_NOTIFY);
$fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
$savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
$rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$ADODB_SESS_CONN->SetFetchMode($savem);
if ($rs) {
$ADODB_SESS_CONN->BeginTrans();
while (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
$fn($ref,$key);
$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$rs->MoveNext();
}
$ADODB_SESS_CONN->CommitTrans();
}
} else {
$qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
$rs = $ADODB_SESS_CONN->Execute($qry);
}
return $rs ? true : false;
}
 
function adodb_sess_gc($maxlifetime)
{
global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
reset($ADODB_SESSION_EXPIRE_NOTIFY);
$fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
$savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
$t = time();
$rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
$ADODB_SESS_CONN->SetFetchMode($savem);
if ($rs) {
$ADODB_SESS_CONN->BeginTrans();
while (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
$fn($ref,$key);
$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$rs->MoveNext();
}
$rs->Close();
//$ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t");
$ADODB_SESS_CONN->CommitTrans();
}
} else {
$ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time());
if ($ADODB_SESS_DEBUG) ADOConnection::outp("
-- <b>Garbage Collection</b>: $qry</p>");
}
// suggested by Cameron, "GaM3R" <gamr@outworld.cx>
if (defined('ADODB_SESSION_OPTIMIZE')) {
global $ADODB_SESSION_DRIVER;
switch( $ADODB_SESSION_DRIVER ) {
case 'mysql':
case 'mysqlt':
$opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
break;
case 'postgresql':
case 'postgresql7':
$opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
break;
}
if (!empty($opt_qry)) {
$ADODB_SESS_CONN->Execute($opt_qry);
}
}
if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
$rs =& $ADODB_SESS_CONN->SelectLimit($sql,1);
if ($rs && !$rs->EOF) {
$dbts = reset($rs->fields);
$rs->Close();
$dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
$t = time();
if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
$msg =
__FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
error_log($msg);
if ($ADODB_SESS_DEBUG) ADOConnection::outp("
-- $msg</p>");
}
}
return true;
}
 
session_module_name('user');
session_set_save_handler(
"adodb_sess_open",
"adodb_sess_close",
"adodb_sess_read",
"adodb_sess_write",
"adodb_sess_destroy",
"adodb_sess_gc");
}
 
/* TEST SCRIPT -- UNCOMMENT */
 
if (0) {
 
session_start();
session_register('AVAR');
$_SESSION['AVAR'] += 1;
ADOConnection::outp( "
-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>",false);
}
 
?>
/web/kaklik's_web/torrentflux/adodb/session/old/adodb-session.php
0,0 → 1,439
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Set tabs to 4 for best viewing.
Latest version of ADODB is available at http://php.weblogs.com/adodb
======================================================================
This file provides PHP4 session management using the ADODB database
wrapper library.
Example
=======
include('adodb.inc.php');
include('adodb-session.php');
session_start();
session_register('AVAR');
$_SESSION['AVAR'] += 1;
print "
-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
To force non-persistent connections, call adodb_session_open first before session_start():
 
include('adodb.inc.php');
include('adodb-session.php');
adodb_sess_open(false,false,false);
session_start();
session_register('AVAR');
$_SESSION['AVAR'] += 1;
print "
-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
 
Installation
============
1. Create this table in your database (syntax might vary depending on your db):
create table sessions (
SESSKEY char(32) not null,
EXPIRY int(11) unsigned not null,
EXPIREREF varchar(64),
DATA text not null,
primary key (sesskey)
);
For oracle:
create table sessions (
SESSKEY char(32) not null,
EXPIRY DECIMAL(16) not null,
EXPIREREF varchar(64),
DATA varchar(4000) not null,
primary key (sesskey)
);
 
 
2. Then define the following parameters. You can either modify
this file, or define them before this file is included:
$ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
$ADODB_SESSION_CONNECT='server to connect to';
$ADODB_SESSION_USER ='user';
$ADODB_SESSION_PWD ='password';
$ADODB_SESSION_DB ='database';
$ADODB_SESSION_TBL = 'sessions'
3. Recommended is PHP 4.1.0 or later. There are documented
session bugs in earlier versions of PHP.
 
4. If you want to receive notifications when a session expires, then
you can tag a session with an EXPIREREF, and before the session
record is deleted, we can call a function that will pass the EXPIREREF
as the first parameter, and the session key as the second parameter.
To do this, define a notification function, say NotifyFn:
function NotifyFn($expireref, $sesskey)
{
}
Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY.
This is an array with 2 elements, the first being the name of the variable
you would like to store in the EXPIREREF field, and the 2nd is the
notification function's name.
In this example, we want to be notified when a user's session
has expired, so we store the user id in the global variable $USERID,
store this value in the EXPIREREF field:
$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
Then when the NotifyFn is called, we are passed the $USERID as the first
parameter, eg. NotifyFn($userid, $sesskey).
*/
 
if (!defined('_ADODB_LAYER')) {
include (dirname(__FILE__).'/adodb.inc.php');
}
 
if (!defined('ADODB_SESSION')) {
 
define('ADODB_SESSION',1);
/* if database time and system time is difference is greater than this, then give warning */
define('ADODB_SESSION_SYNCH_SECS',60);
 
/*
Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
*/
function adodb_session_regenerate_id()
{
$conn =& ADODB_Session::_conn();
if (!$conn) return false;
 
$old_id = session_id();
if (function_exists('session_regenerate_id')) {
session_regenerate_id();
} else {
session_id(md5(uniqid(rand(), true)));
$ck = session_get_cookie_params();
setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
//@session_start();
}
$new_id = session_id();
$ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
/* it is possible that the update statement fails due to a collision */
if (!$ok) {
session_id($old_id);
if (empty($ck)) $ck = session_get_cookie_params();
setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
return false;
}
return true;
}
 
/****************************************************************************************\
Global definitions
\****************************************************************************************/
GLOBAL $ADODB_SESSION_CONNECT,
$ADODB_SESSION_DRIVER,
$ADODB_SESSION_USER,
$ADODB_SESSION_PWD,
$ADODB_SESSION_DB,
$ADODB_SESS_CONN,
$ADODB_SESS_LIFE,
$ADODB_SESS_DEBUG,
$ADODB_SESSION_EXPIRE_NOTIFY,
$ADODB_SESSION_CRC,
$ADODB_SESSION_TBL;
$ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
if ($ADODB_SESS_LIFE <= 1) {
// bug in PHP 4.0.3 pl 1 -- how about other versions?
//print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
$ADODB_SESS_LIFE=1440;
}
$ADODB_SESSION_CRC = false;
//$ADODB_SESS_DEBUG = true;
//////////////////////////////////
/* SET THE FOLLOWING PARAMETERS */
//////////////////////////////////
if (empty($ADODB_SESSION_DRIVER)) {
$ADODB_SESSION_DRIVER='mysql';
$ADODB_SESSION_CONNECT='localhost';
$ADODB_SESSION_USER ='root';
$ADODB_SESSION_PWD ='';
$ADODB_SESSION_DB ='xphplens_2';
}
if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
$ADODB_SESSION_EXPIRE_NOTIFY = false;
}
// Made table name configurable - by David Johnson djohnson@inpro.net
if (empty($ADODB_SESSION_TBL)){
$ADODB_SESSION_TBL = 'sessions';
}
/*
$ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER;
$ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT;
$ADODB_SESS['user'] = $ADODB_SESSION_USER;
$ADODB_SESS['pwd'] = $ADODB_SESSION_PWD;
$ADODB_SESS['db'] = $ADODB_SESSION_DB;
$ADODB_SESS['life'] = $ADODB_SESS_LIFE;
$ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
$ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
$ADODB_SESS['table'] = $ADODB_SESS_TBL;
*/
/****************************************************************************************\
Create the connection to the database.
If $ADODB_SESS_CONN already exists, reuse that connection
\****************************************************************************************/
function adodb_sess_open($save_path, $session_name,$persist=true)
{
GLOBAL $ADODB_SESS_CONN;
if (isset($ADODB_SESS_CONN)) return true;
GLOBAL $ADODB_SESSION_CONNECT,
$ADODB_SESSION_DRIVER,
$ADODB_SESSION_USER,
$ADODB_SESSION_PWD,
$ADODB_SESSION_DB,
$ADODB_SESS_DEBUG;
// cannot use & below - do not know why...
$ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
if (!empty($ADODB_SESS_DEBUG)) {
$ADODB_SESS_CONN->debug = true;
ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ");
}
if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
$ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT,
$ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
if (!$ok) ADOConnection::outp( "
-- Session: connection failed</p>",false);
}
 
/****************************************************************************************\
Close the connection
\****************************************************************************************/
function adodb_sess_close()
{
global $ADODB_SESS_CONN;
 
if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
return true;
}
 
/****************************************************************************************\
Slurp in the session variables and return the serialized string
\****************************************************************************************/
function adodb_sess_read($key)
{
global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC;
 
$rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
if ($rs) {
if ($rs->EOF) {
$v = '';
} else
$v = rawurldecode(reset($rs->fields));
$rs->Close();
// new optimization adodb 2.1
$ADODB_SESSION_CRC = strlen($v).crc32($v);
return $v;
}
return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com
}
 
/****************************************************************************************\
Write the serialized data to a database.
If the data has not been modified since adodb_sess_read(), we do not write.
\****************************************************************************************/
function adodb_sess_write($key, $val)
{
global
$ADODB_SESS_CONN,
$ADODB_SESS_LIFE,
$ADODB_SESSION_TBL,
$ADODB_SESS_DEBUG,
$ADODB_SESSION_CRC,
$ADODB_SESSION_EXPIRE_NOTIFY;
 
$expiry = time() + $ADODB_SESS_LIFE;
// crc32 optimization since adodb 2.1
// now we only update expiry date, thx to sebastian thom in adodb 2.32
if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) {
if ($ADODB_SESS_DEBUG) echo "
-- Session: Only updating date - crc32 not changed</p>";
$qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time();
$rs = $ADODB_SESS_CONN->Execute($qry);
return true;
}
$val = rawurlencode($val);
$arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
$var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
global $$var;
$arr['expireref'] = $$var;
}
$rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr,
'sesskey',$autoQuote = true);
if (!$rs) {
ADOConnection::outp( '
-- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false);
} else {
// bug in access driver (could be odbc?) means that info is not commited
// properly unless select statement executed in Win2000
if ($ADODB_SESS_CONN->databaseType == 'access')
$rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
}
return !empty($rs);
}
 
function adodb_sess_destroy($key)
{
global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
reset($ADODB_SESSION_EXPIRE_NOTIFY);
$fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
$savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
$rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$ADODB_SESS_CONN->SetFetchMode($savem);
if ($rs) {
$ADODB_SESS_CONN->BeginTrans();
while (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
$fn($ref,$key);
$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$rs->MoveNext();
}
$ADODB_SESS_CONN->CommitTrans();
}
} else {
$qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
$rs = $ADODB_SESS_CONN->Execute($qry);
}
return $rs ? true : false;
}
 
function adodb_sess_gc($maxlifetime)
{
global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
if ($ADODB_SESSION_EXPIRE_NOTIFY) {
reset($ADODB_SESSION_EXPIRE_NOTIFY);
$fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
$savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
$t = time();
$rs =& $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
$ADODB_SESS_CONN->SetFetchMode($savem);
if ($rs) {
$ADODB_SESS_CONN->BeginTrans();
while (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
$fn($ref,$key);
$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
$rs->MoveNext();
}
$rs->Close();
$ADODB_SESS_CONN->CommitTrans();
}
} else {
$qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time();
$ADODB_SESS_CONN->Execute($qry);
if ($ADODB_SESS_DEBUG) ADOConnection::outp("
-- <b>Garbage Collection</b>: $qry</p>");
}
// suggested by Cameron, "GaM3R" <gamr@outworld.cx>
if (defined('ADODB_SESSION_OPTIMIZE')) {
global $ADODB_SESSION_DRIVER;
switch( $ADODB_SESSION_DRIVER ) {
case 'mysql':
case 'mysqlt':
$opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
break;
case 'postgresql':
case 'postgresql7':
$opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
break;
}
if (!empty($opt_qry)) {
$ADODB_SESS_CONN->Execute($opt_qry);
}
}
if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
$rs =& $ADODB_SESS_CONN->SelectLimit($sql,1);
if ($rs && !$rs->EOF) {
$dbts = reset($rs->fields);
$rs->Close();
$dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
$t = time();
if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
$msg =
__FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
error_log($msg);
if ($ADODB_SESS_DEBUG) ADOConnection::outp("
-- $msg</p>");
}
}
return true;
}
 
session_module_name('user');
session_set_save_handler(
"adodb_sess_open",
"adodb_sess_close",
"adodb_sess_read",
"adodb_sess_write",
"adodb_sess_destroy",
"adodb_sess_gc");
}
 
/* TEST SCRIPT -- UNCOMMENT */
 
if (0) {
 
session_start();
session_register('AVAR');
$_SESSION['AVAR'] += 1;
ADOConnection::outp( "
-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>",false);
}
 
?>
/web/kaklik's_web/torrentflux/adodb/session/old/crypt.inc.php
0,0 → 1,64
<?php
// Session Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com>
class MD5Crypt{
function keyED($txt,$encrypt_key)
{
$encrypt_key = md5($encrypt_key);
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++){
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
}
 
function Encrypt($txt,$key)
{
srand((double)microtime()*1000000);
$encrypt_key = md5(rand(0,32000));
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++)
{
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($encrypt_key,$ctr,1) .
(substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
$ctr++;
}
return base64_encode($this->keyED($tmp,$key));
}
 
function Decrypt($txt,$key)
{
$txt = $this->keyED(base64_decode($txt),$key);
$tmp = "";
for ($i=0;$i<strlen($txt);$i++){
$md5 = substr($txt,$i,1);
$i++;
$tmp.= (substr($txt,$i,1) ^ $md5);
}
return $tmp;
}
 
function RandPass()
{
$randomPassword = "";
srand((double)microtime()*1000000);
for($i=0;$i<8;$i++)
{
$randnumber = rand(48,120);
 
while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96))
{
$randnumber = rand(48,120);
}
 
$randomPassword .= chr($randnumber);
}
return $randomPassword;
}
 
}
?>
/web/kaklik's_web/torrentflux/adodb/session/session_schema.xml
0,0 → 1,26
<?xml version="1.0"?>
<schema version="0.2">
<table name="sessions">
<desc>table for ADOdb session-management</desc>
 
<field name="SESSKEY" type="C" size="32">
<descr>session key</descr>
<KEY/>
<NOTNULL/>
</field>
<field name="EXPIRY" type="I" size="11">
<descr></descr>
<NOTNULL/>
</field>
 
<field name="EXPIREREF" type="C" size="64">
<descr></descr>
</field>
 
<field name="DATA" type="XL">
<descr></descr>
<NOTNULL/>
</field>
</table>
</schema>
/web/kaklik's_web/torrentflux/adodb/toexport.inc.php
0,0 → 1,133
<?php
 
/**
* @version V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence.
*
* Code to export recordsets in several formats:
*
* AS VARIABLE
* $s = rs2csv($rs); # comma-separated values
* $s = rs2tab($rs); # tab delimited
*
* TO A FILE
* $f = fopen($path,'w');
* rs2csvfile($rs,$f);
* fclose($f);
*
* TO STDOUT
* rs2csvout($rs);
*/
// returns a recordset as a csv string
function rs2csv(&$rs,$addtitles=true)
{
return _adodb_export($rs,',',',',false,$addtitles);
}
 
// writes recordset to csv file
function rs2csvfile(&$rs,$fp,$addtitles=true)
{
_adodb_export($rs,',',',',$fp,$addtitles);
}
 
// write recordset as csv string to stdout
function rs2csvout(&$rs,$addtitles=true)
{
$fp = fopen('php://stdout','wb');
_adodb_export($rs,',',',',true,$addtitles);
fclose($fp);
}
 
function rs2tab(&$rs,$addtitles=true)
{
return _adodb_export($rs,"\t",',',false,$addtitles);
}
 
// to file pointer
function rs2tabfile(&$rs,$fp,$addtitles=true)
{
_adodb_export($rs,"\t",',',$fp,$addtitles);
}
 
// to stdout
function rs2tabout(&$rs,$addtitles=true)
{
$fp = fopen('php://stdout','wb');
_adodb_export($rs,"\t",' ',true,$addtitles);
if ($fp) fclose($fp);
}
 
function _adodb_export(&$rs,$sep,$sepreplace,$fp=false,$addtitles=true,$quote = '"',$escquote = '"',$replaceNewLine = ' ')
{
if (!$rs) return '';
//----------
// CONSTANTS
$NEWLINE = "\r\n";
$BUFLINES = 100;
$escquotequote = $escquote.$quote;
$s = '';
if ($addtitles) {
$fieldTypes = $rs->FieldTypesArray();
reset($fieldTypes);
while(list(,$o) = each($fieldTypes)) {
$v = $o->name;
if ($escquote) $v = str_replace($quote,$escquotequote,$v);
$v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
$elements[] = $v;
}
$s .= implode($sep, $elements).$NEWLINE;
}
$hasNumIndex = isset($rs->fields[0]);
$line = 0;
$max = $rs->FieldCount();
while (!$rs->EOF) {
$elements = array();
$i = 0;
if ($hasNumIndex) {
for ($j=0; $j < $max; $j++) {
$v = $rs->fields[$j];
if (!is_object($v)) $v = trim($v);
else $v = 'Object';
if ($escquote) $v = str_replace($quote,$escquotequote,$v);
$v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote";
else $elements[] = $v;
}
} else { // ASSOCIATIVE ARRAY
foreach($rs->fields as $v) {
if ($escquote) $v = str_replace($quote,$escquotequote,trim($v));
$v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote";
else $elements[] = $v;
}
}
$s .= implode($sep, $elements).$NEWLINE;
$rs->MoveNext();
$line += 1;
if ($fp && ($line % $BUFLINES) == 0) {
if ($fp === true) echo $s;
else fwrite($fp,$s);
$s = '';
}
}
if ($fp) {
if ($fp === true) echo $s;
else fwrite($fp,$s);
$s = '';
}
return $s;
}
?>
/web/kaklik's_web/torrentflux/adodb/tohtml.inc.php
0,0 → 1,195
<?php
/*
V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
Some pretty-printing by Chris Oxenreider <oxenreid@state.net>
*/
// specific code for tohtml
GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND;
 
$ADODB_ROUND=4; // rounding
$gSQLMaxRows = 1000; // max no of rows to download
$gSQLBlockRows=20; // max no of rows per table block
 
// RecordSet to HTML Table
//------------------------------------------------------------
// Convert a recordset to a html table. Multiple tables are generated
// if the number of rows is > $gSQLBlockRows. This is because
// web browsers normally require the whole table to be downloaded
// before it can be rendered, so we break the output into several
// smaller faster rendering tables.
//
// $rs: the recordset
// $ztabhtml: the table tag attributes (optional)
// $zheaderarray: contains the replacement strings for the headers (optional)
//
// USAGE:
// include('adodb.inc.php');
// $db = ADONewConnection('mysql');
// $db->Connect('mysql','userid','password','database');
// $rs = $db->Execute('select col1,col2,col3 from table');
// rs2html($rs, 'BORDER=2', array('Title1', 'Title2', 'Title3'));
// $rs->Close();
//
// RETURNS: number of rows displayed
 
 
function rs2html(&$rs,$ztabhtml=false,$zheaderarray=false,$htmlspecialchars=true,$echo = true)
{
$s ='';$rows=0;$docnt = false;
GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND;
 
if (!$rs) {
printf(ADODB_BAD_RS,'rs2html');
return false;
}
if (! $ztabhtml) $ztabhtml = "BORDER='1' WIDTH='98%'";
//else $docnt = true;
$typearr = array();
$ncols = $rs->FieldCount();
$hdr = "<TABLE COLS=$ncols $ztabhtml><tr>\n\n";
for ($i=0; $i < $ncols; $i++) {
$field = $rs->FetchField($i);
if ($field) {
if ($zheaderarray) $fname = $zheaderarray[$i];
else $fname = htmlspecialchars($field->name);
$typearr[$i] = $rs->MetaType($field->type,$field->max_length);
//print " $field->name $field->type $typearr[$i] ";
} else {
$fname = 'Field '.($i+1);
$typearr[$i] = 'C';
}
if (strlen($fname)==0) $fname = '&nbsp;';
$hdr .= "<TH>$fname</TH>";
}
$hdr .= "\n</tr>";
if ($echo) print $hdr."\n\n";
else $html = $hdr;
// smart algorithm - handles ADODB_FETCH_MODE's correctly by probing...
$numoffset = isset($rs->fields[0]) ||isset($rs->fields[1]) || isset($rs->fields[2]);
while (!$rs->EOF) {
$s .= "<TR valign=top>\n";
for ($i=0; $i < $ncols; $i++) {
if ($i===0) $v=($numoffset) ? $rs->fields[0] : reset($rs->fields);
else $v = ($numoffset) ? $rs->fields[$i] : next($rs->fields);
$type = $typearr[$i];
switch($type) {
case 'D':
if (empty($v)) $s .= "<TD> &nbsp; </TD>\n";
else if (!strpos($v,':')) {
$s .= " <TD>".$rs->UserDate($v,"D d, M Y") ."&nbsp;</TD>\n";
}
break;
case 'T':
if (empty($v)) $s .= "<TD> &nbsp; </TD>\n";
else $s .= " <TD>".$rs->UserTimeStamp($v,"D d, M Y, h:i:s") ."&nbsp;</TD>\n";
break;
case 'N':
if (abs($v) - round($v,0) < 0.00000001)
$v = round($v);
else
$v = round($v,$ADODB_ROUND);
case 'I':
$s .= " <TD align=right>".stripslashes((trim($v))) ."&nbsp;</TD>\n";
break;
/*
case 'B':
if (substr($v,8,2)=="BM" ) $v = substr($v,8);
$mtime = substr(str_replace(' ','_',microtime()),2);
$tmpname = "tmp/".uniqid($mtime).getmypid();
$fd = @fopen($tmpname,'a');
@ftruncate($fd,0);
@fwrite($fd,$v);
@fclose($fd);
if (!function_exists ("mime_content_type")) {
function mime_content_type ($file) {
return exec("file -bi ".escapeshellarg($file));
}
}
$t = mime_content_type($tmpname);
$s .= (substr($t,0,5)=="image") ? " <td><img src='$tmpname' alt='$t'></td>\\n" : " <td><a
href='$tmpname'>$t</a></td>\\n";
break;
*/
 
default:
if ($htmlspecialchars) $v = htmlspecialchars(trim($v));
$v = trim($v);
if (strlen($v) == 0) $v = '&nbsp;';
$s .= " <TD>". str_replace("\n",'<br>',stripslashes($v)) ."</TD>\n";
}
} // for
$s .= "</TR>\n\n";
$rows += 1;
if ($rows >= $gSQLMaxRows) {
$rows = "<p>Truncated at $gSQLMaxRows</p>";
break;
} // switch
 
$rs->MoveNext();
// additional EOF check to prevent a widow header
if (!$rs->EOF && $rows % $gSQLBlockRows == 0) {
//if (connection_aborted()) break;// not needed as PHP aborts script, unlike ASP
if ($echo) print $s . "</TABLE>\n\n";
else $html .= $s ."</TABLE>\n\n";
$s = $hdr;
}
} // while
 
if ($echo) print $s."</TABLE>\n\n";
else $html .= $s."</TABLE>\n\n";
if ($docnt) if ($echo) print "<H2>".$rows." Rows</H2>";
return ($echo) ? $rows : $html;
}
// pass in 2 dimensional array
function arr2html(&$arr,$ztabhtml='',$zheaderarray='')
{
if (!$ztabhtml) $ztabhtml = 'BORDER=1';
$s = "<TABLE $ztabhtml>";//';print_r($arr);
 
if ($zheaderarray) {
$s .= '<TR>';
for ($i=0; $i<sizeof($zheaderarray); $i++) {
$s .= " <TH>{$zheaderarray[$i]}</TH>\n";
}
$s .= "\n</TR>";
}
for ($i=0; $i<sizeof($arr); $i++) {
$s .= '<TR>';
$a = &$arr[$i];
if (is_array($a))
for ($j=0; $j<sizeof($a); $j++) {
$val = $a[$j];
if (empty($val)) $val = '&nbsp;';
$s .= " <TD>$val</TD>\n";
}
else if ($a) {
$s .= ' <TD>'.$a."</TD>\n";
} else $s .= " <TD>&nbsp;</TD>\n";
$s .= "\n</TR>\n";
}
$s .= '</TABLE>';
print $s;
}
 
?>
/web/kaklik's_web/torrentflux/adodb/xmlschema.dtd
0,0 → 1,39
<?xml version="1.0"?>
<!DOCTYPE adodb_schema [
<!ELEMENT schema (table*, sql*)>
<!ATTLIST schema version CDATA #REQUIRED>
<!ELEMENT table ((field+|DROP), CONSTRAINT*, descr?, index*, data*)>
<!ELEMENT field ((NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?,
NOQUOTE?, CONSTRAINT*, descr?)>
<!ELEMENT data (row+)>
<!ELEMENT row (f+)>
<!ELEMENT f (#CDATA)>
<!ELEMENT descr (#CDATA)>
<!ELEMENT NOTNULL EMPTY>
<!ELEMENT KEY EMPTY>
<!ELEMENT PRIMARY EMPTY>
<!ELEMENT AUTO EMPTY>
<!ELEMENT AUTOINCREMENT EMPTY>
<!ELEMENT DEFAULT EMPTY>
<!ELEMENT DEFDATE EMPTY>
<!ELEMENT DEFTIMESTAMP EMPTY>
<!ELEMENT NOQUOTE EMPTY>
<!ELEMENT DROP EMPTY>
<!ELEMENT CONSTRAINT (#CDATA)>
<!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED>
<!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED>
<!ATTLIST data platform CDATA #IMPLIED>
<!ATTLIST f name CDATA #IMPLIED>
<!ATTLIST DEFAULT VALUE CDATA #REQUIRED>
<!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)>
<!ELEMENT col (#CDATA)>
<!ELEMENT CLUSTERED EMPTY>
<!ELEMENT BITMAP EMPTY>
<!ELEMENT UNIQUE EMPTY>
<!ELEMENT FULLTEXT EMPTY>
<!ELEMENT HASH EMPTY>
<!ATTLIST index name CDATA #REQUIRED platform CDATA #IMPLIED>
<!ELEMENT sql (query+, descr?)>
<!ELEMENT query (#CDATA)>
<!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE) >
] >
/web/kaklik's_web/torrentflux/adodb/xmlschema03.dtd
0,0 → 1,43
<?xml version="1.0"?>
<!DOCTYPE adodb_schema [
<!ELEMENT schema (table*, sql*)>
<!ATTLIST schema version CDATA #REQUIRED>
<!ELEMENT table (descr?, (field+|DROP), constraint*, opt*, index*, data*)>
<!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED>
<!ELEMENT field (descr?, (NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?, NOQUOTE?, UNSIGNED?, constraint*, opt*)>
<!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED opts CDATA #IMPLIED>
<!ELEMENT data (descr?, row+)>
<!ATTLIST data platform CDATA #IMPLIED>
<!ELEMENT row (f+)>
<!ELEMENT f (#CDATA)>
<!ATTLIST f name CDATA #IMPLIED>
<!ELEMENT descr (#CDATA)>
<!ELEMENT NOTNULL EMPTY>
<!ELEMENT KEY EMPTY>
<!ELEMENT PRIMARY EMPTY>
<!ELEMENT AUTO EMPTY>
<!ELEMENT AUTOINCREMENT EMPTY>
<!ELEMENT DEFAULT EMPTY>
<!ATTLIST DEFAULT value CDATA #REQUIRED>
<!ELEMENT DEFDATE EMPTY>
<!ELEMENT DEFTIMESTAMP EMPTY>
<!ELEMENT NOQUOTE EMPTY>
<!ELEMENT UNSIGNED EMPTY>
<!ELEMENT DROP EMPTY>
<!ELEMENT constraint (#CDATA)>
<!ATTLIST constraint platform CDATA #IMPLIED>
<!ELEMENT opt (#CDATA)>
<!ATTLIST opt platform CDATA #IMPLIED>
<!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)>
<!ATTLIST index name CDATA #REQUIRED platform CDATA #IMPLIED>
<!ELEMENT col (#CDATA)>
<!ELEMENT CLUSTERED EMPTY>
<!ELEMENT BITMAP EMPTY>
<!ELEMENT UNIQUE EMPTY>
<!ELEMENT FULLTEXT EMPTY>
<!ELEMENT HASH EMPTY>
<!ELEMENT sql (query+, descr?)>
<!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE)>
<!ELEMENT query (#CDATA)>
<!ATTLIST query platform CDATA #IMPLIED>
]>
/web/kaklik's_web/torrentflux/adodb/xsl/convert-0.1-0.2.xsl
0,0 → 1,205
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
<!-- Schema -->
<xsl:template match="/">
<xsl:comment>
ADODB XMLSchema
http://adodb-xmlschema.sourceforge.net
</xsl:comment>
<xsl:element name="schema">
<xsl:attribute name="version">0.2</xsl:attribute>
<xsl:apply-templates select="schema/table|schema/sql"/>
</xsl:element>
</xsl:template>
<!-- Table -->
<xsl:template match="table">
<xsl:variable name="table_name" select="@name"/>
<xsl:element name="table">
<xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute>
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@version) > 0">
<xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:choose>
<xsl:when test="count(DROP) > 0">
<xsl:element name="DROP"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="field"/>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="constraint"/>
<xsl:apply-templates select="../index[@table=$table_name]"/>
</xsl:element>
</xsl:template>
<!-- Field -->
<xsl:template match="field">
<xsl:element name="field">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
<xsl:if test="string-length(@size) > 0">
<xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="count(PRIMARY) > 0">
<xsl:element name="PRIMARY"/>
</xsl:when>
<xsl:when test="count(KEY) > 0">
<xsl:element name="KEY"/>
</xsl:when>
<xsl:when test="count(NOTNULL) > 0">
<xsl:element name="NOTNULL"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(AUTO) > 0">
<xsl:element name="AUTO"/>
</xsl:when>
<xsl:when test="count(AUTOINCREMENT) > 0">
<xsl:element name="AUTOINCREMENT"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(DEFAULT) > 0">
<xsl:element name="DEFAULT">
<xsl:attribute name="value">
<xsl:value-of select="DEFAULT[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="count(DEFDATE) > 0">
<xsl:element name="DEFDATE">
<xsl:attribute name="value">
<xsl:value-of select="DEFDATE[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="count(DEFTIMESTAMP) > 0">
<xsl:element name="DEFTIMESTAMP">
<xsl:attribute name="value">
<xsl:value-of select="DEFTIMESTAMP[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
</xsl:choose>
<xsl:if test="count(NOQUOTE) > 0">
<xsl:element name="NOQUOTE"/>
</xsl:if>
<xsl:apply-templates select="constraint"/>
</xsl:element>
</xsl:template>
<!-- Constraint -->
<xsl:template match="constraint">
<xsl:element name="constraint">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Index -->
<xsl:template match="index">
<xsl:element name="index">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:apply-templates select="descr[1]"/>
<xsl:if test="count(CLUSTERED) > 0">
<xsl:element name="CLUSTERED"/>
</xsl:if>
<xsl:if test="count(BITMAP) > 0">
<xsl:element name="BITMAP"/>
</xsl:if>
<xsl:if test="count(UNIQUE) > 0">
<xsl:element name="UNIQUE"/>
</xsl:if>
<xsl:if test="count(FULLTEXT) > 0">
<xsl:element name="FULLTEXT"/>
</xsl:if>
<xsl:if test="count(HASH) > 0">
<xsl:element name="HASH"/>
</xsl:if>
<xsl:choose>
<xsl:when test="count(DROP) > 0">
<xsl:element name="DROP"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="col"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- Index Column -->
<xsl:template match="col">
<xsl:element name="col">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- SQL QuerySet -->
<xsl:template match="sql">
<xsl:element name="sql">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@key) > 0">
<xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@prefixmethod) > 0">
<xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:apply-templates select="query"/>
</xsl:element>
</xsl:template>
<!-- Query -->
<xsl:template match="query">
<xsl:element name="query">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Description -->
<xsl:template match="descr">
<xsl:element name="descr">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
/web/kaklik's_web/torrentflux/adodb/xsl/convert-0.1-0.3.xsl
0,0 → 1,221
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
<!-- Schema -->
<xsl:template match="/">
<xsl:comment>
ADODB XMLSchema
http://adodb-xmlschema.sourceforge.net
</xsl:comment>
<xsl:element name="schema">
<xsl:attribute name="version">0.3</xsl:attribute>
<xsl:apply-templates select="schema/table|schema/sql"/>
</xsl:element>
</xsl:template>
<!-- Table -->
<xsl:template match="table">
<xsl:variable name="table_name" select="@name"/>
<xsl:element name="table">
<xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute>
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@version) > 0">
<xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:choose>
<xsl:when test="count(DROP) > 0">
<xsl:element name="DROP"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="field"/>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="constraint"/>
<xsl:apply-templates select="../index[@table=$table_name]"/>
</xsl:element>
</xsl:template>
<!-- Field -->
<xsl:template match="field">
<xsl:element name="field">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
<xsl:if test="string-length(@size) > 0">
<xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="string-length(@opts) = 0"/>
<xsl:when test="@opts = 'UNSIGNED'">
<xsl:element name="UNSIGNED"/>
</xsl:when>
<xsl:when test="contains(@opts,'UNSIGNED')">
<xsl:attribute name="opts">
<xsl:value-of select="concat(substring-before(@opts,'UNSIGNED'),substring-after(@opts,'UNSIGNED'))"/>
</xsl:attribute>
<xsl:element name="UNSIGNED"/>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="opts"><xsl:value-of select="@opts"/></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(PRIMARY) > 0">
<xsl:element name="PRIMARY"/>
</xsl:when>
<xsl:when test="count(KEY) > 0">
<xsl:element name="KEY"/>
</xsl:when>
<xsl:when test="count(NOTNULL) > 0">
<xsl:element name="NOTNULL"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(AUTO) > 0">
<xsl:element name="AUTO"/>
</xsl:when>
<xsl:when test="count(AUTOINCREMENT) > 0">
<xsl:element name="AUTOINCREMENT"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(DEFAULT) > 0">
<xsl:element name="DEFAULT">
<xsl:attribute name="value">
<xsl:value-of select="DEFAULT[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="count(DEFDATE) > 0">
<xsl:element name="DEFDATE">
<xsl:attribute name="value">
<xsl:value-of select="DEFDATE[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="count(DEFTIMESTAMP) > 0">
<xsl:element name="DEFTIMESTAMP">
<xsl:attribute name="value">
<xsl:value-of select="DEFTIMESTAMP[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
</xsl:choose>
<xsl:if test="count(NOQUOTE) > 0">
<xsl:element name="NOQUOTE"/>
</xsl:if>
<xsl:apply-templates select="constraint"/>
</xsl:element>
</xsl:template>
<!-- Constraint -->
<xsl:template match="constraint">
<xsl:element name="constraint">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Index -->
<xsl:template match="index">
<xsl:element name="index">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:apply-templates select="descr[1]"/>
<xsl:if test="count(CLUSTERED) > 0">
<xsl:element name="CLUSTERED"/>
</xsl:if>
<xsl:if test="count(BITMAP) > 0">
<xsl:element name="BITMAP"/>
</xsl:if>
<xsl:if test="count(UNIQUE) > 0">
<xsl:element name="UNIQUE"/>
</xsl:if>
<xsl:if test="count(FULLTEXT) > 0">
<xsl:element name="FULLTEXT"/>
</xsl:if>
<xsl:if test="count(HASH) > 0">
<xsl:element name="HASH"/>
</xsl:if>
<xsl:choose>
<xsl:when test="count(DROP) > 0">
<xsl:element name="DROP"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="col"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- Index Column -->
<xsl:template match="col">
<xsl:element name="col">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- SQL QuerySet -->
<xsl:template match="sql">
<xsl:element name="sql">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@key) > 0">
<xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@prefixmethod) > 0">
<xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:apply-templates select="query"/>
</xsl:element>
</xsl:template>
<!-- Query -->
<xsl:template match="query">
<xsl:element name="query">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Description -->
<xsl:template match="descr">
<xsl:element name="descr">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
/web/kaklik's_web/torrentflux/adodb/xsl/convert-0.2-0.1.xsl
0,0 → 1,207
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
<!-- Schema -->
<xsl:template match="/">
<xsl:comment>
ADODB XMLSchema
http://adodb-xmlschema.sourceforge.net
</xsl:comment>
<xsl:element name="schema">
<xsl:attribute name="version">0.1</xsl:attribute>
<xsl:apply-templates select="schema/table|schema/sql"/>
</xsl:element>
</xsl:template>
<!-- Table -->
<xsl:template match="table">
<xsl:variable name="table_name" select="@name"/>
<xsl:element name="table">
<xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute>
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@version) > 0">
<xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:choose>
<xsl:when test="count(DROP) > 0">
<xsl:element name="DROP"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="field"/>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="constraint"/>
</xsl:element>
<xsl:apply-templates select="index"/>
</xsl:template>
<!-- Field -->
<xsl:template match="field">
<xsl:element name="field">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
<xsl:if test="string-length(@size) > 0">
<xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="count(PRIMARY) > 0">
<xsl:element name="PRIMARY"/>
</xsl:when>
<xsl:when test="count(KEY) > 0">
<xsl:element name="KEY"/>
</xsl:when>
<xsl:when test="count(NOTNULL) > 0">
<xsl:element name="NOTNULL"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(AUTO) > 0">
<xsl:element name="AUTO"/>
</xsl:when>
<xsl:when test="count(AUTOINCREMENT) > 0">
<xsl:element name="AUTOINCREMENT"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(DEFAULT) > 0">
<xsl:element name="DEFAULT">
<xsl:attribute name="value">
<xsl:value-of select="DEFAULT[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="count(DEFDATE) > 0">
<xsl:element name="DEFDATE">
<xsl:attribute name="value">
<xsl:value-of select="DEFDATE[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="count(DEFTIMESTAMP) > 0">
<xsl:element name="DEFDTIMESTAMP">
<xsl:attribute name="value">
<xsl:value-of select="DEFTIMESTAMP[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
</xsl:choose>
<xsl:if test="count(NOQUOTE) > 0">
<xsl:element name="NOQUOTE"/>
</xsl:if>
<xsl:apply-templates select="constraint"/>
</xsl:element>
</xsl:template>
<!-- Constraint -->
<xsl:template match="constraint">
<xsl:element name="constraint">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Index -->
<xsl:template match="index">
<xsl:element name="index">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:attribute name="table"><xsl:value-of select="../@name"/></xsl:attribute>
<xsl:apply-templates select="descr[1]"/>
<xsl:if test="count(CLUSTERED) > 0">
<xsl:element name="CLUSTERED"/>
</xsl:if>
<xsl:if test="count(BITMAP) > 0">
<xsl:element name="BITMAP"/>
</xsl:if>
<xsl:if test="count(UNIQUE) > 0">
<xsl:element name="UNIQUE"/>
</xsl:if>
<xsl:if test="count(FULLTEXT) > 0">
<xsl:element name="FULLTEXT"/>
</xsl:if>
<xsl:if test="count(HASH) > 0">
<xsl:element name="HASH"/>
</xsl:if>
<xsl:choose>
<xsl:when test="count(DROP) > 0">
<xsl:element name="DROP"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="col"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- Index Column -->
<xsl:template match="col">
<xsl:element name="col">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- SQL QuerySet -->
<xsl:template match="sql">
<xsl:element name="sql">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@key) > 0">
<xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@prefixmethod) > 0">
<xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:apply-templates select="query"/>
</xsl:element>
</xsl:template>
<!-- Query -->
<xsl:template match="query">
<xsl:element name="query">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Description -->
<xsl:template match="descr">
<xsl:element name="descr">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
/web/kaklik's_web/torrentflux/adodb/xsl/convert-0.2-0.3.xsl
0,0 → 1,281
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
<!-- Schema -->
<xsl:template match="/">
<xsl:comment>
ADODB XMLSchema
http://adodb-xmlschema.sourceforge.net
</xsl:comment>
<xsl:element name="schema">
<xsl:attribute name="version">0.3</xsl:attribute>
<xsl:apply-templates select="schema/table|schema/sql"/>
</xsl:element>
</xsl:template>
<!-- Table -->
<xsl:template match="table">
<xsl:element name="table">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@version) > 0">
<xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:choose>
<xsl:when test="count(DROP) > 0">
<xsl:element name="DROP"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="field"/>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="constraint"/>
<xsl:apply-templates select="opt"/>
<xsl:apply-templates select="index"/>
<xsl:apply-templates select="data"/>
</xsl:element>
</xsl:template>
<!-- Field -->
<xsl:template match="field">
<xsl:element name="field">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
<xsl:if test="string-length(@size) > 0">
<xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="string-length(@opts) = 0">
<xsl:if test="count(UNSIGNED) > 0">
<xsl:element name="UNSIGNED"/>
</xsl:if>
</xsl:when>
<xsl:when test="@opts = 'UNSIGNED'">
<xsl:element name="UNSIGNED"/>
</xsl:when>
<xsl:when test="contains(@opts,'UNSIGNED')">
<xsl:attribute name="opts">
<xsl:value-of select="concat(substring-before(@opts,'UNSIGNED'),substring-after(@opts,'UNSIGNED'))"/>
</xsl:attribute>
<xsl:element name="UNSIGNED"/>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="opts"><xsl:value-of select="@opts"/></xsl:attribute>
<xsl:if test="count(UNSIGNED) > 0">
<xsl:element name="UNSIGNED"/>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="descr[1]"/>
<xsl:choose>
<xsl:when test="count(PRIMARY) > 0">
<xsl:element name="PRIMARY"/>
</xsl:when>
<xsl:when test="count(KEY) > 0">
<xsl:element name="KEY"/>
</xsl:when>
<xsl:when test="count(NOTNULL) > 0">
<xsl:element name="NOTNULL"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(AUTO) > 0">
<xsl:element name="AUTO"/>
</xsl:when>
<xsl:when test="count(AUTOINCREMENT) > 0">
<xsl:element name="AUTOINCREMENT"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(DEFAULT) > 0">
<xsl:element name="DEFAULT">
<xsl:attribute name="value">
<xsl:value-of select="DEFAULT[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="count(DEFDATE) > 0">
<xsl:element name="DEFDATE">
<xsl:attribute name="value">
<xsl:value-of select="DEFDATE[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="count(DEFTIMESTAMP) > 0">
<xsl:element name="DEFTIMESTAMP">
<xsl:attribute name="value">
<xsl:value-of select="DEFTIMESTAMP[1]/@value"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
</xsl:choose>
<xsl:if test="count(NOQUOTE) > 0">
<xsl:element name="NOQUOTE"/>
</xsl:if>
<xsl:apply-templates select="constraint"/>
<xsl:apply-templates select="opt"/>
</xsl:element>
</xsl:template>
<!-- Constraint -->
<xsl:template match="constraint">
<xsl:element name="constraint">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Opt -->
<xsl:template match="opt">
<xsl:element name="opt">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Index -->
<xsl:template match="index">
<xsl:element name="index">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:apply-templates select="descr[1]"/>
<xsl:if test="count(CLUSTERED) > 0">
<xsl:element name="CLUSTERED"/>
</xsl:if>
<xsl:if test="count(BITMAP) > 0">
<xsl:element name="BITMAP"/>
</xsl:if>
<xsl:if test="count(UNIQUE) > 0">
<xsl:element name="UNIQUE"/>
</xsl:if>
<xsl:if test="count(FULLTEXT) > 0">
<xsl:element name="FULLTEXT"/>
</xsl:if>
<xsl:if test="count(HASH) > 0">
<xsl:element name="HASH"/>
</xsl:if>
<xsl:choose>
<xsl:when test="count(DROP) > 0">
<xsl:element name="DROP"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="col"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- Index Column -->
<xsl:template match="col">
<xsl:element name="col">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- SQL QuerySet -->
<xsl:template match="sql">
<xsl:element name="sql">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@key) > 0">
<xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@prefixmethod) > 0">
<xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:apply-templates select="query"/>
</xsl:element>
</xsl:template>
<!-- Query -->
<xsl:template match="query">
<xsl:element name="query">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Description -->
<xsl:template match="descr">
<xsl:element name="descr">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
<!-- Data -->
<xsl:template match="data">
<xsl:element name="data">
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:apply-templates select="row"/>
</xsl:element>
</xsl:template>
<!-- Data Row -->
<xsl:template match="row">
<xsl:element name="row">
<xsl:apply-templates select="f"/>
</xsl:element>
</xsl:template>
<!-- Data Field -->
<xsl:template match="f">
<xsl:element name="f">
<xsl:if test="string-length(@name) > 0">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
</xsl:if>
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
/web/kaklik's_web/torrentflux/adodb/xsl/remove-0.2.xsl
0,0 → 1,54
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
<!-- Schema -->
<xsl:template match="/">
<xsl:comment>
ADODB XMLSchema
http://adodb-xmlschema.sourceforge.net
</xsl:comment>
<xsl:comment>
Uninstallation Schema
</xsl:comment>
<xsl:element name="schema">
<xsl:attribute name="version">0.2</xsl:attribute>
<xsl:apply-templates select="schema/table">
<xsl:sort select="position()" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<!-- Table -->
<xsl:template match="table">
<xsl:if test="count(DROP) = 0">
<xsl:element name="table">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@version) > 0">
<xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:element name="DROP"/>
</xsl:element>
</xsl:if>
</xsl:template>
<!-- Description -->
<xsl:template match="descr">
<xsl:element name="descr">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
/web/kaklik's_web/torrentflux/adodb/xsl/remove-0.3.xsl
0,0 → 1,54
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
<!-- Schema -->
<xsl:template match="/">
<xsl:comment>
ADODB XMLSchema
http://adodb-xmlschema.sourceforge.net
</xsl:comment>
<xsl:comment>
Uninstallation Schema
</xsl:comment>
<xsl:element name="schema">
<xsl:attribute name="version">0.3</xsl:attribute>
<xsl:apply-templates select="schema/table">
<xsl:sort select="position()" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<!-- Table -->
<xsl:template match="table">
<xsl:if test="count(DROP) = 0">
<xsl:element name="table">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@version) > 0">
<xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:element name="DROP"/>
</xsl:element>
</xsl:if>
</xsl:template>
<!-- Description -->
<xsl:template match="descr">
<xsl:element name="descr">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
/web/kaklik's_web/torrentflux/all_services.php
0,0 → 1,62
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
$result = shell_exec("df -h ".$cfg["path"]);
$result2 = shell_exec("du -sh ".$cfg["path"]."*");
$result4 = shell_exec("w");
$result5 = shell_exec("free -mo");
 
DisplayHead(_ALL);
echo "<table width=\"740\" border=0 cellpadding=0 cellspacing=0><tr><td>";
echo displayDriveSpaceBar(getDriveSpace($cfg["path"]));
echo "</td></tr></table>";
?>
 
<br>
<div align="left" id="BodyLayer" name="BodyLayer" style="border: thin solid <?php echo $cfg["main_bgcolor"] ?>; position:relative; width:740; height:500; padding-left: 5px; padding-right: 5px; z-index:1; overflow: scroll; visibility: visible">
 
<?php
echo "<pre>";
echo "<strong>"._DRIVESPACE."</strong>\n\n";
 
echo $result;
echo "<br><hr><br>";
echo $result2;
 
echo "<br><hr><br>";
 
echo "<strong>"._SERVERSTATS."</strong>\n\n";
 
echo $result4;
echo "<br><hr><br>";
echo $result5;
echo "</pre>";
echo "</div>";
 
DisplayFoot();
 
?>
/web/kaklik's_web/torrentflux/blank.html
0,0 → 1,0
<html><head><title>Blank Page</title></head><body>&nbsp;</body></html>
/web/kaklik's_web/torrentflux/config.php
0,0 → 1,89
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
 
/**************************************************************************/
// YOUR DATABASE CONNECTION INFORMATION
/**************************************************************************/
// Check the adodb/drivers/ directory for support for your database
// you may choose from many (mysql is the default)
$cfg["db_type"] = "mysql"; // mysql, postgres7 view adodb/drivers/
$cfg["db_host"] = "localhost"; // DB host computer name or IP
$cfg["db_name"] = "torrentflux"; // Name of the Database
$cfg["db_user"] = "root"; // username for your MySQL database
$cfg["db_pass"] = ""; // password for database
/**************************************************************************/
 
 
/*****************************************************************************
TorrentFlux
Torrent (n.) A violent or rapid flow; a strong current; a flood;
as, a torrent vices; a torrent of eloquence.
Flux (n.) The act of flowing; a continuous moving on or passing by,
as of a flowing stream; constant succession; change.
*****************************************************************************/
 
 
 
// ***************************************************************************
// ***************************************************************************
// DO NOT Edit below this line unless you know what you're doing.
// ***************************************************************************
// ***************************************************************************
 
$cfg["pagetitle"] = "TorrentFlux";
 
// TorrentFlux Version
$cfg["version"] = "2.1";
 
// CONSTANTS
$cfg["constants"] = array();
$cfg["constants"]["url_upload"] = "URL Upload";
$cfg["constants"]["reset_owner"] = "Reset Owner";
$cfg["constants"]["start_torrent"] = "Started Torrent";
$cfg["constants"]["queued_torrent"] = "Queued Torrent";
$cfg["constants"]["unqueued_torrent"] = "Removed from Queue";
$cfg["constants"]["QManager"] = "QManager";
$cfg["constants"]["access_denied"] = "ACCESS DENIED";
$cfg["constants"]["delete_torrent"] = "Delete Torrent";
$cfg["constants"]["fm_delete"] = "File Manager Delete";
$cfg["constants"]["fm_download"] = "File Download";
$cfg["constants"]["kill_torrent"] = "Kill Torrent";
$cfg["constants"]["file_upload"] = "File Upload";
$cfg["constants"]["error"] = "ERROR";
$cfg["constants"]["hit"] = "HIT";
$cfg["constants"]["update"] = "UPDATE";
$cfg["constants"]["admin"] = "ADMIN";
 
asort($cfg["constants"]);
 
// Add file extensions here that you will allow to be uploaded
$cfg["file_types_array"] = array("torrent");
 
// Capture username
$cfg["user"] = "";
// Capture ip
$cfg["ip"] = $_SERVER['REMOTE_ADDR'];
 
?>
/web/kaklik's_web/torrentflux/cookiehelp.php
0,0 → 1,102
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
DisplayHead("Cookie Help", false);
?>
<script language="JavaScript">
function closeme()
{
self.close();
}
</script>
<BR />
<div align="center">[ <a href="#" onClick="closeme();">close</a> ]</div>
<BR />
<div align="left" id="BodyLayer" name="BodyLayer" style="border: thin solid <?php echo $cfg["main_bgcolor"] ?>; position:relative; width:580; padding-left: 5px; padding-right: 5px; z-index:1; visibility: visible">
<strong>How to get Cookie information....</strong>
<br>
<hr>
<br>
<strong>FireFox</strong>
<ul>
<li>Tools => Options</li>
<li>Cookies => View Cookies</li>
<li>Locate the site you want to get cookie information from.</li>
<li>Get the UID and PASS content fields</li>
</ul>
 
<hr>
<br>
<strong>Internet Explorer</strong>
<ul>
<li>Tools => Internet Options</li>
<li>General => Settings => View Files</li>
<li>Locate cookie file for site (eg: Cookie:user@www.host.com/)</li>
<li>Open the file in a text editor</li>
<li>Grab the values below UID and PASS</li>
</ul>
The file will look something like this:
<pre>
------
 
userZone
-660
www.host.com/
1600
2148152320
29840330
125611120
29766905
*
uid
123456 <----------------------------
www.host.com/
1536
3567643008
32111902
4197448416
29766904
*
pass
0j9i8h7g6f5e4d3c2b1a <--------------
www.host.com/
1536
3567643008
32111902
4197448416
29766904
*
 
--------
</pre>
<BR />
<div align="center">[ <a href="#" onClick="closeme();">close</a> ]</div>
<BR />
</div>
<?php
DisplayFoot(false);
?>
/web/kaklik's_web/torrentflux/db.php
0,0 → 1,96
<?php
 
// will need include of config.php
include_once('config.php');
include_once('adodb/adodb.inc.php');
 
function getdb()
{
global $cfg;
 
// 2004-12-09 PFM: connect to database.
$db = NewADOConnection($cfg["db_type"]);
$db->Connect($cfg["db_host"], $cfg["db_user"], $cfg["db_pass"], $cfg["db_name"]);
if(!$db)
{
die ('Could not connect to database: '.$db->ErrorMsg().'<br>Check your database settings in the config.php file.');
}
return $db;
}
 
function showError($db, $sql)
{
global $cfg;
if($db->ErrorNo() != 0)
{
include("themes/matrix/index.php");
?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $cfg["pagetitle"] ?></title>
<link rel="StyleSheet" href="themes/matrix/style.css" type="text/css" />
<meta http-equiv="pragma" content="no-cache" />
<meta content="charset=iso-8859-1" />
 
</head>
<body bgcolor="<?php echo $cfg["main_bgcolor"] ?>">
<br /><br /><br />
<div align="center">
<table border="1" bordercolor="<?php echo $cfg["table_border_dk"] ?>" cellpadding="0" cellspacing="0">
<tr>
<td>
<table border="0" cellpadding="4" cellspacing="0" width="100%">
<tr>
<td align="left" background="themes/matrix/images/bar.gif" bgcolor="<?php echo $cfg["main_bgcolor"] ?>">
<font class="title"><?php echo $cfg["pagetitle"] ?> Database/SQL Error</font>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_header_bg"] ?>">
<div align="center">
<table width="100%" bgcolor="<?php echo $cfg["body_data_bg"] ?>">
<tr>
<td>
<table bgcolor="<?php echo $cfg["body_data_bg"] ?>" width="740 pixels" cellpadding="1">
<tr>
<td>
<div align="center">
<table border="0" cellpadding="4" cellspacing="0" width="90%">
<tr>
<td>
<?php
if ($cfg["debug_sql"])
{
echo "Debug SQL is on. <br><br>SQL: <strong>".$sql."</strong><br><br><br>";
}
echo "Database error: <strong>".$db->ErrorMsg()."</strong><br><br>";
echo "Always check your database variables in the config.php file.<br><br>"
?>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
 
</div>
 
<?php
exit();
}
}
?>
/web/kaklik's_web/torrentflux/details.php
0,0 → 1,60
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
 
include_once("config.php");
include_once("functions.php");
require_once("metaInfo.php");
 
global $cfg;
 
$torrent = getRequestVar('torrent');
 
DisplayHead(_TORRENTDETAILS);
 
echo "<table width=\"740\" border=0 cellpadding=0 cellspacing=0><tr><td>";
 
echo displayDriveSpaceBar(getDriveSpace($cfg["path"]));
 
echo "</td></tr></table>";
echo "<br>";
echo "<div align=\"left\" id=\"BodyLayer\" name=\"BodyLayer\" style=\"border: thin solid ";
echo $cfg["main_bgcolor"];
echo "; position:relative; width:740; height:500; padding-left: 5px; padding-right: 5px; z-index:1; overflow: scroll; visibility: visible\">";
 
$als = getRequestVar('als');
if($als == "false")
{
showMetaInfo($torrent,false);
}
else
{
showMetaInfo($torrent,true);
}
 
echo "</div>";
 
DisplayFoot();
 
?>
/web/kaklik's_web/torrentflux/dir.php
0,0 → 1,501
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
checkUserPath();
 
// Setup some defaults if they are not set.
$del = getRequestVar('del');
$down = getRequestVar('down');
$tar = getRequestVar('tar');
$dir = stripslashes(urldecode(getRequestVar('dir')));
 
// Are we to delete something?
if ($del != "")
{
$current = "";
// The following lines of code were suggested by Jody Steele jmlsteele@stfu.ca
// this is so only the owner of the file(s) or admin can delete
if(IsAdmin($cfg["user"]) || preg_match("/^" . $cfg["user"] . "/",$del))
{
// Yes, then delete it
 
// we need to strip slashes twice in some circumstances
// Ex. If we are trying to delete test/tester's file/test.txt
// $del will be "test/tester\\\'s file/test.txt"
// one strip will give us "test/tester\'s file/test.txt
// the second strip will give us the correct
// "test/tester's file/test.txt"
 
$del = stripslashes(stripslashes($del));
 
if (!ereg("(\.\.\/)", $del))
{
avddelete($cfg["path"].$del);
 
$arTemp = explode("/", $del);
if (count($arTemp) > 1)
{
array_pop($arTemp);
$current = implode("/", $arTemp);
}
AuditAction($cfg["constants"]["fm_delete"], $del);
}
else
{
AuditAction($cfg["constants"]["error"], "ILLEGAL DELETE: ".$cfg['user']." tried to delete ".$del);
}
}
else
{
AuditAction($cfg["constants"]["error"], "ILLEGAL DELETE: ".$cfg['user']." tried to delete ".$del);
}
 
header("Location: dir.php?dir=".urlencode($current));
}
 
// Are we to download something?
if ($down != "" && $cfg["enable_file_download"])
{
$current = "";
// Yes, then download it
 
// we need to strip slashes twice in some circumstances
// Ex. If we are trying to download test/tester's file/test.txt
// $down will be "test/tester\\\'s file/test.txt"
// one strip will give us "test/tester\'s file/test.txt
// the second strip will give us the correct
// "test/tester's file/test.txt"
 
$down = stripslashes(stripslashes($down));
 
if (!ereg("(\.\.\/)", $down))
{
$path = $cfg["path"].$down;
 
$p = explode(".", $path);
$pc = count($p);
 
$f = explode("/", $path);
$file = array_pop($f);
$arTemp = explode("/", $down);
if (count($arTemp) > 1)
{
array_pop($arTemp);
$current = implode("/", $arTemp);
}
 
if (file_exists($path))
{
header("Content-type: application/octet-stream\n");
header("Content-disposition: attachment; filename=\"".$file."\"\n");
header("Content-transfer-encoding: binary\n");
header("Content-length: " . file_size($path) . "\n");
 
// write the session to close so you can continue to browse on the site.
session_write_close("TorrentFlux");
 
//$fp = fopen($path, "r");
$fp = popen("cat \"$path\"", "r");
fpassthru($fp);
pclose($fp);
 
AuditAction($cfg["constants"]["fm_download"], $down);
exit();
}
else
{
AuditAction($cfg["constants"]["error"], "File Not found for download: ".$cfg['user']." tried to download ".$down);
}
}
else
{
AuditAction($cfg["constants"]["error"], "ILLEGAL DOWNLOAD: ".$cfg['user']." tried to download ".$down);
}
header("Location: dir.php?dir=".urlencode($current));
}
 
// Are we to download something?
if ($tar != "" && $cfg["enable_file_download"])
{
$current = "";
// Yes, then tar and download it
 
// we need to strip slashes twice in some circumstances
// Ex. If we are trying to download test/tester's file/test.txt
// $down will be "test/tester\\\'s file/test.txt"
// one strip will give us "test/tester\'s file/test.txt
// the second strip will give us the correct
// "test/tester's file/test.txt"
 
$tar = stripslashes(stripslashes($tar));
 
if (!ereg("(\.\.\/)", $tar))
{
// This prevents the script from getting killed off when running lengthy tar jobs.
ini_set("max_execution_time", 3600);
$tar = $cfg["path"].$tar;
 
$arTemp = explode("/", $tar);
if (count($arTemp) > 1)
{
array_pop($arTemp);
$current = implode("/", $arTemp);
}
 
// Find out if we're really trying to access a file within the
// proper directory structure. Sadly, this way requires that $cfg["path"]
// is a REAL path, not a symlinked one. Also check if $cfg["path"] is part
// of the REAL path.
if (is_dir($tar))
{
$sendname = basename($tar);
 
switch ($cfg["package_type"])
{
Case "tar":
$command = "tar cf - \"".addslashes($sendname)."\"";
break;
Case "zip":
$command = "zip -0r - \"".addslashes($sendname)."\"";
break;
default:
$cfg["package_type"] = "tar";
$command = "tar cf - \"".addslashes($sendname)."\"";
break;
}
 
// HTTP/1.0
header("Pragma: no-cache");
header("Content-Description: File Transfer");
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename="'.$sendname.'.'.$cfg["package_type"].'"');
 
// write the session to close so you can continue to browse on the site.
session_write_close("TorrentFlux");
 
// Make it a bit easier for tar/zip.
chdir(dirname($tar));
passthru($command);
 
AuditAction($cfg["constants"]["fm_download"], $sendname.".".$cfg["package_type"]);
exit();
}
else
{
AuditAction($cfg["constants"]["error"], "Illegal download: ".$cfg['user']." tried to download ".$tar);
}
}
else
{
AuditAction($cfg["constants"]["error"], "ILLEGAL TAR DOWNLOAD: ".$cfg['user']." tried to download ".$tar);
}
header("Location: dir.php?dir=".urlencode($current));
}
 
if ($dir == "")
{
unset($dir);
}
 
if (isset($dir))
{
if (ereg("(\.\.)", $dir))
{
unset($dir);
}
else
{
$dir = $dir."/";
}
}
 
DisplayHead(_DIRECTORYLIST);
?>
 
<script language="JavaScript">
function MakeTorrent(name_file)
{
window.open (name_file,'_blank','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=600,height=430')
}
 
function ConfirmDelete(file)
{
return confirm("<?php echo _ABOUTTODELETE ?>: " + file)
}
</script>
 
<?php
 
displayDriveSpaceBar(getDriveSpace($cfg["path"]));
echo "<br>";
 
if(!isset($dir)) $dir = "";
ListDirectory($cfg["path"].$dir);
 
DisplayFoot();
 
 
//**************************************************************************
// ListDirectory()
// This method reads files and directories in the specified path and
// displayes them.
function ListDirectory($dirName)
{
global $dir, $cfg;
$bgLight = $cfg["bgLight"];
$bgDark = $cfg["bgDark"];
$entrys = array();
 
$bg = $bgLight;
 
$dirName = stripslashes($dirName);
 
if (isset($dir))
{
//setup default parent directory URL
$parentURL = "dir.php";
 
//get the real parentURL
if (preg_match("/^(.+)\/.+$/",$dir,$matches) == 1)
{
$parentURL="dir.php?dir=" . urlencode($matches[1]);
}
 
echo "<a href=\"" . $parentURL . "\"><img src=\"images/up_dir.gif\" width=16 height=16 title=\""._BACKTOPARRENT."\" border=0>["._BACKTOPARRENT."]</a>";
}
 
echo "<table cellpadding=2 width=740>";
$handle = opendir($dirName);
while($entry = readdir($handle))
{
$entrys[] = $entry;
}
natsort($entrys);
 
foreach($entrys as $entry)
{
if ($entry != "." && $entry != ".." && substr($entry, 0, 1) != ".")
{
if (@is_dir($dirName.$entry))
{
echo "<tr bgcolor=\"".$bg."\"><td><a href=\"dir.php?dir=".urlencode($dir.$entry)."\"><img src=\"images/folder2.gif\" width=\"16\" height=\"16\" title=\"".$entry."\" border=\"0\" align=\"absmiddle\">".$entry."</a></td>";
echo "<td>&nbsp;</td>";
echo "<td>&nbsp;</td>";
echo "<td align=\"right\">";
if ($cfg["enable_maketorrent"])
{
echo "<a href=\"JavaScript:MakeTorrent('maketorrent.php?path=".urlencode($dir.$entry)."')\"><img src=\"images/make.gif\" width=16 height=16 title=\"Make Torrent\" border=0></a>";
}
if ($cfg["enable_file_download"])
{
echo "<a href=\"dir.php?tar=".urlencode($dir.$entry)."\"><img src=\"images/tar_down.gif\" width=16 height=16 title=\"Download as ".$cfg["package_type"]."\" border=0></a>";
}
// The following lines of code were suggested by Jody Steele jmlsteele@stfu.ca
// this is so only the owner of the file(s) or admin can delete
// only give admins and users who "own" this directory
// the ability to delete sub directories
if(IsAdmin($cfg["user"]) || preg_match("/^" . $cfg["user"] . "/",$dir))
{
echo "<a href=\"dir.php?del=".urlencode($dir.$entry)."\" onclick=\"return ConfirmDelete('".addslashes($entry)."')\"><img src=\"images/delete_on.gif\" width=16 height=16 title=\""._DELETE."\" border=0></a>";
}
else
{
echo "&nbsp;";
}
echo "</td></tr>\n";
if ($bg == $bgLight)
{
$bg = $bgDark;
}
else
{
$bg = $bgLight;
}
}
else
{
// Do nothing
}
}
}
closedir($handle);
 
$entrys = array();
$handle = opendir($dirName);
while($entry = readdir($handle))
{
$entrys[] = $entry;
}
natsort($entrys);
 
foreach($entrys as $entry)
{
if ($entry != "." && $entry != "..")
{
if (@is_dir($dirName.$entry))
{
// Do nothing
}
else
{
$arStat = @lstat($dirName.$entry);
$arStat[7] = ( $arStat[7] == 0 )? file_size( $dirName . $entry ) : $arStat[7];
if (array_key_exists(10,$arStat))
{
$timeStamp = $arStat[10];
}
else
{
$timeStamp = "";
}
$fileSize = number_format(($arStat[7])/1024);
// Code added by Remko Jantzen to assign an icon per file-type. But when not
// available all stays the same.
$image="images/time.gif";
$imageOption="images/files/".getExtension($entry).".png";
if (file_exists("./".$imageOption))
{
$image = $imageOption;
}
 
echo "<tr bgcolor=\"".$bg."\">";
echo "<td>";
 
// Can users download files?
if ($cfg["enable_file_download"])
{
// Yes, let them download
echo "<a href=\"dir.php?down=".urlencode($dir.$entry)."\" >";
echo "<img src=\"".$image."\" width=\"16\" height=\"16\" alt=\"".$entry."\" border=\"0\"></a>";
echo "<a href=\"dir.php?down=".urlencode($dir.$entry)."\" >".$entry."</a>";
}
else
{
// No, just show the name
echo "<img src=\"".$image."\" width=\"16\" height=\"16\" alt=\"".$entry."\" border=\"0\">";
echo $entry;
}
 
echo "</td>";
echo "<td align=\"right\">".$fileSize." KB</td>";
echo "<td>".date("m-d-Y g:i a", $timeStamp)."</td>";
echo "<td align=\"right\">";
 
if( $cfg["enable_view_nfo"] && (( substr( strtolower($entry), -4 ) == ".nfo" ) || ( substr( strtolower($entry), -4 ) == ".txt" )) )
{
echo "<a href=\"viewnfo.php?path=".urlencode(addslashes($dir.$entry))."\"><img src=\"images/view_nfo.gif\" width=16 height=16 title=\"View '$entry'\" border=0></a>";
}
 
if ($cfg["enable_maketorrent"])
{
echo "<a href=\"JavaScript:MakeTorrent('maketorrent.php?path=".urlencode($dir.$entry)."')\"><img src=\"images/make.gif\" width=16 height=16 title=\"Make Torrent\" border=0></a>";
}
if ($cfg["enable_file_download"])
{
// Show the download button
echo "<a href=\"dir.php?down=".urlencode($dir.$entry)."\" >";
echo "<img src=\"images/download_owner.gif\" width=16 height=16 title=\"Download\" border=0>";
echo "</a>";
}
 
// The following lines of code were suggested by Jody Steele jmlsteele@stfu.ca
// this is so only the owner of the file(s) or admin can delete
// only give admins and users who "own" this directory
// the ability to delete files
if(IsAdmin($cfg["user"]) || preg_match("/^" . $cfg["user"] . "/",$dir))
{
echo "<a href=\"dir.php?del=".urlencode($dir.$entry)."\" onclick=\"return ConfirmDelete('".addslashes($entry)."')\"><img src=\"images/delete_on.gif\" width=16 height=16 title=\""._DELETE."\" border=0></a>";
}
else
{
echo "&nbsp;";
}
echo "</td></tr>\n";
 
if ($bg == $bgLight)
{
$bg = $bgDark;
}
else
{
$bg = $bgLight;
}
}
}
}
closedir($handle);
echo "</table>";
}
 
// ***************************************************************************
// ***************************************************************************
// Checks for the location of the users directory
// If it does not exist, then it creates it.
function checkUserPath()
{
global $cfg;
// is there a user dir?
if (!is_dir($cfg["path"].$cfg["user"]))
{
//Then create it
mkdir($cfg["path"].$cfg["user"], 0777);
}
}
 
 
// This function returns the extension of a given file.
// Where the extension is the part after the last dot.
// When no dot is found the noExtensionFile string is
// returned. This should point to a 'unknown-type' image
// time by default. This string is also returned when the
// file starts with an dot.
function getExtension($fileName)
{
$noExtensionFile="unknown"; // The return when no extension is found
 
//Prepare the loop to find an extension
$length = -1*(strlen($fileName)); // The maximum negative value for $i
$i=-1; //The counter which counts back to $length
 
//Find the last dot in an string
while (substr($fileName,$i,1) != "." && $i > $length) {$i -= 1; }
 
//Get the extension (with dot)
$ext = substr($fileName,$i);
 
//Decide what to return.
if (substr($ext,0,1)==".") {$ext = substr($ext,((-1 * strlen($ext))+1)); } else {$ext = $noExtensionFile;}
 
//Return the extension
return strtolower($ext);
}
 
?>
/web/kaklik's_web/torrentflux/downloaddetails.php
0,0 → 1,172
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
include_once("AliasFile.php");
 
$torrent = getRequestVar('torrent');
$error = "";
$torrentowner = getOwner($torrent);
$graph_width = "";
$background = "#000000";
$alias = getRequestVar('alias');
if (!empty($alias))
{
// read the alias file
// create AliasFile object
$af = new AliasFile($cfg["torrent_file_path"].$alias, $torrentowner);
 
for ($inx = 0; $inx < sizeof($af->errors); $inx++)
{
$error .= "<li style=\"font-size:10px;color:#ff0000;\">".$af->errors[$inx]."</li>";
}
 
if ($af->seedlimit <= 0)
{
$af->seedlimit = "none";
}
else
{
$af->seedlimit .= "%";
}
}
else
{
die("fatal error torrent file not specified");
}
 
if ($af->percent_done < 0)
{
$af->percent_done = round(($af->percent_done*-1)-100,1);
$af->time_left = _INCOMPLETE;
}
 
if($af->percent_done < 1)
{
$graph_width = "1";
}
else
{
$graph_width = $af->percent_done;
}
 
if($af->percent_done >= 100)
{
$af->percent_done = 100;
$background = "#0000ff";
}
 
if(strlen($torrent) >= 39)
{
$torrent = substr($torrent, 0, 35)."...";
}
 
$hd = getStatusImage($af);
 
DisplayHead(_DOWNLOADDETAILS, false, "5", $af->percent_done."% ");
 
?>
<div align="center">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="center">
<?php
if ($error != "")
{
echo "<img src=\"images/error.gif\" width=16 height=16 border=0 title=\"ERROR\" align=\"absmiddle\">";
}
echo $torrent."<font class=\"tiny\"> (".formatBytesToKBMGGB($af->size).")</font>";
?>
</td>
<td align="right" width="16"><img src="images/<?php echo $hd->image ?>" width=16 height=16 border=0 title="<?php echo $hd->title ?>"></td>
</tr>
</table>
<table bgcolor="<?php echo $cfg["table_header_bg"] ?>" width=352 cellpadding=1>
<tr>
<td>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td background="themes/<?php echo $cfg["theme"] ?>/images/proglass.gif"><img src="images/blank.gif" width="<?php echo $graph_width * 3.5 ?>" height="13" border="0"></td>
<td background="themes/<?php echo $cfg["theme"] ?>/images/noglass.gif" bgcolor="<?php echo $background ?>"><img src="images/blank.gif" width="<?php echo (100 - $graph_width) * 3.5 ?>" height="13" border="0"></td>
</tr>
</table>
</td>
</tr>
<tr><td>
<div align="center">
<table border="0" cellpadding="2" cellspacing="2" width="90%">
<tr>
<td align="right"><div class="tiny"><?php echo _ESTIMATEDTIME ?>:</div></td>
<td colspan="3" bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$af->time_left."</strong>" ?></div></td>
</tr>
<tr>
<td align="right"><div class="tiny"><?php echo _PERCENTDONE ?>:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$af->percent_done."%</strong>" ?></div></td>
<td align="right"><div class="tiny"><?php echo _USER ?>:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$torrentowner."</strong>" ?></div></td>
</tr>
<tr>
<td align="right"><div class="tiny"><?php echo _DOWNLOADSPEED ?>:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$af->down_speed."</strong>" ?></div></td>
<td align="right"><div class="tiny"><?php echo _UPLOADSPEED ?>:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$af->up_speed."</strong>" ?></div></td>
</tr>
<tr>
<td align="right"><div class="tiny">Down:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".formatFreeSpace($af->GetRealDownloadTotal())."</strong>" ?></div></td>
<td align="right"><div class="tiny">Up:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".formatFreeSpace($af->uptotal/(1024*1024))."</strong>" ?></div></td>
</tr>
<tr>
<td align="right"><div class="tiny">Seeds:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$af->seeds."</strong>" ?></div></td>
<td align="right"><div class="tiny">Peers:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$af->peers."</strong>" ?></div></td>
</tr>
<tr>
<td align="right"><div class="tiny"><?php echo _SHARING ?>:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$af->sharing."%</strong>" ?></div></td>
<td align="right"><div class="tiny">Seed Until:</div></td>
<td bgcolor="<?php echo $cfg["body_data_bg"] ?>"><div class="tiny"><?php echo "<strong>".$af->seedlimit."</strong>" ?></div></td>
</tr>
<?php
if ($error != "")
{
?>
<tr>
<td align="right" valign="top"><div class="tiny">Error(s):</div></td>
<td colspan="3" width="66%"><div class="tiny"><?php echo "<strong class=\"tiny\">".$error."</strong>" ?></div></td>
</tr>
<?php
}
?>
</table>
</div>
</td></tr></table>
<?php
 
DisplayFoot(false);
 
?>
/web/kaklik's_web/torrentflux/downloads/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/drivespace.php
0,0 → 1,53
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
 
$result = shell_exec("df -h ".$cfg["path"]);
$result2 = shell_exec("du -sh ".$cfg["path"]."*");
 
 
DisplayHead(_DRIVESPACE);
echo "<table width=\"740\" border=0 cellpadding=0 cellspacing=0><tr><td>";
echo displayDriveSpaceBar(getDriveSpace($cfg["path"]));
echo "</td></tr></table>";
?>
 
<br>
<div align="left" id="BodyLayer" name="BodyLayer" style="border: thin solid <?php echo $cfg["main_bgcolor"] ?>; position:relative; width:740; height:500; padding-left: 5px; padding-right: 5px; z-index:1; overflow: scroll; visibility: visible">
 
<?php
 
echo "<pre>";
echo $result;
echo "<br><hr><br>";
echo $result2;
echo "</pre>";
echo "</div>";
 
DisplayFoot();
 
?>
/web/kaklik's_web/torrentflux/dtree.css
0,0 → 1,34
/*--------------------------------------------------|
| dTree 2.05 | www.destroydrop.com/javascript/tree/ |
|---------------------------------------------------|
| Copyright (c) 2002-2003 Geir Landrö |
|--------------------------------------------------*/
 
.dtree {
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 8px;
color: #666;
white-space: nowrap;
}
.dtree img {
border: 0px;
vertical-align: middle;
}
.dtree a {
color: #333;
text-decoration: none;
}
.dtree a.node, .dtree a.nodeSel {
white-space: nowrap;
padding: 1px 2px 1px 2px;
}
.dtree a.node:hover, .dtree a.nodeSel:hover {
color: #333;
text-decoration: underline;
}
.dtree a.nodeSel {
background-color: #c0d2ec;
}
.dtree .clip {
overflow: hidden;
}
/web/kaklik's_web/torrentflux/dtree.js
0,0 → 1,408
/*--------------------------------------------------|
| dTree 2.05 | www.destroydrop.com/javascript/tree/ |
|---------------------------------------------------|
| Copyright (c) 2002-2003 Geir Landrö |
| |
| This script can be used freely as long as all |
| copyright messages are intact. |
| |
| Updated: 17.04.2003 |
|--------------------------------------------------*/
 
function getSizes() {
var len = 0;
for (var n=0; n<d.aNodes.length; n++) {
var c = document.getElementById("bd" + n);
if(c.checked)
len += d.aNodes[n].size;
}
return len;
}
 
function drawSel() {
 
$rsize = "";
if (sel > (1024 * 1024 * 1024))
{
rsize = Math.round((sel / (1024 * 1024 * 1024))*100)/100 + " GB";
}
else if (sel < 1024 * 1024)
{
rsize = Math.round((sel / 1024)*10)/10 + " KB";
}
else
{
rsize = Math.round((sel / (1024 * 1024))*10)/10 + " MB";
}
 
document.getElementById("sel").innerHTML = String(sel) + " (" + rsize +")";
 
}
 
function chg(node,status,recursion) {
 
var n=0;
 
if (typeof status == 'undefined') {
while(d.aNodes[n].id != node && n<d.aNodes.length) n++;
c = document.getElementById("bd" + n);
status = c.checked;
c.checked == true ? sel+=d.aNodes[n].size : sel-=d.aNodes[n].size;
}
 
for (n=0; n<d.aNodes.length; n++) {
if (d.aNodes[n].pid == node) {
c = document.getElementById("bd" + n);
if(status != c.checked) status == true ? sel+=d.aNodes[n].size : sel-=d.aNodes[n].size;
c.checked = status;
chg(d.aNodes[n].id,status,true);
}
}
 
if (typeof recursion == 'undefined')
drawSel();
 
}
 
 
// Node object
function Node(id, pid, name, url, title, target, icon, iconOpen, open, prio, size) {
this.id = id;
this.pid = pid;
this.name = name;
this.url = url;
this.title = title;
this.target = target;
this.icon = icon;
this.iconOpen = iconOpen;
this._io = open || false;
this.prio = prio || -1;
this.size = size || 0;
this._is = false;
this._ls = false;
this._hc = false;
this._ai = 0;
this._p;
};
 
// Tree object
function dTree(objName) {
this.config = {
target : null,
folderLinks : true,
useSelection : true,
useCookies : true,
useLines : true,
useIcons : true,
useStatusText : false,
closeSameLevel: false,
inOrder : false
}
this.icon = {
root : 'images/dtree/base.gif',
folder : 'images/dtree/folder.gif',
folderOpen : 'images/dtree/folderopen.gif',
node : 'images/dtree/page.gif',
empty : 'images/dtree/empty.gif',
line : 'images/dtree/line.gif',
join : 'images/dtree/join.gif',
joinBottom : 'images/dtree/joinbottom.gif',
plus : 'images/dtree/plus.gif',
plusBottom : 'images/dtree/plusbottom.gif',
minus : 'images/dtree/minus.gif',
minusBottom : 'images/dtree/minusbottom.gif',
nlPlus : 'images/dtree/nolines_plus.gif',
nlMinus : 'images/dtree/nolines_minus.gif'
};
this.obj = objName;
this.aNodes = [];
this.aIndent = [];
this.root = new Node(-1);
this.selectedNode = null;
this.selectedFound = false;
this.completed = false;
};
 
// Adds a new node to the node array
dTree.prototype.add = function(id, pid, name, prio, size, url, title, target, icon, iconOpen, open) {
this.aNodes[this.aNodes.length] = new Node(id, pid, name, url, title, target, icon, iconOpen, open, prio, size);
};
 
// Open/close all nodes
dTree.prototype.openAll = function() {
this.oAll(true);
};
dTree.prototype.closeAll = function() {
this.oAll(false);
};
 
// Outputs the tree to the page
dTree.prototype.toString = function() {
var str = '<div class="dtree">\n';
if (document.getElementById) {
if (this.config.useCookies) this.selectedNode = this.getSelected();
str += this.addNode(this.root);
} else str += 'Browser not supported.';
str += '</div>';
if (!this.selectedFound) this.selectedNode = null;
this.completed = true;
return str;
};
 
// Creates the tree structure
dTree.prototype.addNode = function(pNode) {
var str = '';
var n=0;
if (this.config.inOrder) n = pNode._ai;
for (n; n<this.aNodes.length; n++) {
if (this.aNodes[n].pid == pNode.id) {
var cn = this.aNodes[n];
cn._p = pNode;
cn._ai = n;
this.setCS(cn);
if (!cn.target && this.config.target) cn.target = this.config.target;
if (cn._hc && !cn._io && this.config.useCookies) cn._io = this.isOpen(cn.id);
if (!this.config.folderLinks && cn._hc) cn.url = null;
if (this.config.useSelection && cn.id == this.selectedNode && !this.selectedFound) {
cn._is = true;
this.selectedNode = n;
this.selectedFound = true;
}
str += this.node(cn, n);
if (cn._ls) break;
}
}
return str;
};
 
// Creates the node icon, url and text
dTree.prototype.node = function(node, nodeId) {
var str = '<div class="dTreeNode">' + this.indent(node, nodeId);
if (this.config.useIcons) {
if (!node.icon) node.icon = (this.root.id == node.pid) ? this.icon.root : ((node._hc) ? this.icon.folder : this.icon.node);
if (!node.iconOpen) node.iconOpen = (node._hc) ? this.icon.folderOpen : this.icon.node;
if (this.root.id == node.pid) {
node.icon = this.icon.root;
node.iconOpen = this.icon.root;
}
str += '<img id="i' + this.obj + nodeId + '" src="' + ((node._io) ? node.iconOpen : node.icon) + '" alt="" />';
}
// dirty hack by alatar :)
str += '<input type="checkbox" id="b' + this.obj + nodeId + '" name="files[]" onClick=" chg(' + node.id + '); return true;" value="' + node.id + '"'+((node.prio==1)?" checked":"")+' />';
// alatar end
if (node.url) {
str += '<a id="s' + this.obj + nodeId + '" class="' + ((this.config.useSelection) ? ((node._is ? 'nodeSel' : 'node')) : 'node') + '" href="' + node.url + '"';
if (node.title) str += ' title="' + node.title + '"';
if (node.target) str += ' target="' + node.target + '"';
if (this.config.useStatusText) str += ' onMouseOver="window.status=\'' + node.name + '\';return true;" onMouseOut="window.status=\'\';return true;" ';
if (this.config.useSelection && ((node._hc && this.config.folderLinks) || !node._hc))
str += ' onclick="javascript: ' + this.obj + '.s(' + nodeId + ');"';
str += '>';
}
else if ((!this.config.folderLinks || !node.url) && node._hc && node.pid != this.root.id)
str += '<a href="javascript: ' + this.obj + '.o(' + nodeId + ');" class="node" >';
str += node.name;
if (node.url || ((!this.config.folderLinks || !node.url) && node._hc)) str += '</a>';
str += '</div>';
if (node._hc) {
str += '<div id="d' + this.obj + nodeId + '" class="clip" style="display:' + ((this.root.id == node.pid || node._io) ? 'block' : 'none') + ';">';
str += this.addNode(node);
str += '</div>';
}
this.aIndent.pop();
 
return str;
};
 
// Adds the empty and line icons
dTree.prototype.indent = function(node, nodeId) {
var str = '';
if (this.root.id != node.pid) {
for (var n=0; n<this.aIndent.length; n++)
str += '<img src="' + ( (this.aIndent[n] == 1 && this.config.useLines) ? this.icon.line : this.icon.empty ) + '" alt="" />';
(node._ls) ? this.aIndent.push(0) : this.aIndent.push(1);
if (node._hc) {
str += '<a href="javascript: ' + this.obj + '.o(' + nodeId + ');"><img id="j' + this.obj + nodeId + '" src="';
if (!this.config.useLines) str += (node._io) ? this.icon.nlMinus : this.icon.nlPlus;
else str += ( (node._io) ? ((node._ls && this.config.useLines) ? this.icon.minusBottom : this.icon.minus) : ((node._ls && this.config.useLines) ? this.icon.plusBottom : this.icon.plus ) );
str += '" alt="" /></a>';
} else str += '<img src="' + ( (this.config.useLines) ? ((node._ls) ? this.icon.joinBottom : this.icon.join ) : this.icon.empty) + '" alt="" />';
}
return str;
};
 
// Checks if a node has any children and if it is the last sibling
dTree.prototype.setCS = function(node) {
var lastId;
for (var n=0; n<this.aNodes.length; n++) {
if (this.aNodes[n].pid == node.id) node._hc = true;
if (this.aNodes[n].pid == node.pid) lastId = this.aNodes[n].id;
}
if (lastId==node.id) node._ls = true;
};
 
// Returns the selected node
dTree.prototype.getSelected = function() {
var sn = this.getCookie('cs' + this.obj);
return (sn) ? sn : null;
};
 
// Highlights the selected node
dTree.prototype.s = function(id) {
if (!this.config.useSelection) return;
var cn = this.aNodes[id];
if (cn._hc && !this.config.folderLinks) return;
if (this.selectedNode != id) {
if (this.selectedNode || this.selectedNode==0) {
eOld = document.getElementById("s" + this.obj + this.selectedNode);
eOld.className = "node";
}
eNew = document.getElementById("s" + this.obj + id);
eNew.className = "nodeSel";
this.selectedNode = id;
if (this.config.useCookies) this.setCookie('cs' + this.obj, cn.id);
}
};
 
// Toggle Open or close
dTree.prototype.o = function(id) {
var cn = this.aNodes[id];
this.nodeStatus(!cn._io, id, cn._ls);
cn._io = !cn._io;
if (this.config.closeSameLevel) this.closeLevel(cn);
if (this.config.useCookies) this.updateCookie();
};
 
// Open or close all nodes
dTree.prototype.oAll = function(status) {
for (var n=0; n<this.aNodes.length; n++) {
if (this.aNodes[n]._hc && this.aNodes[n].pid != this.root.id) {
this.nodeStatus(status, n, this.aNodes[n]._ls)
this.aNodes[n]._io = status;
}
}
if (this.config.useCookies) this.updateCookie();
};
 
// Opens the tree to a specific node
dTree.prototype.openTo = function(nId, bSelect, bFirst) {
if (!bFirst) {
for (var n=0; n<this.aNodes.length; n++) {
if (this.aNodes[n].id == nId) {
nId=n;
break;
}
}
}
var cn=this.aNodes[nId];
if (cn.pid==this.root.id || !cn._p) return;
cn._io = true;
cn._is = bSelect;
if (this.completed && cn._hc) this.nodeStatus(true, cn._ai, cn._ls);
if (this.completed && bSelect) this.s(cn._ai);
else if (bSelect) this._sn=cn._ai;
this.openTo(cn._p._ai, false, true);
};
 
// Closes all nodes on the same level as certain node
dTree.prototype.closeLevel = function(node) {
for (var n=0; n<this.aNodes.length; n++) {
if (this.aNodes[n].pid == node.pid && this.aNodes[n].id != node.id && this.aNodes[n]._hc) {
this.nodeStatus(false, n, this.aNodes[n]._ls);
this.aNodes[n]._io = false;
this.closeAllChildren(this.aNodes[n]);
}
}
}
 
// Closes all children of a node
dTree.prototype.closeAllChildren = function(node) {
for (var n=0; n<this.aNodes.length; n++) {
if (this.aNodes[n].pid == node.id && this.aNodes[n]._hc) {
if (this.aNodes[n]._io) this.nodeStatus(false, n, this.aNodes[n]._ls);
this.aNodes[n]._io = false;
this.closeAllChildren(this.aNodes[n]);
}
}
}
 
// Change the status of a node(open or closed)
dTree.prototype.nodeStatus = function(status, id, bottom) {
eDiv = document.getElementById('d' + this.obj + id);
eJoin = document.getElementById('j' + this.obj + id);
if (this.config.useIcons) {
eIcon = document.getElementById('i' + this.obj + id);
eIcon.src = (status) ? this.aNodes[id].iconOpen : this.aNodes[id].icon;
}
eJoin.src = (this.config.useLines)?
((status)?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus)):
((status)?this.icon.nlMinus:this.icon.nlPlus);
eDiv.style.display = (status) ? 'block': 'none';
};
 
// [Cookie] Clears a cookie
dTree.prototype.clearCookie = function() {
var now = new Date();
var yesterday = new Date(now.getTime() - 1000 * 60 * 60 * 24);
this.setCookie('co'+this.obj, 'cookieValue', yesterday);
this.setCookie('cs'+this.obj, 'cookieValue', yesterday);
};
 
// [Cookie] Sets value in a cookie
dTree.prototype.setCookie = function(cookieName, cookieValue, expires, path, domain, secure) {
document.cookie =
escape(cookieName) + '=' + escape(cookieValue)
+ (expires ? '; expires=' + expires.toGMTString() : '')
+ (path ? '; path=' + path : '')
+ (domain ? '; domain=' + domain : '')
+ (secure ? '; secure' : '');
};
 
// [Cookie] Gets a value from a cookie
dTree.prototype.getCookie = function(cookieName) {
var cookieValue = '';
var posName = document.cookie.indexOf(escape(cookieName) + '=');
if (posName != -1) {
var posValue = posName + (escape(cookieName) + '=').length;
var endPos = document.cookie.indexOf(';', posValue);
if (endPos != -1) cookieValue = unescape(document.cookie.substring(posValue, endPos));
else cookieValue = unescape(document.cookie.substring(posValue));
}
return (cookieValue);
};
 
// [Cookie] Returns ids of open nodes as a string
dTree.prototype.updateCookie = function() {
var str = '';
for (var n=0; n<this.aNodes.length; n++) {
if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) {
if (str) str += '.';
str += this.aNodes[n].id;
}
}
this.setCookie('co' + this.obj, str);
};
 
// [Cookie] Checks if a node id is in a cookie
dTree.prototype.isOpen = function(id) {
var aOpen = this.getCookie('co' + this.obj).split('.');
for (var n=0; n<aOpen.length; n++)
if (aOpen[n] == id) return true;
return false;
};
 
// If Push and pop is not implemented by the browser
if (!Array.prototype.push) {
Array.prototype.push = function array_push() {
for(var i=0;i<arguments.length;i++)
this[this.length]=arguments[i];
return this.length;
}
};
if (!Array.prototype.pop) {
Array.prototype.pop = function array_pop() {
lastElement = this[this.length-1];
this.length = Math.max(this.length-1,0);
return lastElement;
}
};
/web/kaklik's_web/torrentflux/favicon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/functions.php
0,0 → 1,2535
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
// Start Session and grab user
session_start("TorrentFlux");
 
if(isset($_SESSION['user']))
{
$cfg["user"] = strtolower($_SESSION['user']);
}else{
$cfg["user"] = "";
}
 
include_once('db.php');
include_once("settingsfunctions.php");
 
// Create Connection.
$db = getdb();
 
loadSettings();
 
// Free space in MB
$cfg["free_space"] = @disk_free_space($cfg["path"])/(1024*1024);
 
// Path to where the torrent meta files will be stored... usually a sub of $cfg["path"]
// also, not the '.' to make this a hidden directory
$cfg["torrent_file_path"] = $cfg["path"].".torrents/";
 
Authenticate();
 
include_once("language/".$cfg["language_file"]);
include_once("themes/".$cfg["theme"]."/index.php");
AuditAction($cfg["constants"]["hit"], $_SERVER['PHP_SELF']);
PruneDB();
 
// is there a stat and torrent dir? If not then it will create it.
checkTorrentPath();
 
//**********************************************************************************
// START FUNCTIONS HERE
//**********************************************************************************
 
//*********************************************************
// avddelete()
function avddelete($file)
{
chmod($file,0777);
if (@is_dir($file))
{
$handle = @opendir($file);
while($filename = readdir($handle))
{
if ($filename != "." && $filename != "..")
{
avddelete($file."/".$filename);
}
}
closedir($handle);
@rmdir($file);
}
else
{
@unlink($file);
}
}
 
 
//*********************************************************
// Authenticate()
function Authenticate()
{
global $cfg, $db;
 
$create_time = time();
 
if(!isset($_SESSION['user']))
{
header('location: login.php');
exit();
}
 
if ($_SESSION['user'] == md5($cfg["pagetitle"]))
{
// user changed password and needs to login again
header('location: logout.php');
exit();
}
 
$sql = "SELECT uid, hits, hide_offline, theme, language_file FROM tf_users WHERE user_id=".$db->qstr($cfg['user']);
$recordset = $db->Execute($sql);
showError($db, $sql);
 
if($recordset->RecordCount() != 1)
{
AuditAction($cfg["constants"]["error"], "FAILED AUTH: ".$cfg['user']);
session_destroy();
header('location: login.php');
exit();
}
 
list($uid, $hits, $cfg["hide_offline"], $cfg["theme"], $cfg["language_file"]) = $recordset->FetchRow();
 
// Check for valid theme
if (!ereg('^[^./][^/]*$', $cfg["theme"]))
{
AuditAction($cfg["constants"]["error"], "THEME VARIABLE CHANGE ATTEMPT: ".$cfg["theme"]." from ".$cfg['user']);
$cfg["theme"] = $cfg["default_theme"];
}
 
// Check for valid language file
if(!ereg('^[^./][^/]*$', $cfg["language_file"]))
{
AuditAction($cfg["constants"]["error"], "LANGUAGE VARIABLE CHANGE ATTEMPT: ".$cfg["language_file"]." from ".$cfg['user']);
$cfg["language_file"] = $cfg["default_language"];
}
 
if (!is_dir("themes/".$cfg["theme"]))
{
$cfg["theme"] = $cfg["default_theme"];
}
 
// Check for valid language file
if (!is_file("language/".$cfg["language_file"]))
{
$cfg["language_file"] = $cfg["default_language"];
}
 
$hits++;
 
$sql = 'select * from tf_users where uid = '.$uid;
$rs = $db->Execute($sql);
showError($db, $sql);
 
$rec = array(
'hits' => $hits,
'last_visit' => $create_time,
'theme' => $cfg['theme'],
'language_file' => $cfg['language_file']
);
$sql = $db->GetUpdateSQL($rs, $rec);
 
$result = $db->Execute($sql);
showError($db,$sql);
}
 
 
//*********************************************************
// SaveMessage
function SaveMessage($to_user, $from_user, $message, $to_all=0, $force_read=0)
{
global $_SERVER, $cfg, $db;
 
$message = str_replace(array("'"), "", $message);
 
$create_time = time();
 
$sTable = 'tf_messages';
if($to_all == 1)
{
$message .= "\n\n__________________________________\n*** "._MESSAGETOALL." ***";
$sql = 'select user_id from tf_users';
$result = $db->Execute($sql);
showError($db,$sql);
 
while($row = $result->FetchRow())
{
$rec = array(
'to_user' => $row['user_id'],
'from_user' => $from_user,
'message' => $message,
'IsNew' => 1,
'ip' => $cfg['ip'],
'time' => $create_time,
'force_read' => $force_read
);
 
$sql = $db->GetInsertSql($sTable, $rec);
 
$result2 = $db->Execute($sql);
showError($db,$sql);
}
}
else
{
// Only Send to one Person
$rec = array(
'to_user' => $to_user,
'from_user' => $from_user,
'message' => $message,
'IsNew' => 1,
'ip' => $cfg['ip'],
'time' => $create_time,
'force_read' => $force_read
);
$sql = $db->GetInsertSql($sTable, $rec);
$result = $db->Execute($sql);
showError($db,$sql);
}
 
}
 
//*********************************************************
function addNewUser($newUser, $pass1, $userType)
{
global $cfg, $db;
 
$create_time = time();
 
$record = array(
'user_id'=>strtolower($newUser),
'password'=>md5($pass1),
'hits'=>0,
'last_visit'=>$create_time,
'time_created'=>$create_time,
'user_level'=>$userType,
'hide_offline'=>"0",
'theme'=>$cfg["default_theme"],
'language_file'=>$cfg["default_language"]
);
 
$sTable = 'tf_users';
$sql = $db->GetInsertSql($sTable, $record);
$result = $db->Execute($sql);
showError($db,$sql);
}
 
//*********************************************************
function PruneDB()
{
global $cfg, $db;
 
// Prune LOG
$testTime = time()-($cfg['days_to_keep'] * 86400); // 86400 is one day in seconds
$sql = "delete from tf_log where time < " . $db->qstr($testTime);
$result = $db->Execute($sql);
showError($db,$sql);
unset($result);
 
$testTime = time()-($cfg['minutes_to_keep'] * 60);
$sql = "delete from tf_log where time < " . $db->qstr($testTime). " and action=".$db->qstr($cfg["constants"]["hit"]);
$result = $db->Execute($sql);
showError($db,$sql);
unset($result);
}
 
//*********************************************************
function IsOnline($user)
{
global $cfg, $db;
 
$online = false;
 
$sql = "SELECT count(*) FROM tf_log WHERE user_id=" . $db->qstr($user)." AND action=".$db->qstr($cfg["constants"]["hit"]);
 
$number_hits = $db->GetOne($sql);
showError($db,$sql);
 
if ($number_hits > 0)
{
$online = true;
}
 
return $online;
}
 
//*********************************************************
function IsUser($user)
{
global $cfg, $db;
 
$isUser = false;
 
$sql = "SELECT count(*) FROM tf_users WHERE user_id=".$db->qstr($user);
$number_users = $db->GetOne($sql);
 
if ($number_users > 0)
{
$isUser = true;
}
 
return $isUser;
}
 
//*********************************************************
function getOwner($file)
{
global $cfg, $db;
 
$rtnValue = "n/a";
 
// Check log to see what user has a history with this file
$sql = "SELECT user_id FROM tf_log WHERE file=".$db->qstr($file)." AND (action=".$db->qstr($cfg["constants"]["file_upload"])." OR action=".$db->qstr($cfg["constants"]["url_upload"])." OR action=".$db->qstr($cfg["constants"]["reset_owner"]).") ORDER BY time DESC";
$user_id = $db->GetOne($sql);
 
if($user_id != "")
{
$rtnValue = $user_id;
}
else
{
// try and get the owner from the stat file
$rtnValue = resetOwner($file);
}
 
return $rtnValue;
}
 
//*********************************************************
function resetOwner($file)
{
global $cfg, $db;
include_once("AliasFile.php");
 
// log entry has expired so we must renew it
$rtnValue = "";
 
$alias = getAliasName($file).".stat";
 
if(file_exists($cfg["torrent_file_path"].$alias))
{
$af = new AliasFile($cfg["torrent_file_path"].$alias);
 
if (IsUser($af->torrentowner))
{
// We have an owner!
$rtnValue = $af->torrentowner;
}
else
{
// no owner found, so the super admin will now own it
$rtnValue = GetSuperAdmin();
}
 
$host_resolved = gethostbyaddr($cfg['ip']);
$create_time = time();
 
$rec = array(
'user_id' => $rtnValue,
'file' => $file,
'action' => $cfg["constants"]["reset_owner"],
'ip' => $cfg['ip'],
'ip_resolved' => $host_resolved,
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'time' => $create_time
);
 
$sTable = 'tf_log';
$sql = $db->GetInsertSql($sTable, $rec);
 
// add record to the log
$result = $db->Execute($sql);
showError($db,$sql);
}
 
return $rtnValue;
}
 
//*********************************************************
function getCookie($cid)
{
global $cfg, $db;
 
$rtnValue = "";
 
$sql = "SELECT host, data FROM tf_cookies WHERE cid=".$cid;
$rtnValue = $db->GetAll($sql);
 
return $rtnValue[0];
}
 
// ***************************************************************************
// Delete Cookie Host Information
function deleteCookieInfo($cid)
{
global $db;
$sql = "delete from tf_cookies where cid=".$cid;
$result = $db->Execute($sql);
showError($db,$sql);
}
 
// ***************************************************************************
// addCookieInfo - Add New Cookie Host Information
function addCookieInfo( $newCookie )
{
global $db, $cfg;
// Get uid of user
$sql = "SELECT uid FROM tf_users WHERE user_id = '" . $cfg["user"] . "'";
$uid = $db->GetOne( $sql );
$sql = "INSERT INTO tf_cookies ( cid, uid, host, data ) VALUES ( '', '" . $uid . "', '" . $newCookie["host"] . "', '" . $newCookie["data"] . "' )";
$db->Execute( $sql );
showError( $db, $sql );
}
 
// ***************************************************************************
// modCookieInfo - Modify Cookie Host Information
function modCookieInfo($cid, $newCookie)
{
global $db;
$sql = "UPDATE tf_cookies SET host='" . $newCookie["host"] . "', data='" . $newCookie["data"] . "' WHERE cid='" . $cid . "'";
$db->Execute($sql);
showError($db,$sql);
}
 
//*********************************************************
function getLink($lid)
{
global $cfg, $db;
 
$rtnValue = "";
 
$sql = "SELECT url FROM tf_links WHERE lid=".$lid;
$rtnValue = $db->GetOne($sql);
 
return $rtnValue;
}
 
//*********************************************************
function getRSS($rid)
{
global $cfg, $db;
 
$rtnValue = "";
 
$sql = "SELECT url FROM tf_rss WHERE rid=".$rid;
$rtnValue = $db->GetOne($sql);
 
return $rtnValue;
}
 
//*********************************************************
function IsOwner($user, $owner)
{
$rtnValue = false;
 
if (strtolower($user) == strtolower($owner))
{
$rtnValue = true;
}
 
return $rtnValue;
}
 
//*********************************************************
function GetActivityCount($user="")
{
global $cfg, $db;
 
$count = 0;
$for_user = "";
 
if ($user != "")
{
$for_user = "user_id=".$db->qstr($user)." AND ";
}
 
$sql = "SELECT count(*) FROM tf_log WHERE ".$for_user."(action=".$db->qstr($cfg["constants"]["file_upload"])." OR action=".$db->qstr($cfg["constants"]["url_upload"]).")";
$count = $db->GetOne($sql);
 
return $count;
}
 
//*********************************************************
function GetSpeedValue($inValue)
{
$rtnValue = 0;
$arTemp = split(" ", trim($inValue));
 
if (is_numeric($arTemp[0]))
{
$rtnValue = $arTemp[0];
}
return $rtnValue;
}
 
// ***************************************************************************
// Is User Admin
// user is Admin if level is 1 or higher
function IsAdmin($user="")
{
global $cfg, $db;
 
$isAdmin = false;
 
if($user == "")
{
$user = $cfg["user"];
}
 
$sql = "SELECT user_level FROM tf_users WHERE user_id=".$db->qstr($user);
$user_level = $db->GetOne($sql);
 
if ($user_level >= 1)
{
$isAdmin = true;
}
return $isAdmin;
}
 
// ***************************************************************************
// Is User SUPER Admin
// user is Super Admin if level is higher than 1
function IsSuperAdmin($user="")
{
global $cfg, $db;
 
$isAdmin = false;
 
if($user == "")
{
$user = $cfg["user"];
}
 
$sql = "SELECT user_level FROM tf_users WHERE user_id=".$db->qstr($user);
$user_level = $db->GetOne($sql);
 
if ($user_level > 1)
{
$isAdmin = true;
}
return $isAdmin;
}
 
 
// ***************************************************************************
// Returns true if user has message from admin with force_read
function IsForceReadMsg()
{
global $cfg, $db;
$rtnValue = false;
 
$sql = "SELECT count(*) FROM tf_messages WHERE to_user=".$db->qstr($cfg["user"])." AND force_read=1";
$count = $db->GetOne($sql);
showError($db,$sql);
 
if ($count >= 1)
{
$rtnValue = true;
}
return $rtnValue;
}
 
// ***************************************************************************
// Get Message data in an array
function GetMessage($mid)
{
global $cfg, $db;
 
$sql = "select from_user, message, ip, time, isnew, force_read from tf_messages where mid=".$mid." and to_user=".$db->qstr($cfg['user']);
 
$rtnValue = $db->GetRow($sql);
showError($db,$sql);
 
return $rtnValue;
}
 
// ***************************************************************************
// Get Themes data in an array
function GetThemes()
{
$arThemes = array();
$dir = "themes/";
 
$handle = opendir($dir);
while($entry = readdir($handle))
{
if (is_dir($dir.$entry) && ($entry != "." && $entry != ".."))
{
array_push($arThemes, $entry);
}
}
closedir($handle);
 
sort($arThemes);
 
return $arThemes;
}
 
// ***************************************************************************
// Get Languages in an array
function GetLanguages()
{
$arLanguages = array();
$dir = "language/";
 
$handle = opendir($dir);
while($entry = readdir($handle))
{
if (is_file($dir.$entry) && (strcmp(strtolower(substr($entry, strlen($entry)-4, 4)), ".php") == 0))
{
array_push($arLanguages, $entry);
}
}
closedir($handle);
 
sort($arLanguages);
 
return $arLanguages;
}
 
// ***************************************************************************
// Get Language name from file name
function GetLanguageFromFile($inFile)
{
$rtnValue = "";
 
$rtnValue = str_replace("lang-", "", $inFile);
$rtnValue = str_replace(".php", "", $rtnValue);
 
return $rtnValue;
}
 
// ***************************************************************************
// Delete Message
function DeleteMessage($mid)
{
global $cfg, $db;
 
$sql = "delete from tf_messages where mid=".$mid." and to_user=".$db->qstr($cfg['user']);
$result = $db->Execute($sql);
showError($db,$sql);
}
 
 
// ***************************************************************************
// Delete Link
function deleteOldLink($lid)
{
global $db;
$sql = "delete from tf_links where lid=".$lid;
$result = $db->Execute($sql);
showError($db,$sql);
}
 
// ***************************************************************************
// Delete RSS
function deleteOldRSS($rid)
{
global $db;
$sql = "delete from tf_rss where rid=".$rid;
$result = $db->Execute($sql);
showError($db,$sql);
}
 
// ***************************************************************************
// Delete User
function DeleteThisUser($user_id)
{
global $db;
 
$sql = "SELECT uid FROM tf_users WHERE user_id = ".$db->qstr($user_id);
$uid = $db->GetOne( $sql );
showError($db,$sql);
 
// delete any cookies this user may have had
//$sql = "DELETE tf_cookies FROM tf_cookies, tf_users WHERE (tf_users.uid = tf_cookies.uid) AND tf_users.user_id=".$db->qstr($user_id);
$sql = "DELETE FROM tf_cookies WHERE uid=".$uid;
$result = $db->Execute($sql);
showError($db,$sql);
 
// Now cleanup any message this person may have had
$sql = "DELETE FROM tf_messages WHERE to_user=".$db->qstr($user_id);
$result = $db->Execute($sql);
showError($db,$sql);
 
// now delete the user from the table
$sql = "DELETE FROM tf_users WHERE user_id=".$db->qstr($user_id);
$result = $db->Execute($sql);
showError($db,$sql);
}
 
// ***************************************************************************
// Update User -- used by admin
function updateThisUser($user_id, $org_user_id, $pass1, $userType, $hideOffline)
{
global $db;
 
if ($hideOffline == "")
{
$hideOffline = 0;
}
 
$sql = 'select * from tf_users where user_id = '.$db->qstr($org_user_id);
$rs = $db->Execute($sql);
showError($db,$sql);
 
$rec = array();
$rec['user_id'] = $user_id;
$rec['user_level'] = $userType;
$rec['hide_offline'] = $hideOffline;
 
if ($pass1 != "")
{
$rec['password'] = md5($pass1);
}
 
$sql = $db->GetUpdateSQL($rs, $rec);
 
if ($sql != "")
{
$result = $db->Execute($sql);
showError($db,$sql);
}
 
// if the original user id and the new id do not match, we need to update messages and log
if ($user_id != $org_user_id)
{
$sql = "UPDATE tf_messages SET to_user=".$db->qstr($user_id)." WHERE to_user=".$db->qstr($org_user_id);
 
$result = $db->Execute($sql);
showError($db,$sql);
 
$sql = "UPDATE tf_messages SET from_user=".$db->qstr($user_id)." WHERE from_user=".$db->qstr($org_user_id);
$result = $db->Execute($sql);
showError($db,$sql);
 
$sql = "UPDATE tf_log SET user_id=".$db->qstr($user_id)." WHERE user_id=".$db->qstr($org_user_id);
$result = $db->Execute($sql);
showError($db,$sql);
}
}
 
// ***************************************************************************
// changeUserLevel Changes the Users Level
function changeUserLevel($user_id, $level)
{
global $db;
 
$sql='select * from tf_users where user_id = '.$db->qstr($user_id);
$rs = $db->Execute($sql);
showError($db,$sql);
 
$rec = array('user_level'=>$level);
$sql = $db->GetUpdateSQL($rs, $rec);
$result = $db->Execute($sql);
showError($db,$sql);
}
 
// ***************************************************************************
// Mark Message as Read
function MarkMessageRead($mid)
{
global $cfg, $db;
 
$sql = 'select * from tf_messages where mid = '.$mid;
$rs = $db->Execute($sql);
showError($db,$sql);
 
$rec = array('IsNew'=>0,
'force_read'=>0);
 
$sql = $db->GetUpdateSQL($rs, $rec);
$db->Execute($sql);
showError($db,$sql);
}
 
 
// ***************************************************************************
// addNewLink - Add New Link
function addNewLink($newLink)
{
global $db;
$rec = array('url'=>$newLink);
$sTable = 'tf_links';
$sql = $db->GetInsertSql($sTable, $rec);
$db->Execute($sql);
showError($db,$sql);
}
 
 
// ***************************************************************************
// addNewRSS - Add New RSS Link
function addNewRSS($newRSS)
{
global $db;
$rec = array('url'=>$newRSS);
$sTable = 'tf_rss';
$sql = $db->GetInsertSql($sTable, $rec);
$db->Execute($sql);
showError($db,$sql);
}
 
// ***************************************************************************
// UpdateUserProfile
function UpdateUserProfile($user_id, $pass1, $hideOffline, $theme, $language)
{
global $cfg, $db;
 
if (empty($hideOffline) || $hideOffline == "" || !isset($hideOffline))
{
$hideOffline = "0";
}
 
// update values
$rec = array();
 
if ($pass1 != "")
{
$rec['password'] = md5($pass1);
AuditAction($cfg["constants"]["update"], _PASSWORD);
}
 
$sql = 'select * from tf_users where user_id = '.$db->qstr($user_id);
$rs = $db->Execute($sql);
showError($db,$sql);
 
$rec['hide_offline'] = $hideOffline;
$rec['theme'] = $theme;
$rec['language_file'] = $language;
 
$sql = $db->GetUpdateSQL($rs, $rec);
 
$result = $db->Execute($sql);
showError($db,$sql);
}
 
 
// ***************************************************************************
// Get Users in an array
function GetUsers()
{
global $cfg, $db;
 
$user_array = array();
 
$sql = "select user_id from tf_users order by user_id";
$user_array = $db->GetCol($sql);
showError($db,$sql);
return $user_array;
}
 
// ***************************************************************************
// Get Super Admin User ID as a String
function GetSuperAdmin()
{
global $cfg, $db;
 
$rtnValue = "";
 
$sql = "select user_id from tf_users WHERE user_level=2";
$rtnValue = $db->GetOne($sql);
showError($db,$sql);
return $rtnValue;
}
 
// ***************************************************************************
// Get Links in an array
function GetLinks()
{
global $cfg, $db;
 
$link_array = array();
 
$link_array = $db->GetAssoc("SELECT lid, url FROM tf_links ORDER BY lid");
return $link_array;
}
 
// ***************************************************************************
// Get RSS Links in an array
function GetRSSLinks()
{
global $cfg, $db;
 
$link_array = array();
 
$sql = "SELECT rid, url FROM tf_rss ORDER BY rid";
$link_array = $db->GetAssoc($sql);
showError($db,$sql);
 
return $link_array;
}
 
// ***************************************************************************
// Build Search Engine Drop Down List
function buildSearchEngineDDL($selectedEngine = 'TorrentSpy', $autoSubmit = false)
{
$output = "<select name=\"searchEngine\" ";
if ($autoSubmit)
{
$output .= "onchange=\"this.form.submit();\" ";
}
$output .= " STYLE=\"width: 125px\">";
 
$handle = opendir("./searchEngines");
while($entry = readdir($handle))
{
$entrys[] = $entry;
}
natcasesort($entrys);
 
foreach($entrys as $entry)
{
if ($entry != "." && $entry != ".." && substr($entry, 0, 1) != ".")
if(strpos($entry,"Engine.php"))
{
$tmpEngine = str_replace("Engine",'',substr($entry,0,strpos($entry,".")));
$output .= "<option";
if ($selectedEngine == $tmpEngine)
{
$output .= " selected";
}
$output .= ">".str_replace("Engine",'',substr($entry,0,strpos($entry,".")))."</option>";
}
}
$output .= "</select>\n";
 
return $output;
}
 
// ***************************************************************************
// Build Search Engine Links
function buildSearchEngineLinks($selectedEngine = 'TorrentSpy')
{
global $cfg;
 
$settingsNeedsSaving = false;
$settings['searchEngineLinks'] = Array();
 
$output = '';
 
if( (!array_key_exists('searchEngineLinks', $cfg)) || (!is_array($cfg['searchEngineLinks'])))
{
saveSettings($settings);
}
 
$handle = opendir("./searchEngines");
while($entry = readdir($handle))
{
$entrys[] = $entry;
}
natcasesort($entrys);
 
foreach($entrys as $entry)
{
if ($entry != "." && $entry != ".." && substr($entry, 0, 1) != ".")
if(strpos($entry,"Engine.php"))
{
$tmpEngine = str_replace("Engine",'',substr($entry,0,strpos($entry,".")));
 
if(array_key_exists($tmpEngine,$cfg['searchEngineLinks']))
{
$hreflink = $cfg['searchEngineLinks'][$tmpEngine];
$settings['searchEngineLinks'][$tmpEngine] = $hreflink;
}
else
{
$hreflink = getEngineLink($tmpEngine);
$settings['searchEngineLinks'][$tmpEngine] = $hreflink;
$settingsNeedsSaving = true;
}
 
if (strlen($hreflink) > 0)
{
$output .= "<a href=\"http://".$hreflink."/\" target=\"_blank\">";
if ($selectedEngine == $tmpEngine)
{
$output .= "<b>".$hreflink."</b>";
}
else
{
$output .= $hreflink;
}
$output .= "</a><br>\n";
}
}
}
 
if ( count($settings['searchEngineLinks'],COUNT_RECURSIVE) <> count($cfg['searchEngineLinks'],COUNT_RECURSIVE))
{
$settingsNeedsSaving = true;
}
 
if ($settingsNeedsSaving)
{
natcasesort($settings['searchEngineLinks']);
 
saveSettings($settings);
}
 
return $output;
}
function getEngineLink($searchEngine)
{
$tmpLink = '';
$engineFile = 'searchEngines/'.$searchEngine.'Engine.php';
if (is_file($engineFile))
{
$fp = @fopen($engineFile,'r');
if ($fp)
{
$tmp = fread($fp, filesize($engineFile));
@fclose( $fp );
 
$tmp = substr($tmp,strpos($tmp,'$this->mainURL'),100);
$tmp = substr($tmp,strpos($tmp,"=")+1);
$tmp = substr($tmp,0,strpos($tmp,";"));
$tmpLink = trim(str_replace(array("'","\""),"",$tmp));
}
}
return $tmpLink;
}
 
// ***************************************************************************
// ***************************************************************************
// Display Functions
 
 
// ***************************************************************************
// ***************************************************************************
// Display the header portion of admin views
function DisplayHead($subTopic, $showButtons=true, $refresh="", $percentdone="")
{
global $cfg;
?>
 
<html>
<HEAD>
<TITLE><?php echo $percentdone.$cfg["pagetitle"] ?></TITLE>
<link rel="icon" href="images/favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />
<LINK REL="StyleSheet" HREF="themes/<?php echo $cfg["theme"] ?>/style.css" TYPE="text/css">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache; charset=<?php echo _CHARSET ?>">
 
<?php
if ($refresh != "")
{
echo "<meta http-equiv=\"REFRESH\" content=\"".$refresh."\">";
}
?>
</HEAD>
 
<body topmargin="8" leftmargin="5" bgcolor="<?php echo $cfg["main_bgcolor"] ?>">
 
<div align="center">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
 
<table border="1" bordercolor="<?php echo $cfg["table_border_dk"] ?>" cellpadding="4" cellspacing="0">
<tr>
<td bgcolor="<?php echo $cfg["main_bgcolor"] ?>" background="themes/<?php echo $cfg["theme"] ?>/images/bar.gif">
<?php DisplayTitleBar($cfg["pagetitle"]." - ".$subTopic, $showButtons); ?>
</td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_header_bg"] ?>">
<div align="center">
 
<table width="100%" bgcolor="<?php echo $cfg["body_data_bg"] ?>">
<tr><td>
<?php
}
 
 
// ***************************************************************************
// ***************************************************************************
// Display the footer portion
function DisplayFoot($showReturn=true)
{
global $cfg;
?>
</td></tr>
</table>
<?php
if ($showReturn)
{
echo "[<a href=\"index.php\">"._RETURNTOTORRENTS."</a>]";
}
?>
</div>
</td>
</tr>
</table>
<?php
echo DisplayTorrentFluxLink();
?>
 
</td>
</tr>
</table>
</div>
 
</body>
</html>
 
<?php
}
 
 
// ***************************************************************************
// ***************************************************************************
// Dipslay TF Link and Version
function DisplayTorrentFluxLink()
{
global $cfg;
 
echo "<div align=\"right\">";
echo "<a href=\"http://www.torrentflux.com\" target=\"_blank\"><font class=\"tinywhite\">TorrentFlux ".$cfg["version"]."</font></a>&nbsp;&nbsp;";
echo "</div>";
}
 
 
// ***************************************************************************
// ***************************************************************************
// Dipslay Title Bar
// 2004-12-09 PFM: now using adodb.
function DisplayTitleBar($pageTitleText, $showButtons=true)
{
global $cfg, $db;
?>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="left"><font class="title"><?php echo $pageTitleText ?></font></td>
 
<?php
if ($showButtons)
{
echo "<td align=right>";
// Top Buttons
echo "&nbsp;&nbsp;";
 
echo "<a href=\"index.php\"><img src=\"themes/".$cfg["theme"]."/images/home.gif\" width=49 height=13 title=\""._TORRENTS."\" border=0></a>&nbsp;";
echo "<a href=\"dir.php\"><img src=\"themes/".$cfg["theme"]."/images/directory.gif\" width=49 height=13 title=\""._DIRECTORYLIST."\" border=0></a>&nbsp;";
echo "<a href=\"history.php\"><img src=\"themes/".$cfg["theme"]."/images/history.gif\" width=49 height=13 title=\""._UPLOADHISTORY."\" border=0></a>&nbsp;";
echo "<a href=\"profile.php\"><img src=\"themes/".$cfg["theme"]."/images/profile.gif\" width=49 height=13 title=\""._MYPROFILE."\" border=0></a>&nbsp;";
 
// Does the user have messages?
$sql = "select count(*) from tf_messages where to_user='".$cfg['user']."' and IsNew=1";
 
$number_messages = $db->GetOne($sql);
showError($db,$sql);
if ($number_messages > 0)
{
// We have messages
$message_image = "themes/".$cfg["theme"]."/images/messages_on.gif";
}
else
{
// No messages
$message_image = "themes/".$cfg["theme"]."/images/messages_off.gif";
}
 
echo "<a href=\"readmsg.php\"><img src=\"".$message_image."\" width=49 height=13 title=\""._MESSAGES."\" border=0></a>";
 
if(IsAdmin())
{
echo "&nbsp;<a href=\"admin.php\"><img src=\"themes/".$cfg["theme"]."/images/admin.gif\" width=49 height=13 title=\""._ADMINISTRATION."\" border=0></a>";
}
 
echo "&nbsp;<a href=\"logout.php\"><img src=\"images/logout.gif\" width=13 height=12 title=\"Logout\" border=0></a>";
}
?>
</td>
</tr>
</table>
<?php
}
 
 
// ***************************************************************************
// ***************************************************************************
// Dipslay dropdown list to send message to a user
function DisplayMessageList()
{
global $cfg;
$users = GetUsers();
 
echo '<div align="center">'.
'<table border="0" cellpadding="0" cellspacing="0">'.
'<form name="formMessage" action="message.php" method="post">'.
'<tr><td>' . _SENDMESSAGETO ;
 
echo '<select name="to_user">';
for($inx = 0; $inx < sizeof($users); $inx++)
{
echo '<option>'.$users[$inx].'</option>';
}
echo '</select>';
echo '<input type="Submit" value="' . _COMPOSE .'">';
echo '</td></tr></form></table></div>';
}
 
// ***************************************************************************
// ***************************************************************************
// Removes HTML from Messages
function check_html ($str, $strip="")
{
/* The core of this code has been lifted from phpslash */
/* which is licenced under the GPL. */
if ($strip == "nohtml")
{
$AllowableHTML=array('');
}
$str = stripslashes($str);
$str = eregi_replace("<[[:space:]]*([^>]*)[[:space:]]*>",'<\\1>', $str);
// Delete all spaces from html tags .
$str = eregi_replace("<a[^>]*href[[:space:]]*=[[:space:]]*\"?[[:space:]]*([^\" >]*)[[:space:]]*\"?[^>]*>",'<a href="\\1">', $str);
// Delete all attribs from Anchor, except an href, double quoted.
$str = eregi_replace("<[[:space:]]* img[[:space:]]*([^>]*)[[:space:]]*>", '', $str);
// Delete all img tags
$str = eregi_replace("<a[^>]*href[[:space:]]*=[[:space:]]*\"?javascript[[:punct:]]*\"?[^>]*>", '', $str);
// Delete javascript code from a href tags -- Zhen-Xjell @ http://nukecops.com
$tmp = "";
 
while (ereg("<(/?[[:alpha:]]*)[[:space:]]*([^>]*)>",$str,$reg))
{
$i = strpos($str,$reg[0]);
$l = strlen($reg[0]);
if ($reg[1][0] == "/")
{
$tag = strtolower(substr($reg[1],1));
}
else
{
$tag = strtolower($reg[1]);
}
if ($a = $AllowableHTML[$tag])
{
if ($reg[1][0] == "/")
{
$tag = "</$tag>";
}
elseif (($a == 1) || ($reg[2] == ""))
{
$tag = "<$tag>";
}
else
{
# Place here the double quote fix function.
$attrb_list=delQuotes($reg[2]);
// A VER
$attrb_list = ereg_replace("&","&amp;",$attrb_list);
$tag = "<$tag" . $attrb_list . ">";
} # Attribs in tag allowed
}
else
{
$tag = "";
}
$tmp .= substr($str,0,$i) . $tag;
$str = substr($str,$i+$l);
}
$str = $tmp . $str;
return $str;
}
 
 
// ***************************************************************************
// ***************************************************************************
// Checks for the location of the torrents
// If it does not exist, then it creates it.
function checkTorrentPath()
{
global $cfg;
// is there a stat and torrent dir?
if (!@is_dir($cfg["torrent_file_path"]) && is_writable($cfg["path"]))
{
//Then create it
@mkdir($cfg["torrent_file_path"], 0777);
}
}
 
// ***************************************************************************
// ***************************************************************************
// Returns the drive space used as a percentage i.e 85 or 95
function getDriveSpace($drive)
{
$percent = 0;
 
if (is_dir($drive))
{
$dt = disk_total_space($drive);
$df = disk_free_space($drive);
 
$percent = round((($dt - $df)/$dt) * 100);
}
return $percent;
}
 
// ***************************************************************************
// ***************************************************************************
// Display the Drive Space Graphical Bar
function displayDriveSpaceBar($drivespace)
{
global $cfg;
$freeSpace = "";
 
if ($drivespace > 20)
{
$freeSpace = " (".formatFreeSpace($cfg["free_space"])." Free)";
}
?>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr nowrap>
<td width="2%"><div class="tiny"><?php echo _STORAGE ?>:</div></td>
<td width="80%">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td background="themes/<?php echo $cfg["theme"] ?>/images/proglass.gif" width="<?php echo $drivespace ?>%"><div class="tinypercent" align="center"><?php echo $drivespace."%".$freeSpace ?></div></td>
<td background="themes/<?php echo $cfg["theme"] ?>/images/noglass.gif" width="<?php echo (100 - $drivespace) ?>%"><img src="images/blank.gif" width="1" height="3" border="0"></td>
</tr>
</table>
</td>
</tr>
</table>
<?php
}
 
// ***************************************************************************
// ***************************************************************************
// Convert free space to GB or MB depending on size
function formatFreeSpace($freeSpace)
{
$rtnValue = "";
if ($freeSpace > 1024)
{
$rtnValue = number_format($freeSpace/1024, 2)." GB";
}
else
{
$rtnValue = number_format($freeSpace, 2)." MB";
}
 
return $rtnValue;
}
 
//**************************************************************************
// getFileFilter()
// Returns a string used as a file filter.
// Takes in an array of file types.
function getFileFilter($inArray)
{
$filter = "(\.".strtolower($inArray[0]).")|"; // used to hold the file type filter
$filter .= "(\.".strtoupper($inArray[0]).")";
// Build the file filter
for($inx = 1; $inx < sizeof($inArray); $inx++)
{
$filter .= "|(\.".strtolower($inArray[$inx]).")";
$filter .= "|(\.".strtoupper($inArray[$inx]).")";
}
$filter .= "$";
return $filter;
}
 
 
//**************************************************************************
// getAliasName()
// Create Alias name for Text file and Screen Alias
function getAliasName($inName)
{
$replaceItems = array(" ", ".", "-", "[", "]", "(", ")", "#", "&", "@");
$alias = str_replace($replaceItems, "_", $inName);
$alias = strtolower($alias);
$alias = str_replace("_torrent", "", $alias);
 
return $alias;
}
 
 
//**************************************************************************
// cleanFileName()
// Remove bad characters that cause problems
function cleanFileName($inName)
{
$replaceItems = array("?", "&", "'", "\"", "+", "@");
$cleanName = str_replace($replaceItems, "", $inName);
$cleanName = ltrim($cleanName, "-");
$cleanName = preg_replace("/[^0-9a-z.]+/i",'_', $cleanName);
return $cleanName;
}
 
//**************************************************************************
// usingTornado()
// returns true if client is tornado
function usingTornado()
{
global $cfg;
$rtnValue = false;
if (preg_match("/btphptornado/i", $cfg["btphpbin"]))
{
$rtnValue = true;
}
 
return $rtnValue;
}
 
//**************************************************************************
// cleanURL()
// split on the "*" coming from Varchar URL
function cleanURL($url)
{
$rtnValue = $url;
$arURL = explode("*", $url);
 
if (sizeof($arURL) > 1)
{
$rtnValue = $arURL[1];
}
 
return $rtnValue;
}
 
// -------------------------------------------------------------------
// FetchTorrent() method to get data from URL
// Has support for specific sites
// -------------------------------------------------------------------
function FetchTorrent($url)
{
global $cfg, $db;
ini_set("allow_url_fopen", "1");
ini_set("user_agent", $_SERVER["HTTP_USER_AGENT"]);
 
$domain = parse_url( $url );
 
if( strtolower( substr( $domain["path"], -8 ) ) != ".torrent" )
{
// Check know domain types
if( strpos( strtolower ( $domain["host"] ), "mininova" ) !== false )
{
// Sample (http://www.mininova.org/rss.xml):
// http://www.mininova.org/tor/2254847
// <a href="/get/2281554">FreeLinux.ISO.iso.torrent</a>
 
// If received a /tor/ get the required information
if( strpos( $url, "/tor/" ) !== false )
{
// Get the contents of the /tor/ to find the real torrent name
$html = FetchHTML( $url );
 
// Check for the tag used on mininova.org
if( preg_match( "/<a href=\"\/get\/[0-9].[^\"]+\">(.[^<]+)<\/a>/i", $html, $html_preg_match ) )
{
// This is the real torrent filename
$cfg["save_torrent_name"] = $html_preg_match[1];
}
 
// Change to GET torrent url
$url = str_replace( "/tor/", "/get/", $url );
}
 
// Now fetch the torrent file
$html = FetchHTML( $url );
 
// This usually gets triggered if the original URL was /get/ instead of /tor/
if( strlen( $cfg["save_torrent_name"] ) == 0 )
{
// Get the name of the torrent, and make it the filename
if( preg_match( "/name([0-9][^:]):(.[^:]+)/i", $html, $html_preg_match ) )
{
$filelength = $html_preg_match[1];
$filename = $html_preg_match[2];
$cfg["save_torrent_name"] = substr( $filename, 0, $filelength ) . ".torrent";
}
}
 
// Make sure we have a torrent file
if( strpos( $html, "d8:" ) === false )
{
// We don't have a Torrent File... it is something else
AuditAction( $cfg["constants"]["error"], "BAD TORRENT for: " . $url . "\n" . $html );
$html = "";
}
 
return $html;
}
elseif( strpos( strtolower ( $domain["host"] ), "isohunt" ) !== false )
{
// Sample (http://isohunt.com/js/rss.php):
// http://isohunt.com/download.php?mode=bt&id=8837938
// http://isohunt.com/btDetails.php?ihq=&id=8464972
$referer = "http://" . $domain["host"] . "/btDetails.php?id=";
 
// If the url points to the details page, change it to the download url
if( strpos( strtolower( $url ), "/btdetails.php?" ) !== false )
{
$url = str_replace( "/btDetails.php?", "/download.php?", $url ) . "&mode=bt"; // Need to make it grab the torrent
}
 
// Grab contents of details page
$html = FetchHTML( $url, $referer );
 
// Get the name of the torrent, and make it the filename
if( preg_match( "/name([0-9][^:]):(.[^:]+)/i", $html, $html_preg_match ) )
{
$filelength = $html_preg_match[1];
$filename = $html_preg_match[2];
$cfg["save_torrent_name"] = substr( $filename, 0, $filelength ) . ".torrent";
}
 
// Make sure we have a torrent file
if( strpos( $html, "d8:" ) === false )
{
// We don't have a Torrent File... it is something else
AuditAction( $cfg["constants"]["error"], "BAD TORRENT for: " . $url . "\n" . $html );
$html = "";
}
 
return $html;
}
elseif( strpos( strtolower( $url ), "details.php?" ) !== false )
{
// Sample (http://www.bitmetv.org/rss.php?passkey=123456):
// http://www.bitmetv.org/details.php?id=18435&hit=1
$referer = "http://" . $domain["host"] . "/details.php?id=";
 
$html = FetchHTML( $url, $referer );
 
// Sample (http://www.bitmetv.org/details.php?id=18435)
// download.php/18435/SpiderMan%20Season%204.torrent
if( preg_match( "/(download.php.[^\"]+)/i", $html, $html_preg_match ) )
{
$torrent = str_replace( " ", "%20", substr( $html_preg_match[0], 0, -1 ) );
$url2 = "http://" . $domain["host"] . "/" . $torrent;
$html2 = FetchHTML( $url2 );
 
// Make sure we have a torrent file
if (strpos($html2, "d8:") === false)
{
// We don't have a Torrent File... it is something else
AuditAction($cfg["constants"]["error"], "BAD TORRENT for: ".$url."\n".$html2);
$html2 = "";
}
return $html2;
}
else
{
return "";
}
}
elseif( strpos( strtolower( $url ), "download.asp?" ) !== false )
{
// Sample (TF's TorrenySpy Search):
// http://www.torrentspy.com/download.asp?id=519793
$referer = "http://" . $domain["host"] . "/download.asp?id=";
 
$html = FetchHTML( $url, $referer );
 
// Get the name of the torrent, and make it the filename
if( preg_match( "/name([0-9][^:]):(.[^:]+)/i", $html, $html_preg_match ) )
{
$filelength = $html_preg_match[1];
$filename = $html_preg_match[2];
$cfg["save_torrent_name"] = substr( $filename, 0, $filelength ) . ".torrent";
}
 
if( !empty( $html ) )
{
// Make sure we have a torrent file
if( strpos( $html, "d8:" ) === false )
{
// We don't have a Torrent File... it is something else
AuditAction( $cfg["constants"]["error"], "BAD TORRENT for: " . $url . "\n" . $html );
$html = "";
}
return $html;
}
else
{
return "";
}
}
}
 
$html = FetchHTML( $url );
// Make sure we have a torrent file
if( strpos( $html, "d8:" ) === false )
{
// We don't have a Torrent File... it is something else
AuditAction( $cfg["constants"]["error"], "BAD TORRENT for: " . $url. "\n" . $html );
$html = "";
}
else
{
// Get the name of the torrent, and make it the filename
if( preg_match( "/name([0-9][^:]):(.[^:]+)/i", $html, $html_preg_match ) )
{
$filelength = $html_preg_match[1];
$filename = $html_preg_match[2];
$cfg["save_torrent_name"] = substr( $filename, 0, $filelength ) . ".torrent";
}
}
 
return $html;
}
 
// -------------------------------------------------------------------
// FetchHTML() method to get data from URL -- uses timeout and user agent
// -------------------------------------------------------------------
function FetchHTML( $url, $referer = "" )
{
global $cfg, $db;
ini_set("allow_url_fopen", "1");
ini_set("user_agent", $_SERVER["HTTP_USER_AGENT"]);
 
//$url = cleanURL( $url );
$domain = parse_url( $url );
$getcmd = $domain["path"];
 
if(!array_key_exists("query", $domain))
{
$domain["query"] = "";
}
 
$getcmd .= ( !empty( $domain["query"] ) ) ? "?" . $domain["query"] : "";
 
$cookie = "";
$rtnValue = "";
 
// If the url already doesn't contain a passkey, then check
// to see if it has cookies set to the domain name.
if( ( strpos( $domain["query"], "passkey=" ) ) === false )
{
$sql = "SELECT c.data FROM tf_cookies AS c LEFT JOIN tf_users AS u ON ( u.uid = c.uid ) WHERE u.user_id = '" . $cfg["user"] . "' AND c.host = '" . $domain['host'] . "'";
$cookie = $db->GetOne( $sql );
showError( $db, $sql );
}
 
if( !array_key_exists("port", $domain) )
{
$domain["port"] = 80;
}
 
// Check to see if this site requires the use of cookies
if( !empty( $cookie ) )
{
$socket = @fsockopen( $domain["host"], $domain["port"], $errno, $errstr, 30 ); //connect to server
 
if( !empty( $socket ) )
{
// Write the outgoing header packet
// Using required cookie information
$packet = "GET " . $url . "\r\n";
$packet .= ( !empty( $referer ) ) ? "Referer: " . $referer . "\r\n" : "";
$packet .= "Accept: */*\r\n";
$packet .= "Accept-Language: en-us\r\n";
$packet .= "User-Agent: ".$_SERVER["HTTP_USER_AGENT"]."\r\n";
$packet .= "Host: " . $_SERVER["SERVER_NAME"] . "\r\n";
$packet .= "Connection: Close\r\n";
$packet .= "Cookie: " . $cookie . "\r\n\r\n";
 
// Send header packet information to server
@fputs( $socket, $packet );
 
// Initialize variable, make sure null until we add too it.
$rtnValue = null;
 
// If http 1.0 just take it all as 1 chunk (Much easier, but for old servers)
while( !@feof( $socket ) )
{
$rtnValue .= @fgets( $socket, 500000 );
}
 
@fclose( $socket ); // Close our connection
}
}
else
{
if( $fp = @fopen( $url, 'r' ) )
{
$rtnValue = "";
while( !@feof( $fp ) )
{
$rtnValue .= @fgets( $fp, 4096 );
}
@fclose( $fp );
}
}
 
// If the HTML is still empty, then try CURL
if (($rtnValue == "" && function_exists("curl_init")) || (strpos($rtnValue, "HTTP/1.1 302") > 0 && function_exists("curl_init")))
{
// Give CURL a Try
$ch = curl_init();
if ($cookie != "")
{
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
curl_setopt($ch, CURLOPT_PORT, $domain["port"]);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, TRUE);
 
$response = curl_exec($ch);
 
curl_close($ch);
 
$rtnValue = substr($response, strpos($response, "d8:"));
$rtnValue = rtrim($rtnValue, "\r\n");
}
 
return $rtnValue;
}
 
//**************************************************************************
// getDownloadSize()
// Grab the full size of the download from the torrent metafile
function getDownloadSize($torrent)
{
$rtnValue = "";
if (file_exists($torrent))
{
include_once("BDecode.php");
$fd = fopen($torrent, "rd");
$alltorrent = fread($fd, filesize($torrent));
$array = BDecode($alltorrent);
fclose($fd);
$rtnValue = $array["info"]["piece length"] * (strlen($array["info"]["pieces"]) / 20);
}
return $rtnValue;
}
 
//**************************************************************************
// formatBytesToKBMGGB()
// Returns a string in format of GB, MB, or KB depending on the size for display
function formatBytesToKBMGGB($inBytes)
{
$rsize = "";
if ($inBytes > (1024 * 1024 * 1024))
{
$rsize = round($inBytes / (1024 * 1024 * 1024), 2) . " GB";
}
elseif ($inBytes < 1024 * 1024)
{
$rsize = round($inBytes / 1024, 1) . " KB";
}
else
{
$rsize = round($inBytes / (1024 * 1024), 1) . " MB";
}
return $rsize;
}
 
//**************************************************************************
// HealthData
// Stores the image and title of for the health of a file.
class HealthData
{
var $image = "";
var $title = "";
}
 
//**************************************************************************
// getStatusImage() Takes in an AliasFile object
// Returns a string "file name" of the status image icon
function getStatusImage($af)
{
$hd = new HealthData();
$hd->image = "black.gif";
$hd->title = "";
 
if ($af->running == "1")
{
// torrent is running
if ($af->seeds < 2)
{
$hd->image = "yellow.gif";
}
if ($af->seeds == 0)
{
$hd->image = "red.gif";
}
if ($af->seeds >= 2)
{
$hd->image = "green.gif";
}
}
if ($af->percent_done >= 100)
{
if(trim($af->up_speed) != "" && $af->running == "1")
{
// is seeding
$hd->image = "green.gif";
} else {
// the torrent is finished
$hd->image = "black.gif";
}
}
 
if ($hd->image != "black.gif")
{
$hd->title = "S:".$af->seeds." P:".$af->peers." ";
}
 
if ($af->running == "3")
{
// torrent is queued
$hd->image = "black.gif";
}
 
return $hd;
}
 
//**************************************************************************
function writeQinfo($fileName,$command)
{
$fp = fopen($fileName.".Qinfo","w");
fwrite($fp, $command);
fflush($fp);
fclose($fp);
}
 
//**************************************************************************
class ProcessInfo
{
var $pid = "";
var $ppid = "";
var $cmdline = "";
 
function ProcessInfo($psLine)
{
$psLine = trim($psLine);
if (strlen($psLine) > 12)
{
$this->pid = trim(substr($psLine, 0, 5));
$this->ppid = trim(substr($psLine, 5, 6));
$this->cmdline = trim(substr($psLine, 12));
}
}
}
 
//**************************************************************************
function runPS()
{
global $cfg;
 
return shell_exec("ps x -o pid='' -o ppid='' -o command='' -ww | grep btphptornado | grep ".$cfg["torrent_file_path"]." | grep -v grep");
}
 
//**************************************************************************
function RunningProcessInfo()
{
global $cfg;
 
if (IsAdmin())
{
include_once("RunningTorrent.php");
 
$screenStatus = runPS();
 
$arScreen = array();
$tok = strtok($screenStatus, "\n");
while ($tok)
{
array_push($arScreen, $tok);
$tok = strtok("\n");
}
 
$cProcess = array();
$cpProcess = array();
$pProcess = array();
$ProcessCmd = array();
 
$QLine = "";
for($i = 0; $i < sizeof($arScreen); $i++)
{
if(strpos($arScreen[$i], $cfg["tfQManager"]) > 0)
{
$pinfo = new ProcessInfo($arScreen[$i]);
$QLine = $pinfo->pid;
}
else
{
if(strpos($arScreen[$i], "btphptornado.py") !== false)
{
$pinfo = new ProcessInfo($arScreen[$i]);
 
if (intval($pinfo->ppid) == 1)
{
if(!strpos($pinfo->cmdline, "rep python") > 0)
{
if(!strpos($pinfo->cmdline, "ps x") > 0)
{
array_push($pProcess,$pinfo->pid);
$rt = new RunningTorrent($pinfo->pid . " " . $pinfo->cmdline);
//array_push($ProcessCmd,$pinfo->cmdline);
array_push($ProcessCmd,$rt->torrentOwner . "\t". str_replace(array(".stat"),"",$rt->statFile));
}
}
}
else
{
if(!strpos($pinfo->cmdline, "rep python") > 0)
{
if(!strpos($pinfo->cmdline, "ps x") > 0)
{
array_push($cProcess,$pinfo->pid);
array_push($cpProcess,$pinfo->ppid);
}
}
}
}
}
}
echo " --- Running Processes ---\n";
echo " Parents : " . count($pProcess) . "\n";
echo " Children : " . count($cProcess) . "\n";
echo "\n";
 
echo " PID \tOwner\tTorrent File\n";
foreach($pProcess as $key => $value)
{
echo " " . $value . "\t" . $ProcessCmd[$key] . "\n";
foreach($cpProcess as $cKey => $cValue)
if (intval($value) == intval($cValue))
echo "\t" . $cProcess[$cKey] . "\n";
}
echo "\n";
echo " --- QManager --- \n";
echo " PID : ";
echo " ".$QLine;
}
}
 
//**************************************************************************
function getNumberOfQueuedTorrents()
{
global $cfg;
 
$rtnValue = 0;
 
$dirName = $cfg["torrent_file_path"] . "queue/";
 
$handle = @opendir($dirName);
 
if ($handle)
{
while($entry = readdir($handle))
{
if ($entry != "." && $entry != "..")
{
if (!(@is_dir($dirName.$entry)) && (substr($entry, -6) == ".Qinfo"))
{
$rtnValue = $rtnValue + 1;
}
}
}
}
 
return $rtnValue;
}
 
//**************************************************************************
function getRunningTorrentCount()
{
return count(getRunningTorrents());
}
 
//**************************************************************************
function getRunningTorrents()
{
 
global $cfg;
 
$screenStatus = runPS();
 
$arScreen = array();
$tok = strtok($screenStatus, "\n");
while ($tok)
{
array_push($arScreen, $tok);
$tok = strtok("\n");
}
 
$artorrent = array();
 
for($i = 0; $i < sizeof($arScreen); $i++)
{
if(! strpos($arScreen[$i], $cfg["tfQManager"]) > 0)
{
if(strpos($arScreen[$i], "btphptornado.py") !== false)
{
$pinfo = new ProcessInfo($arScreen[$i]);
 
if (intval($pinfo->ppid) == 1)
{
if(!strpos($pinfo->cmdline, "rep python") > 0)
{
if(!strpos($pinfo->cmdline, "ps x") > 0)
{
array_push($artorrent,$pinfo->pid . " " . $pinfo->cmdline);
}
}
}
}
}
}
 
return $artorrent;
}
 
//**************************************************************************
function checkQManager()
{
$x = getQManagerPID();
if (strlen($x) > 0)
{
$y = $x;
$arScreen = array();
$tok = strtok(shell_exec("ps -p " . $x . " | grep " . $y), "\n");
 
while ($tok)
{
array_push($arScreen, $tok);
$tok = strtok("\n");
}
 
$QMgrCount = sizeOf($arScreen);
}
else
{
$QMgrCount = 0;
}
 
return $QMgrCount;
}
 
//**************************************************************************
function getQManagerPID()
{
global $cfg;
 
$rtnValue = "";
 
$pidFile = $cfg["torrent_file_path"] . "queue/tfQManager.pid";
 
if(file_exists($pidFile))
{
$fp = fopen($pidFile,"r");
if ($fp)
{
while (!feof($fp))
{
$tmpValue = fread($fp,1);
if($tmpValue != "\n")
$rtnValue .= $tmpValue;
}
fclose($fp);
}
}
return $rtnValue;
}
 
//**************************************************************************
function startQManager($maxServerThreads=5,$maxUserThreads=2,$sleepInterval=10)
{
global $cfg;
 
// is there a stat and torrent dir?
if (is_dir($cfg["torrent_file_path"]))
{
if (is_writable($cfg["torrent_file_path"]) && !is_dir($cfg["torrent_file_path"]."queue/"))
{
//Then create it
mkdir($cfg["torrent_file_path"]."queue/", 0777);
}
}
 
if (checkQManager() == 0)
{
$cmd1 = "cd " . $cfg["path"] . "TFQUSERNAME";
 
if (! array_key_exists("pythonCmd",$cfg))
{
insertSetting("pythonCmd","/usr/bin/python");
}
 
if (! array_key_exists("debugTorrents",$cfg))
{
insertSetting("debugTorrents",false);
}
 
if (!$cfg["debugTorrents"])
{
$pyCmd = $cfg["pythonCmd"] . " -OO";
}
else
{
$pyCmd = $cfg["pythonCmd"];
}
 
$btphp = "'" . $cmd1. "; HOME=".$cfg["path"]."; export HOME; nohup " . $pyCmd . " " .$cfg["btphpbin"] . " '";
$command = $pyCmd . " " . $cfg["tfQManager"] . " ".$cfg["torrent_file_path"]."queue/ ".$maxServerThreads." ".$maxUserThreads." ".$sleepInterval." ".$btphp." > /dev/null &";
//$command = $pyCmd . " " . $cfg["tfQManager"] . " ".$cfg["torrent_file_path"]."queue/ ".$maxServerThreads." ".$maxUserThreads." ".$sleepInterval." ".$btphp." > /dev/null2>&1 & &";
 
$result = exec($command);
 
sleep(2); // wait for it to start prior to getting pid
 
AuditAction($cfg["constants"]["QManager"], "Started PID:" . getQManagerPID());
 
}else{
AuditAction($cfg["constants"]["QManager"], "QManager Already Started PID:" . getQManagerPID());
}
}
 
//**************************************************************************
function stopQManager()
{
global $cfg;
 
$QmgrPID = getQManagerPID();
if($QmgrPID != "")
{
AuditAction($cfg["constants"]["QManager"], "Stopping PID:" . $QmgrPID);
$result = exec("kill ".$QmgrPID);
unlink($cfg["torrent_file_path"] . "queue/tfQManager.pid");
}
}
 
//**************************************************************************
// file_size()
// Returns file size... overcomes PHP limit of 2.0GB
function file_size($file)
{
$size = @filesize($file);
if ( $size == 0)
{
$size = exec("ls -l \"".$file."\" | awk '{print $5}'");
}
return $size;
}
 
//**************************************************************************
// getDirList()
// This method Builds and displays the Torrent Section of the Index Page
function getDirList($dirName)
{
global $cfg, $db;
include_once("AliasFile.php");
 
include_once("RunningTorrent.php");
$runningTorrents = getRunningTorrents();
 
$arList = array();
$file_filter = getFileFilter($cfg["file_types_array"]);
 
if (is_dir($dirName))
{
$handle = opendir($dirName);
}
else
{
// nothing to read
if (IsAdmin())
{
echo "<b>ERROR:</b> ".$dirName." Path is not valid. Please edit <a href='admin.php?op=configSettings'>settings</a><br>";
}
else
{
echo "<b>ERROR:</b> Contact an admin the Path is not valid.<br>";
}
return;
}
 
$lastUser = "";
$arUserTorrent = array();
$arListTorrent = array();
 
while($entry = readdir($handle))
{
if ($entry != "." && $entry != "..")
{
if (is_dir($dirName."/".$entry))
{
// don''t do a thing
}
else
{
if (ereg($file_filter, $entry))
{
$key = filemtime($dirName."/".$entry).md5($entry);
$arList[$key] = $entry;
}
}
}
}
 
// sort the files by date
krsort($arList);
 
foreach($arList as $entry)
{
$output = "";
$displayname = $entry;
$show_run = true;
$torrentowner = getOwner($entry);
$owner = IsOwner($cfg["user"], $torrentowner);
$kill_id = "";
$estTime = "&nbsp;";
$alias = getAliasName($entry).".stat";
$af = new AliasFile($dirName.$alias, $torrentowner);
$timeStarted = "";
$torrentfilelink = "";
 
if(!file_exists($dirName.$alias))
{
$af->running = "2"; // file is new
$af->size = getDownloadSize($dirName.$entry);
$af->WriteFile();
}
 
if(strlen($entry) >= 47)
{
// needs to be trimmed
$displayname = substr($entry, 0, 44);
$displayname .= "...";
}
 
// find out if any screens are running and take their PID and make a KILL option
foreach ($runningTorrents as $key => $value)
{
$rt = new RunningTorrent($value);
if ($rt->statFile == $alias) {
if ($kill_id == "")
{
$kill_id = $rt->processId;
}
else
{
// there is more than one PID for this torrent
// Add it so it can be killed as well.
$kill_id .= "|".$rt->processId;
}
}
}
 
// Check to see if we have a pid without a process.
if (is_file($cfg["torrent_file_path"].$alias.".pid") && empty($kill_id))
{
// died outside of tf and pid still exists.
@unlink($cfg["torrent_file_path"].$alias.".pid");
 
if(($af->percent_done < 100) && ($af->percent_done >= 0))
{
// The file is not running and the percent done needs to be changed
$af->percent_done = ($af->percent_done+100)*-1;
}
 
$af->running = "0";
$af->time_left = "Torrent Died";
$af->up_speed = "";
$af->down_speed = "";
// write over the status file so that we can display a new status
$af->WriteFile();
}
 
if ($cfg["enable_torrent_download"])
{
$torrentfilelink = "<a href=\"maketorrent.php?download=".urlencode($entry)."\"><img src=\"images/down.gif\" width=9 height=9 title=\"Download Torrent File\" border=0 align=\"absmiddle\"></a>";
}
 
$hd = getStatusImage($af);
 
$output .= "<tr><td class=\"tiny\"><img src=\"images/".$hd->image."\" width=16 height=16 title=\"".$hd->title.$entry."\" border=0 align=\"absmiddle\">".$torrentfilelink.$displayname."</td>";
$output .= "<td align=\"right\"><font class=\"tiny\">".formatBytesToKBMGGB($af->size)."</font></td>";
$output .= "<td align=\"center\"><a href=\"message.php?to_user=".$torrentowner."\"><font class=\"tiny\">".$torrentowner."</font></a></td>";
$output .= "<td valign=\"bottom\"><div align=\"center\">";
 
if ($af->running == "2")
{
$output .= "<i><font color=\"#32cd32\">"._NEW."</font></i>";
}
elseif ($af->running == "3" )
{
$estTime = "Waiting...";
$qDateTime = '';
if(is_file($dirName."queue/".$alias.".Qinfo"))
{
$qDateTime = date("m/d/Y H:i:s", strval(filectime($dirName."queue/".$alias.".Qinfo")));
}
 
$output .= "<i><font color=\"#000000\" onmouseover=\"return overlib('"._QUEUED.": ".$qDateTime."<br>', CSSCLASS);\" onmouseout=\"return nd();\">"._QUEUED."</font></i>";
}
else
{
if ($af->time_left != "" && $af->time_left != "0")
{
$estTime = $af->time_left;
}
 
$sql_search_time = "Select time from tf_log where action like '%Upload' and file like '".$entry."%'";
$result_search_time = $db->Execute($sql_search_time);
list($uploaddate) = $result_search_time->FetchRow();
 
$lastUser = $torrentowner;
$sharing = $af->sharing."%";
$graph_width = 1;
$progress_color = "#00ff00";
$background = "#000000";
$bar_width = "4";
$popup_msg = _ESTIMATEDTIME.": ".$af->time_left;
$popup_msg .= "<br>"._DOWNLOADSPEED.": ".$af->down_speed;
$popup_msg .= "<br>"._UPLOADSPEED.": ".$af->up_speed;
$popup_msg .= "<br>"._SHARING.": ".$sharing;
$popup_msg .= "<br>Seeds: ".$af->seeds;
$popup_msg .= "<br>Peers: ".$af->peers;
$popup_msg .= "<br>"._USER.": ".$torrentowner;
 
$eCount = 0;
foreach ($af->errors as $key => $value)
{
if(strpos($value," (x"))
{
$curEMsg = substr($value,strpos($value," (x")+3);
$eCount += substr($curEMsg,0,strpos($curEMsg,")"));
}
else
{
$eCount += 1;
}
}
$popup_msg .= "<br>"._ERRORSREPORTED.": ".strval($eCount);
 
$popup_msg .= "<br>"._UPLOADED.": ".date("m/d/Y H:i:s", $uploaddate);
 
if (is_file($dirName.$alias.".pid"))
{
$timeStarted = "<br>"._STARTED.": ".date("m/d/Y H:i:s", strval(filectime($dirName.$alias.".pid")));
}
 
// incriment the totals
if(!isset($cfg["total_upload"])) $cfg["total_upload"] = 0;
if(!isset($cfg["total_download"])) $cfg["total_download"] = 0;
 
$cfg["total_upload"] = $cfg["total_upload"] + GetSpeedValue($af->up_speed);
$cfg["total_download"] = $cfg["total_download"] + GetSpeedValue($af->down_speed);
 
if($af->percent_done >= 100)
{
if(trim($af->up_speed) != "" && $af->running == "1")
{
$popup_msg .= $timeStarted;
$output .= "<a href=\"JavaScript:ShowDetails('downloaddetails.php?alias=".$alias."&torrent=".urlencode($entry)."')\" style=\"font-size:7pt;\" onmouseover=\"return overlib('".$popup_msg."<br>', CSSCLASS);\" onmouseout=\"return nd();\">seeding (".$af->up_speed.") ".$sharing."</a>";
}
else
{
$popup_msg .= "<br>"._ENDED.": ".date("m/d/Y H:i:s", strval(filemtime($dirName.$alias)));
$output .= "<a href=\"JavaScript:ShowDetails('downloaddetails.php?alias=".$alias."&torrent=".urlencode($entry)."')\" onmouseover=\"return overlib('".$popup_msg."<br>', CSSCLASS);\" onmouseout=\"return nd();\"><i><font color=red>"._DONE."</font></i></a>";
}
$show_run = false;
}
else if ($af->percent_done < 0)
{
$popup_msg .= $timeStarted;
$output .= "<a href=\"JavaScript:ShowDetails('downloaddetails.php?alias=".$alias."&torrent=".urlencode($entry)."')\" onmouseover=\"return overlib('".$popup_msg."<br>', CSSCLASS);\" onmouseout=\"return nd();\"><i><font color=\"#989898\">"._INCOMPLETE."</font></i></a>";
$show_run = true;
}
else
{
$popup_msg .= $timeStarted;
 
if($af->percent_done > 1)
{
$graph_width = $af->percent_done;
}
if($graph_width == 100)
{
$background = $progress_color;
}
$output .= "<a href=\"JavaScript:ShowDetails('downloaddetails.php?alias=".$alias."&torrent=".urlencode($entry)."')\" onmouseover=\"return overlib('".$popup_msg."<br>', CSSCLASS);\" onmouseout=\"return nd();\">";
$output .= "<font class=\"tiny\"><strong>".$af->percent_done."%</strong> @ ".$af->down_speed."</font></a><br>";
$output .= "<table width=\"100\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
$output .= "<tr><td background=\"themes/".$cfg["theme"]."/images/progressbar.gif\" bgcolor=\"".$progress_color."\"><img src=\"images/blank.gif\" width=\"".$graph_width."\" height=\"".$bar_width."\" border=\"0\"></td>";
$output .= "<td bgcolor=\"".$background."\"><img src=\"images/blank.gif\" width=\"".(100 - $graph_width)."\" height=\"".$bar_width."\" border=\"0\"></td>";
$output .= "</tr></table>";
}
 
}
 
$output .= "</div></td>";
$output .= "<td><div class=\"tiny\" align=\"center\">".$estTime."</div></td>";
$output .= "<td><div align=center>";
 
$torrentDetails = _TORRENTDETAILS;
if ($lastUser != "")
{
$torrentDetails .= "\n"._USER.": ".$lastUser;
}
 
$output .= "<a href=\"details.php?torrent=".urlencode($entry);
if($af->running == 1)
{
$output .= "&als=false";
}
$output .= "\"><img src=\"images/properties.png\" width=18 height=13 title=\"".$torrentDetails."\" border=0></a>";
 
if ($owner || IsAdmin($cfg["user"]))
{
if($kill_id != "" && $af->percent_done >= 0 && $af->running == 1)
{
$output .= "<a href=\"index.php?alias_file=".$alias."&kill=".$kill_id."&kill_torrent=".urlencode($entry)."\"><img src=\"images/kill.gif\" width=16 height=16 title=\""._STOPDOWNLOAD."\" border=0></a>";
$output .= "<img src=\"images/delete_off.gif\" width=16 height=16 border=0>";
}
else
{
if($torrentowner == "n/a")
{
$output .= "<img src=\"images/run_off.gif\" width=16 height=16 border=0 title=\""._NOTOWNER."\">";
}
else
{
if ($af->running == "3")
{
$output .= "<a href=\"index.php?alias_file=".$alias."&dQueue=".$kill_id."&QEntry=".urlencode($entry)."\"><img src=\"images/queued.gif\" width=16 height=16 title=\""._DELQUEUE."\" border=0></a>";
}
else
{
if (!is_file($cfg["torrent_file_path"].$alias.".pid"))
{
// Allow Avanced start popup?
if ($cfg["advanced_start"])
{
if($show_run)
{
$output .= "<a href=\"#\" onclick=\"StartTorrent('startpop.php?torrent=".urlencode($entry)."')\"><img src=\"images/run_on.gif\" width=16 height=16 title=\""._RUNTORRENT."\" border=0></a>";
}
else
{
$output .= "<a href=\"#\" onclick=\"StartTorrent('startpop.php?torrent=".urlencode($entry)."')\"><img src=\"images/seed_on.gif\" width=16 height=16 title=\""._SEEDTORRENT."\" border=0></a>";
}
}
else
{
// Quick Start
if($show_run)
{
$output .= "<a href=\"".$_SERVER['PHP_SELF']."?torrent=".urlencode($entry)."\"><img src=\"images/run_on.gif\" width=16 height=16 title=\""._RUNTORRENT."\" border=0></a>";
}
else
{
$output .= "<a href=\"".$_SERVER['PHP_SELF']."?torrent=".urlencode($entry)."\"><img src=\"images/seed_on.gif\" width=16 height=16 title=\""._SEEDTORRENT."\" border=0></a>";
}
}
}
else
{
// pid file exists so this may still be running or dieing.
$output .= "<img src=\"images/run_off.gif\" width=16 height=16 border=0 title=\""._STOPPING."\">";
}
}
}
 
if (!is_file($cfg["torrent_file_path"].$alias.".pid"))
{
$deletelink = $_SERVER['PHP_SELF']."?alias_file=".$alias."&delfile=".urlencode($entry);
$output .= "<a href=\"".$deletelink."\" onclick=\"return ConfirmDelete('".$entry."')\"><img src=\"images/delete_on.gif\" width=16 height=16 title=\""._DELETE."\" border=0></a>";
}
else
{
// pid file present so process may be still running. don't allow deletion.
$output .= "<img src=\"images/delete_off.gif\" width=16 height=16 title=\""._STOPPING."\" border=0>";
}
}
}
else
{
$output .= "<img src=\"images/locked.gif\" width=16 height=16 border=0 title=\""._NOTOWNER."\">";
$output .= "<img src=\"images/locked.gif\" width=16 height=16 border=0 title=\""._NOTOWNER."\">";
}
$output .= "</div>";
 
$output .= "</td>";
$output .= "</tr>\n";
 
// Is this torrent for the user list or the general list?
if ($cfg["user"] == getOwner($entry))
{
array_push($arUserTorrent, $output);
}
else
{
array_push($arListTorrent, $output);
}
}
closedir($handle);
 
// Now spit out the junk
echo "<table bgcolor=\"".$cfg["table_data_bg"]."\" width=\"100%\" bordercolor=\"".$cfg["table_border_dk"]."\" border=1 cellpadding=3 cellspacing=0>";
 
if (sizeof($arUserTorrent) > 0)
{
echo "<tr><td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">".$cfg["user"].": "._TORRENTFILE."</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">Size</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._USER."</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._STATUS."</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._ESTIMATEDTIME."</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._ADMIN."</div></td>";
echo "</tr>\n";
foreach($arUserTorrent as $torrentrow)
{
echo $torrentrow;
}
}
 
if (sizeof($arListTorrent) > 0)
{
echo "<tr><td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._TORRENTFILE."</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">Size</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._USER."</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._STATUS."</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._ESTIMATEDTIME."</div></td>";
echo "<td background=\"themes/".$cfg["theme"]."/images/bar.gif\" bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._ADMIN."</div></td>";
echo "</tr>\n";
foreach($arListTorrent as $torrentrow)
{
echo $torrentrow;
}
}
}
?>
/web/kaklik's_web/torrentflux/history.php
0,0 → 1,158
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
 
//****************************************************************************
// showIndex -- default view
//****************************************************************************
function showIndex($min)
{
DisplayHead(_UPLOADHISTORY);
 
// Display Activity
displayActivity($min);
 
DisplayFoot();
}
 
 
//****************************************************************************
// displayActivity -- displays History
//****************************************************************************
function displayActivity($min=0)
{
global $cfg, $db;
 
$offset = 50;
$inx = 0;
$max = $min+$offset;
$output = "";
$morelink = "";
 
$sql = "SELECT user_id, file, time FROM tf_log WHERE action=".$db->qstr($cfg["constants"]["url_upload"])." OR action=".$db->qstr($cfg["constants"]["file_upload"])." ORDER BY time desc";
 
$result = $db->SelectLimit($sql, $offset, $min);
while(list($user_id, $file, $time) = $result->FetchRow())
{
$user_icon = "images/user_offline.gif";
if (IsOnline($user_id))
{
$user_icon = "images/user.gif";
}
 
$output .= "<tr>";
$output .= "<td><a href=\"message.php?to_user=".$user_id."\"><img src=\"".$user_icon."\" width=17 height=14 title=\"".$user_id."\" border=0 align=\"bottom\">".$user_id."</a>&nbsp;&nbsp;</td>";
$output .= "<td><div align=center><div class=\"tiny\" align=\"left\">";
$output .= $file;
$output .= "</div></td>";
$output .= "<td><div class=\"tiny\" align=\"center\">".date(_DATETIMEFORMAT, $time)."</div></td>";
$output .= "</tr>";
 
$inx++;
}
 
if($inx == 0)
{
$output = "<tr><td colspan=6><center><strong>-- "._NORECORDSFOUND." --</strong></center></td></tr>";
}
 
$prev = ($min-$offset);
if ($prev>=0)
{
$prevlink = "<a href=\"history.php?min=".$prev."\">";
$prevlink .= "<font class=\"TinyWhite\">&lt;&lt;".$min." "._SHOWPREVIOUS."]</font></a> &nbsp;";
}
$next=$min+$offset;
if ($inx>=$offset)
{
$morelink = "<a href=\"history.php?min=".$max."\">";
$morelink .= "<font class=\"TinyWhite\">["._SHOWMORE."&gt;&gt;</font></a>";
}
 
echo "<table width=\"760\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr><td>";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<strong><font class=\"title\">"._UPLOADACTIVITY." (".$cfg["days_to_keep"]." "._DAYS.")</font></strong>";
 
if(!empty($prevlink) && !empty($morelink))
echo "</td><td align=\"right\">".$prevlink.$morelink."</td></tr></table>";
elseif(!empty($prevlink))
echo "</td><td align=\"right\">".$prevlink."</td></tr></table>";
elseif(!empty($morelink))
echo "</td><td align=\"right\">".$morelink."</td></tr></table>";
else
echo "</td><td align=\"right\"></td></tr></table>";
 
echo "</td></tr>";
echo "<tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._USER."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._FILE."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"15%\"><div align=center class=\"title\">"._TIMESTAMP."</div></td>";
echo "</tr>";
 
echo $output;
 
if(!empty($prevlink) || !empty($morelink))
{
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_header_bg"]."\">";
echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr><td align=\"left\">";
echo $prevlink;
echo "</td><td align=\"right\">";
echo $morelink;
echo "</td></tr></table>";
echo "</td></tr>";
}
 
echo "</table>";
 
}
 
 
 
 
 
//****************************************************************************
//****************************************************************************
//****************************************************************************
//****************************************************************************
// TRAFFIC CONTROLER
if(!isset($op)) $op = "";
 
switch ($op) {
 
default:
if(!isset($min)) $min = 0;
showIndex($min);
break;
 
}
//****************************************************************************
//****************************************************************************
//****************************************************************************
//****************************************************************************
 
?>
/web/kaklik's_web/torrentflux/images/admin_user.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/all.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/arrow.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/black.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/blank.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/delete.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/delete.psd
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/delete_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/delete_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/down.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/download.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/download_owner.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/base.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/empty.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/folder.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/folderopen.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/join.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/joinbottom.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/line.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/minus.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/minusbottom.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/nolines_minus.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/nolines_plus.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/page.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/plus.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/dtree/plusbottom.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/edit.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/error.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/favicon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/ac3.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/avi.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/bin.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/bmp.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/c.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/cab.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/cue.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/doc.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/exe.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/gif.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/gz.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/h.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/html.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/img.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/images/files/iso.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/jar.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/java.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/jpg.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/log.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/man.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/midi.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/mov.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/mp3.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/mpeg.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/mpg.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/nfo.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/ogg.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/ogm.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/pdf.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/php.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/py.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/rar.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/readme.txt
0,0 → 1,60
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
This copyright and license notice covers the images in this directory.
Note the license notice contains an add-on.
************************************************************************
 
TITLE: NUVOLA ICON THEME for KDE 3.x
AUTHOR: David Vignoni | ICON KING
SITE: http://www.icon-king.com
MAILING LIST: http://mail.icon-king.com/mailman/listinfo/nuvola_icon-king.com
 
Copyright (c) 2003-2004 David Vignoni.
 
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation,
version 2.1 of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library (see the the license.txt file); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#######**** NOTE THIS ADD-ON ****#######
The GNU Lesser General Public License or LGPL is written for software libraries
in the first place. The LGPL has to be considered valid for this artwork
library too.
Nuvola icon theme for KDE 3.x is a special kind of software library, it is an
artwork library, it's elements can be used in a Graphical User Interface, or
GUI.
Source code, for this library means:
- raster png image* .
The LGPL in some sections obliges you to make the files carry
notices. With images this is in some cases impossible or hardly usefull.
With this library a notice is placed at a prominent place in the directory
containing the elements. You may follow this practice.
The exception in section 6 of the GNU Lesser General Public License covers
the use of elements of this art library in a GUI.
dave [at] icon-king.com
 
Date: 15 october 2004
Version: 1.0
 
DESCRIPTION:
 
Icon theme for KDE 3.x.
Icons where designed using Adobe Illustrator, and then exported to PNG format.
Icons shadows and minor corrections were done using Adobe Photoshop.
Kiconedit was used to correct some 16x16 and 22x22 icons.
 
LICENSE
 
Released under GNU Lesser General Public License (LGPL)
Look at the license.txt file.
 
CONTACT
 
David Vignoni
e-mail : david [at] icon-king.com
ICQ : 117761009
http: http://www.icon-king.com
/web/kaklik's_web/torrentflux/images/files/rm.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/rpm.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/sh.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/tar.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/txt.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/vob.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/wav.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/wma.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/wmv.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/xls.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/files/zip.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/folder.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/folder.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/folder2.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/green.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/hdd.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/help.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/images/info.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/kill.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/locked.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/logout.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/make.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/new_message.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/old_message.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/progress_bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/properties.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/queued.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/red.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/reply.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/run_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/run_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/seed_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/superadmin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/tar_down.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/time.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/up_dir.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/user.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/user_group.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/user_offline.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/view_nfo.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/who.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/images/yellow.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/index.php
0,0 → 1,1009
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
 
include_once("config.php");
include_once("functions.php");
 
$messages = "";
 
// set refresh option into the session cookie
if(array_key_exists("pagerefresh", $_GET))
{
if($_GET["pagerefresh"] == "false")
{
$_SESSION['prefresh'] = false;
header("location: index.php");
exit();
}
 
if($_GET["pagerefresh"] == "true")
{
$_SESSION["prefresh"] = true;
header("location: index.php");
exit();
}
}
// Check to see if QManager is running if not Start it.
if (checkQManager() == 0 )
{
if ($cfg["AllowQueing"])
{
if (is_dir($cfg["path"]) && is_writable($cfg["path"]))
{
AuditAction($cfg["constants"]["QManager"], "QManager Not Running");
sleep(2);
startQManager($cfg["maxServerThreads"],$cfg["maxUserThreads"],$cfg["sleepInterval"]);
sleep(2);
}
else
{
AuditAction($cfg["constants"]["error"], "Error starting Queue Manager -- TorrentFlux settings are not correct (path is not valid)");
if (IsAdmin())
{
header("location: admin.php?op=configSettings");
exit();
}
else
{
$messages .= "<b>Error</b> TorrentFlux settings are not correct (path is not valid) -- please contact an admin.<br>";
}
}
}
}
 
$torrent = getRequestVar('torrent');
 
if(!empty($torrent))
{
include_once("AliasFile.php");
 
if ($cfg["enable_file_priority"])
{
include_once("setpriority.php");
// Process setPriority Request.
setPriority($torrent);
}
 
$spo = getRequestVar('setPriorityOnly');
if (!empty($spo)){
// This is a setPriortiyOnly Request.
 
}else
{
// if we are to start a torrent then do so
 
// check to see if the path to the python script is valid
if (!is_file($cfg["btphpbin"]))
{
AuditAction($cfg["constants"]["error"], "Error Path for ".$cfg["btphpbin"]." is not valid");
if (IsAdmin())
{
header("location: admin.php?op=configSettings");
exit();
}
else
{
$messages .= "<b>Error</b> TorrentFlux settings are not correct (path to python script is not valid) -- please contact an admin.<br>";
}
}
 
$command = "";
 
$rate = getRequestVar('rate');
if (empty($rate))
{
if ($rate != 0)
{
$rate = $cfg["max_upload_rate"];
}
}
$drate = getRequestVar('drate');
if (empty($drate))
{
if ($drate != 0)
{
$drate = $cfg["max_download_rate"];
}
}
$superseeder = getRequestVar('superseeder');
if (empty($superseeder))
{
$superseeder = "0"; // should be 0 in most cases
}
$runtime = getRequestVar('runtime');
if (empty($runtime))
{
$runtime = $cfg["torrent_dies_when_done"];
}
 
$maxuploads = getRequestVar('maxuploads');
if (empty($maxuploads))
{
if ($maxuploads != 0)
{
$maxuploads = $cfg["max_uploads"];
}
}
$minport = getRequestVar('minport');
if (empty($minport))
{
$minport = $cfg["minport"];
}
$maxport = getRequestVar('maxport');
if (empty($maxport))
{
$maxport = $cfg["maxport"];
}
$rerequest = getRequestVar("rerequest");
if (empty($rerequest))
{
$rerequest = $cfg["rerequest_interval"];
}
$sharekill = getRequestVar('sharekill');
 
if ($runtime == "True" )
$sharekill = "-1";
 
if (empty($sharekill))
{
if ($sharekill != "0")
{
$sharekill = $cfg["sharekill"];
}
}
if ($cfg["AllowQueing"])
{
if(IsAdmin())
{
$queue = getRequestVar('queue');
if($queue == 'on')
{
$queue = "1";
}else
{
$queue = "0";
}
}
else
{
$queue = "1";
}
}
 
$torrent = urldecode($torrent);
$alias = getAliasName($torrent);
$owner = getOwner($torrent);
 
// The following lines of code were suggested by Jody Steele jmlsteele@stfu.ca
// This is to help manage user downloads by their user names
//if the user's path doesnt exist, create it
if (!is_dir($cfg["path"]."/".$owner))
{
if (is_writable($cfg["path"]))
{
mkdir($cfg["path"]."/".$owner, 0777);
}
else
{
AuditAction($cfg["constants"]["error"], "Error -- " . $cfg["path"] . " is not writable.");
if (IsAdmin())
{
header("location: admin.php?op=configSettings");
exit();
}
else
{
$messages .= "<b>Error</b> TorrentFlux settings are not correct (path is not writable) -- please contact an admin.<br>";
}
}
}
 
// create AliasFile object and write out the stat file
$af = new AliasFile($cfg["torrent_file_path"].$alias.".stat", $owner);
 
if ($cfg["AllowQueing"])
{
if($queue == "1")
{
$af->QueueTorrentFile(); // this only writes out the stat file (does not start torrent)
}
else
{
$af->StartTorrentFile(); // this only writes out the stat file (does not start torrent)
}
}
else
{
$af->StartTorrentFile(); // this only writes out the stat file (does not start torrent)
}
 
if (usingTornado())
{
$command = $runtime." ".$sharekill." ".$cfg["torrent_file_path"].$alias.".stat ".$owner." --responsefile '".$cfg["torrent_file_path"].$torrent."' --display_interval 5 --max_download_rate ". $drate ." --max_upload_rate ".$rate." --max_uploads ".$maxuploads." --minport ".$minport." --maxport ".$maxport." --rerequest_interval ".$rerequest." --super_seeder ".$superseeder;
 
if(file_exists($cfg["torrent_file_path"].$alias.".prio")) {
$priolist = explode(',',file_get_contents($cfg["torrent_file_path"].$alias.".prio"));
$priolist = implode(',',array_slice($priolist,1,$priolist[0]));
$command .= " --priority ".$priolist;
}
 
$command .= " ".$cfg["cmd_options"]." > /dev/null &";
 
if ($cfg["AllowQueing"] && $queue == "1")
{
// This file is being queued.
}
else
{
// This flie is being started manually.
 
if (! array_key_exists("pythonCmd", $cfg))
{
insertSetting("pythonCmd","/usr/bin/python");
}
 
if (! array_key_exists("debugTorrents", $cfg))
{
insertSetting("debugTorrents", "0");
}
 
if (!$cfg["debugTorrents"])
{
$pyCmd = $cfg["pythonCmd"] . " -OO";
}else{
$pyCmd = $cfg["pythonCmd"];
}
 
$command = "cd " . $cfg["path"] . $owner . "; HOME=".$cfg["path"]."; export HOME; nohup " . $pyCmd . " " .$cfg["btphpbin"] . " " . $command;
}
 
}
else
{
// Must be using the Original BitTorrent Client
// This is now being required to allow Queing functionality
//$command = "cd " . $cfg["path"] . $owner . "; nohup " . $cfg["btphpbin"] . " ".$runtime." ".$sharekill." ".$cfg["torrent_file_path"].$alias.".stat ".$owner." --responsefile \"".$cfg["torrent_file_path"].$torrent."\" --display_interval 5 --max_download_rate ". $drate ." --max_upload_rate ".$rate." --max_uploads ".$maxuploads." --minport ".$minport." --maxport ".$maxport." --rerequest_interval ".$rerequest." ".$cfg["cmd_options"]." > /dev/null &";
$messages .= "<b>Error</b> BitTornado is only supported Client at this time.<br>";
}
 
// write the session to close so older version of PHP will not hang
session_write_close("TorrentFlux");
 
if($af->running == "3")
{
writeQinfo($cfg["torrent_file_path"]."queue/".$alias.".stat",$command);
AuditAction($cfg["constants"]["queued_torrent"], $torrent."<br>Die:".$runtime.", Sharekill:".$sharekill.", MaxUploads:".$maxuploads.", DownRate:".$drate.", UploadRate:".$rate.", Ports:".$minport."-".$maxport.", SuperSeed:".$superseeder.", Rerequest Interval:".$rerequest);
AuditAction($cfg["constants"]["queued_torrent"], $command);
}
else
{
// The following command starts the torrent running! w00t!
$result = exec($command);
 
AuditAction($cfg["constants"]["start_torrent"], $torrent."<br>Die:".$runtime.", Sharekill:".$sharekill.", MaxUploads:".$maxuploads.", DownRate:".$drate.", UploadRate:".$rate.", Ports:".$minport."-".$maxport.", SuperSeed:".$superseeder.", Rerequest Interval:".$rerequest);
 
// slow down and wait for thread to kick off.
// otherwise on fast servers it will kill stop it before it gets a chance to run.
sleep(1);
}
 
if ($messages == "")
{
if (array_key_exists("closeme",$_POST))
{
?>
<script language="JavaScript">
window.opener.location.reload(true);
window.close();
</script>
<?php
exit();
}
else
{
header("location: index.php");
exit();
}
}
else
{
AuditAction($cfg["constants"]["error"], $messages);
}
}
}
 
 
// Do they want us to get a torrent via a URL?
$url_upload = getRequestVar('url_upload');
 
if(! $url_upload == '')
{
$arURL = explode("/", $url_upload);
$file_name = urldecode($arURL[count($arURL)-1]); // get the file name
$file_name = str_replace(array("'",","), "", $file_name);
$file_name = stripslashes($file_name);
$ext_msg = "";
 
// Check to see if url has something like ?passkey=12345
// If so remove it.
if( ( $point = strrpos( $file_name, "?" ) ) !== false )
{
$file_name = substr( $file_name, 0, $point );
}
 
$ret = strrpos($file_name,".");
if ($ret === false)
{
$file_name .= ".torrent";
}
else
{
if(!strcmp(strtolower(substr($file_name, strlen($file_name)-8, 8)), ".torrent") == 0)
{
$file_name .= ".torrent";
}
}
 
$url_upload = str_replace(" ", "%20", $url_upload);
 
// This is to support Sites that pass an id along with the url for torrent downloads.
$tmpId = getRequestVar("id");
if(!empty($tmpId))
{
$url_upload .= "&id=".$tmpId;
}
 
// Call fetchtorrent to retrieve the torrent file
$output = FetchTorrent( $url_upload );
 
if (array_key_exists("save_torrent_name",$cfg))
{
if ($cfg["save_torrent_name"] != "")
{
$file_name = $cfg["save_torrent_name"];
}
}
 
$file_name = cleanFileName($file_name);
 
// if the output had data then write it to a file
if ((strlen($output) > 0) && (strpos($output, "<br />") === false))
{
if (is_file($cfg["torrent_file_path"].$file_name))
{
// Error
$messages .= "<b>Error</b> with (<b>".$file_name."</b>), the file already exists on the server.<br><center><a href=\"".$_SERVER['PHP_SELF']."\">[Refresh]</a></center>";
$ext_msg = "DUPLICATE :: ";
}
else
{
// open a file to write to
$fw = fopen($cfg["torrent_file_path"].$file_name,'w');
fwrite($fw, $output);
fclose($fw);
}
}
else
{
$messages .= "<b>Error</b> Getting the File (<b>".$file_name."</b>), Could be a Dead URL.<br><center><a href=\"".$_SERVER['PHP_SELF']."\">[Refresh]</a></center>";
}
 
if ($messages == "")
{
AuditAction($cfg["constants"]["url_upload"], $file_name);
header("location: index.php");
exit();
}
else
{
// there was an error
AuditAction($cfg["constants"]["error"], $cfg["constants"]["url_upload"]." :: ".$ext_msg.$file_name);
}
}
 
// Handle the file upload if there is one
if(!empty($_FILES['upload_file']['name']))
{
$file_name = stripslashes($_FILES['upload_file']['name']);
$file_name = str_replace(array("'",","), "", $file_name);
$file_name = cleanFileName($file_name);
$ext_msg = "";
 
if($_FILES['upload_file']['size'] <= 1000000 &&
$_FILES['upload_file']['size'] > 0)
{
if (ereg(getFileFilter($cfg["file_types_array"]), $file_name))
{
//FILE IS BEING UPLOADED
if (is_file($cfg["torrent_file_path"].$file_name))
{
// Error
$messages .= "<b>Error</b> with (<b>".$file_name."</b>), the file already exists on the server.<br><center><a href=\"".$_SERVER['PHP_SELF']."\">[Refresh]</a></center>";
$ext_msg = "DUPLICATE :: ";
}
else
{
if(move_uploaded_file($_FILES['upload_file']['tmp_name'], $cfg["torrent_file_path"].$file_name))
{
chmod($cfg["torrent_file_path"].$file_name, 0644);
 
AuditAction($cfg["constants"]["file_upload"], $file_name);
 
header("location: index.php");
}
else
{
$messages .= "<font color=\"#ff0000\" size=3>ERROR: File not uploaded, file could not be found or could not be moved:<br>".$cfg["torrent_file_path"] . $file_name."</font><br>";
}
}
}
else
{
$messages .= "<font color=\"#ff0000\" size=3>ERROR: The type of file you are uploading is not allowed.</font><br>";
}
}
else
{
$messages .= "<font color=\"#ff0000\" size=3>ERROR: File not uploaded, check file size limit.</font><br>";
}
 
if($messages != "")
{
// there was an error
AuditAction($cfg["constants"]["error"], $cfg["constants"]["file_upload"]." :: ".$ext_msg.$file_name);
}
} // End File Upload
 
 
// if a file was set to be deleted then delete it
$delfile = getRequestVar('delfile');
if(! $delfile == '')
{
$alias_file = getRequestVar('alias_file');
if (($cfg["user"] == getOwner($delfile)) || IsAdmin())
{
@unlink($cfg["torrent_file_path"].$delfile);
@unlink($cfg["torrent_file_path"].$alias_file);
// try to remove the QInfo if in case it was queued.
@unlink($cfg["torrent_file_path"]."queue/".$alias_file.".Qinfo");
 
// try to remove the pid file
@unlink($cfg["torrent_file_path"].$alias_file.".pid");
@unlink($cfg["torrent_file_path"].getAliasName($delfile).".prio");
 
AuditAction($cfg["constants"]["delete_torrent"], $delfile);
 
header("location: index.php");
exit();
}
else
{
AuditAction($cfg["constants"]["error"], $cfg["user"]." attempted to delete ".$delfile);
}
}
 
// Did the user select the option to kill a running torrent?
$kill = getRequestVar('kill');
if(! $kill == '')
{
include_once("AliasFile.php");
include_once("RunningTorrent.php");
 
$kill_torrent = getRequestVar('kill_torrent');
$alias_file = getRequestVar('alias_file');
// We are going to write a '0' on the front of the stat file so that
// the BT client will no to stop -- this will report stats when it dies
$the_user = getOwner($kill_torrent);
// read the alias file
// create AliasFile object
$af = new AliasFile($cfg["torrent_file_path"].$alias_file, $the_user);
if($af->percent_done < 100)
{
// The torrent is being stopped but is not completed dowloading
$af->percent_done = ($af->percent_done + 100)*-1;
$af->running = "0";
$af->time_left = "Torrent Stopped";
}
else
{
// Torrent was seeding and is now being stopped
$af->percent_done = 100;
$af->running = "0";
$af->time_left = "Download Succeeded!";
}
 
// see if the torrent process is hung.
if (!is_file($cfg["torrent_file_path"].$alias_file.".pid"))
{
$runningTorrents = getRunningTorrents();
foreach ($runningTorrents as $key => $value)
{
$rt = new RunningTorrent($value);
if ($rt->statFile == $alias_file) {
AuditAction($cfg["constants"]["error"], "Posible Hung Process " . $rt->processId);
// $result = exec("kill ".$rt->processId);
}
}
}
 
// Write out the new Stat File
$af->WriteFile();
 
AuditAction($cfg["constants"]["kill_torrent"], $kill_torrent);
$return = getRequestVar('return');
if (!empty($return))
{
sleep(3);
$result = exec("kill ".$kill);
// try to remove the pid file
@unlink($cfg["torrent_file_path"].$alias_file.".pid");
header("location: ".$return.".php?op=queueSettings");
exit();
}
else
{
header("location: index.php");
exit();
}
}
 
// Did the user select the option to remove a torrent from the Queue?
if(isset($_REQUEST["dQueue"]))
{
$alias_file = getRequestVar('alias_file');
$QEntry = getRequestVar('QEntry');
 
// Is the Qinfo file still there?
if (file_exists($cfg["torrent_file_path"]."queue/".$alias_file.".Qinfo"))
{
// Yes, then delete it and update the stat file.
include_once("AliasFile.php");
// We are going to write a '2' on the front of the stat file so that
// it will be set back to New Status
$the_user = getOwner($QEntry);
// read the alias file
// create AliasFile object
$af = new AliasFile($cfg["torrent_file_path"].$alias_file, $the_user);
 
if($af->percent_done > 0 && $af->percent_done < 100)
{
// has downloaded something at some point, mark it is incomplete
$af->running = "0";
$af->time_left = "Torrent Stopped";
}
 
if ($af->percent_done == 0 || $af->percent_done == "")
{
$af->running = "2";
$af->time_left = "";
}
 
if ($af->percent_done == 100)
{
// Torrent was seeding and is now being stopped
$af->running = "0";
$af->time_left = "Download Succeeded!";
}
 
// Write out the new Stat File
$af->WriteFile();
 
// Remove Qinfo file.
@unlink($cfg["torrent_file_path"]."queue/".$alias_file.".Qinfo");
 
AuditAction($cfg["constants"]["unqueued_torrent"], $QEntry);
}
else
{
// torrent has been started... try and kill it.
AuditAction($cfg["constants"]["unqueued_torrent"], $QEntry . "has been started -- TRY TO KILL IT");
header("location: index.php?alias_file=".$alias_file."&kill=true&kill_torrent=".urlencode($QEntry));
exit();
}
 
header("location: index.php");
exit();
}
 
$drivespace = getDriveSpace($cfg["path"]);
 
 
/************************************************************
 
************************************************************/
?>
<html>
<head>
<title><?php echo $cfg["pagetitle"] ?></title>
<link rel="icon" href="images/favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />
<LINK REL="StyleSheet" HREF="themes/<?php echo $cfg["theme"] ?>/style.css" TYPE="text/css">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache; charset=<?php echo _CHARSET ?>">
<?php
if(!isset($_SESSION['prefresh']) || ($_SESSION['prefresh'] == true))
{
echo "<meta http-equiv=\"REFRESH\" content=\"".$cfg["page_refresh"].";URL=index.php\">";
}
?>
<div id="overDiv" style="position:absolute;visibility:hidden;z-index:1000;"></div>
<script language="JavaScript">
var ol_closeclick = "1";
var ol_close = "<font color=#ffffff><b>X</b></font>";
var ol_fgclass = "fg";
var ol_bgclass = "bg";
var ol_captionfontclass = "overCaption";
var ol_closefontclass = "overClose";
var ol_textfontclass = "overBody";
var ol_cap = "&nbsp;Torrent Status";
</script>
<script src="overlib.js" type="text/javascript"></script>
<script language="JavaScript">
function ShowDetails(name_file)
{
window.open (name_file,'_blank','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=430,height=225')
}
function StartTorrent(name_file)
{
myWindow = window.open (name_file,'_blank','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=700,height=530')
}
function ConfirmDelete(file)
{
return confirm("<?php echo _ABOUTTODELETE ?>: " + file)
}
</script>
</head>
 
<body topmargin="8" bgcolor="<?php echo $cfg["main_bgcolor"] ?>">
 
<div align="center">
 
<?php
if ($messages != "")
{
?>
<table border="1" cellpadding="10" bgcolor="#ff9b9b">
<tr>
<td><div align="center"><?php echo $messages ?></div></td>
</tr>
</table><br><br>
<?php
}
?>
<table border="0" cellpadding="0" cellspacing="0" width="760">
<tr>
<td>
<table border="1" bordercolor="<?php echo $cfg["table_border_dk"] ?>" cellpadding="4" cellspacing="0" width="100%">
<tr>
<td colspan="2" background="themes/<?php echo $cfg["theme"] ?>/images/bar.gif">
<?php DisplayTitleBar($cfg["pagetitle"]); ?>
</td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_header_bg"] ?>">
<table width="100%" cellpadding="3" cellspacing="0" border="0">
<tr>
<form name="form_file" action="index.php" method="post" enctype="multipart/form-data">
<td>
<?php echo _SELECTFILE ?>:<br>
<input type="File" name="upload_file" size="40">
<input type="Submit" value="<?php echo _UPLOAD ?>">
</td>
</form>
</tr>
<tr>
<form name="form_url" action="index.php" method="post">
<td>
<hr>
<?php echo _URLFILE ?>:<br>
<input type="text" name="url_upload" size="50">
<input type="Submit" value="<?php echo _GETFILE ?>">
</td>
</form>
</tr>
<?php
if ($cfg["enable_search"])
{
?>
<tr>
<form name="form_search" action="torrentSearch.php" method="get">
<td>
<hr>
Torrent <?php echo _SEARCH ?>:<br>
<input type="text" name="searchterm" size="30" maxlength="50">
<?php
echo buildSearchEngineDDL($cfg["searchEngine"])
?>
<input type="Submit" value="<?php echo _SEARCH ?>">
</td>
</form>
</tr>
<?php
}
?>
</table>
 
</td>
<td bgcolor="<?php echo $cfg["table_data_bg"] ?>" width="310" valign="top">
<table width="100%" cellpadding="1" border="0">
<tr>
<td valign="top">
<b><?php echo _TORRENTLINKS ?>:</b><br>
<?php
$arLinks = GetLinks();
foreach($arLinks as $link)
{
$arURL = parse_url($link);
echo "<a href=\"".$link."\" target=\"_blank\"><img src=\"images/arrow.gif\" width=9 height=9 title=\"".$link."\" border=0 align=\"baseline\">".$arURL['host']."</a><br>\n";
}
 
echo "</ul></td>";
 
$arUsers = GetUsers();
$arOnlineUsers = array();
$arOfflineUsers = array();
 
for($inx = 0; $inx < count($arUsers); $inx++)
{
if(IsOnline($arUsers[$inx]))
{
array_push($arOnlineUsers, $arUsers[$inx]);
}
else
{
array_push($arOfflineUsers, $arUsers[$inx]);
}
}
 
echo "<td bgcolor=\"".$cfg["table_data_bg"]."\" valign=\"top\">";
echo "<b>"._ONLINE.":</b><br>";
 
for($inx = 0; $inx < count($arOnlineUsers); $inx++)
{
echo "<a href=\"message.php?to_user=".$arOnlineUsers[$inx]."\">";
echo "<img src=\"images/user.gif\" width=17 height=14 title=\"\" border=0 align=\"bottom\">". $arOnlineUsers[$inx];
echo "</a><br>\n";
}
 
// Does the user want to see offline users?
if ($cfg["hide_offline"] == false)
{
echo "<b>"._OFFLINE.":</b></br>";
// Show offline users
 
for($inx = 0; $inx < count($arOfflineUsers); $inx++)
{
echo "<a href=\"message.php?to_user=".$arOfflineUsers[$inx]."\">";
echo "<img src=\"images/user_offline.gif\" width=17 height=14 title=\"\" border=0 align=\"bottom\">".$arOfflineUsers[$inx];
echo "</a><br>\n";
}
}
 
echo "</td>";
?>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_header_bg"] ?>" colspan="2">
<?php
displayDriveSpaceBar($drivespace);
?>
</td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_data_bg"] ?>" colspan="2">
<div align="center">
<font face="Arial" size="2">
<a href="readrss.php">
<img src="images/download_owner.gif" width="16" height="16" border="0" title="RSS Torrents" align="absmiddle">RSS Torrents</a>
|
<a href="drivespace.php">
<img src="images/hdd.gif" width="16" height="16" border="0" title="<?php echo $drivespace ?>% Used" align="absmiddle"><?php echo _DRIVESPACE ?></a>
|
<a href="who.php">
<img src="images/who.gif" width="16" height="16" title="" border="0" align="absmiddle"><?php echo _SERVERSTATS ?></a>
|
<a href="all_services.php">
<img src="images/all.gif" width="16" height="16" title="" border="0" align="absmiddle"><?php echo _ALL ?></a>
|
<a href="dir.php">
<img src="images/folder.gif" width="16" height="16" title="" border="0" align="absmiddle"><?php echo _DIRECTORYLIST ?></a>
|
<a href="dir.php?dir=<?php echo $cfg["user"] ?>"><img src="images/folder.gif" width="16" height="16" title="My Directory" border="0" align="absmiddle">My Directory</a>
</font>
</div>
</td>
</tr>
</table>
<?php
getDirList($cfg["torrent_file_path"]);
?>
<tr><td bgcolor="<?php echo $cfg["table_header_bg"] ?>" colspan="6">
 
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td valign="top">
 
<div align="center">
 
<table>
<tr>
<td><img src="images/properties.png" width="18" height="13" title="<?php echo _TORRENTDETAILS ?>"></td>
<td class="tiny"><?php echo _TORRENTDETAILS ?>&nbsp;&nbsp;&nbsp;</td>
<td><img src="images/run_on.gif" width="16" height="16" title="<?php echo _RUNTORRENT ?>"></td>
<td class="tiny"><?php echo _RUNTORRENT ?>&nbsp;&nbsp;&nbsp;</td>
<td><img src="images/kill.gif" width="16" height="16" title="<?php echo _STOPDOWNLOAD ?>"></td>
<td class="tiny"><?php echo _STOPDOWNLOAD ?>&nbsp;&nbsp;&nbsp;</td>
<?php
if ($cfg["AllowQueing"])
{
?>
<td><img src="images/queued.gif" width="16" height="16" title="<?php echo _DELQUEUE ?>"></td>
<td class="tiny"><?php echo _DELQUEUE ?>&nbsp;&nbsp;&nbsp;</td>
<?php
}
?>
<td><img src="images/seed_on.gif" width="16" height="16" title="<?php echo _SEEDTORRENT ?>"></td>
<td class="tiny"><?php echo _SEEDTORRENT ?>&nbsp;&nbsp;&nbsp;</td>
<td><img src="images/delete_on.gif" width="16" height="16" title="<?php echo _DELETE ?>"></td>
<td class="tiny"><?php echo _DELETE ?></td>
<?php
if ($cfg["enable_torrent_download"])
{
?>
<td>&nbsp;&nbsp;&nbsp;<img src="images/down.gif" width="9" height="9" title="<?php echo _DELQUEUE ?>"></td>
<td class="tiny">Download Torrent</td>
<?php
}
?>
</tr>
</table>
 
 
<table width="100%" cellpadding="5">
<tr>
<td width="33%">
<div class="tiny">
<?php
if(checkQManager() > 0)
{
echo "<img src=\"images/green.gif\" align=\"absmiddle\" title=\"Queue Manager Running\" align=\"absmiddle\"> Queue Manager Running<br>";
echo "<strong>".strval(getRunningTorrentCount())."</strong> torrent(s) running and <strong>".strval(getNumberOfQueuedTorrents())."</strong> queued.<br>";
echo "Total torrents server will run: <strong>".$cfg["maxServerThreads"]."</strong><br>";
echo "Total torrents a user may run: <strong>".$cfg["maxUserThreads"]."</strong><br>";
echo "* Torrents are queued when limits are met.<br>";
}
else
{
echo "<img src=\"images/black.gif\" title=\"Queue Manager Off\" align=\"absmiddle\"> Queue Manager Off<br><br>";
}
?>
</div>
</td>
<td width="33%" valign="bottom">
<div align="center" class="tiny">
<?php
 
if(!isset($_SESSION['prefresh']) || ($_SESSION['prefresh'] == true))
{
echo "*** "._PAGEWILLREFRESH." ".$cfg["page_refresh"]." "._SECONDS." ***<br>";
echo "<a href=\"".$_SERVER['PHP_SELF']."?pagerefresh=false\"><font class=\"tiny\">"._TURNOFFREFRESH."</font></a>";
}
else
{
echo "<a href=\"".$_SERVER['PHP_SELF']."?pagerefresh=true\"><font class=\"tiny\">"._TURNONREFRESH."</font></a>";
}
 
 
if($drivespace >= 98)
{
 
echo "\n\n<script language=\"JavaScript\">\n alert(\""._WARNING.": ".$drivespace."% "._DRIVESPACEUSED."\")\n </script>";
}
 
if (!array_key_exists("total_download",$cfg)) $cfg["total_download"] = 0;
if (!array_key_exists("total_upload",$cfg)) $cfg["total_upload"] = 0;
 
 
?>
</div>
</td>
<td valign="top" width="33%" align="right">
 
<table>
<tr>
<td class="tiny" align="right"><?php echo _CURRENTDOWNLOAD ?>:</td>
<td class="tiny"><strong><?php echo number_format($cfg["total_download"], 2); ?></strong> kB/s</td>
</tr>
<tr>
<td class="tiny" align="right"><?php echo _CURRENTUPLOAD ?>:</td>
<td class="tiny"><strong><?php echo number_format($cfg["total_upload"], 2); ?></strong> kB/s</td>
</tr>
<tr>
<td class="tiny" align="right"><?php echo _FREESPACE ?>:</td>
<td class="tiny"><strong><?php echo formatFreeSpace($cfg["free_space"]) ?></strong></td>
</tr>
<tr>
<td class="tiny" align="right"><?php echo _SERVERLOAD ?>:</td>
<td class="tiny">
<?php
if ($cfg["show_server_load"] && isFile($cfg["loadavg_path"]))
{
$loadavg_array = explode(" ", exec("cat ".$cfg["loadavg_path"]));
$loadavg = $loadavg_array[2];
echo "<strong>".$loadavg."</strong>";
}
else
{
echo "<strong>n/a</strong>";
}
?>
</td>
</tr>
</table>
 
</td>
</tr>
</table>
 
 
 
 
 
</div>
 
</td>
</tr>
</table>
 
 
 
</td></tr>
</table>
 
<?php
echo DisplayTorrentFluxLink();
// At this point Any User actions should have taken place
// Check to see if the user has a force_read message from an admin
if (IsForceReadMsg())
{
// Yes, then warn them
?>
<script language="JavaScript">
if (confirm("<?php echo _ADMINMESSAGE ?>"))
{
document.location = "readmsg.php";
}
</script>
<?php
}
?>
 
</td>
</tr>
</table>
</body>
</html>
/web/kaklik's_web/torrentflux/language/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/language/lang-chinese.php
0,0 → 1,170
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
/**************************************************************************/
/* TorrentFlux - Simplified Chinese Translation
/* ============================================
/* WHO: Mac / ycl6
/* DATE: 1st Jan 2005
/* Contact: ycl6@users.sourceforge.net
/**************************************************************************/
 
define("_CHARSET","gb2312"); // if you don't know... then leave this as is.
define("_SELECTFILE","ÇëÑ¡ÔñÒ»¸öÒªÉÏ´«µÄ Torrent µµ°¸");
define("_URLFILE","Torrent µµ°¸µÄÍøÖ·");
define("_UPLOAD","ÉÏ´«");
define("_GETFILE","È¡µÃµµ°¸");
define("_TORRENTLINKS","Torrent µÄÁ¬½á");
define("_ONLINE","ÔÚÏß");
define("_OFFLINE","ÀëÏß");
define("_STORAGE","´¢²Ø¿Õ¼ä");
define("_DRIVESPACE","´Åµú¿Õ¼ä");
define("_SERVERSTATS","Ö÷»úͳ¼Æ×ÊѶ");
define("_DIRECTORYLIST","Ŀ¼Çåµ¥");
define("_ALL","È«²¿×ÊѶ");
define("_PAGEWILLREFRESH","Ò³Ãæ»á×Ô¶¯Ã¿");
define("_SECONDS","Ãë¸üÐÂ");
define("_TURNONREFRESH","Æô¶¯Ò³Ãæ¸üÐÂ");
define("_TURNOFFREFRESH","¹Ø±ÕÒ³Ãæ¸üÐÂ");
define("_WARNING","¾¯¸æ");
define("_DRIVESPACEUSED","´Åµú¿Õ¼äÒѱ»Ê¹ÓÃ!");
define("_ADMINMESSAGE","ÄãµÄѶϢ¼ÐÖÐÓÐÒ»·â¹ÜÀíÔ±¼Ä¸øÄãµÄѶϢ.");
define("_TORRENTS","Torrents");
define("_UPLOADHISTORY","ÉÏ´«¼Í¼");
define("_MYPROFILE","±à¼­ÎҵĸöÈË×ÊÁÏ");
define("_ADMINISTRATION","¹ÜÀí¿ØÖÆ̨");
define("_SENDMESSAGETO","´«ËÍѶϢ¸ø");
define("_TORRENTFILE","Torrent µµ°¸");
define("_FILESIZE","µµ°¸´óС");
define("_STATUS","״̬");
define("_ADMIN","¹ÜÀí");
define("_BADFILE","Ë𻵵µ°¸");
define("_DATETIMEFORMAT","Y/m/d g:i a"); //Date Time mask '2004/02/26 03:53 pm'
define("_DATEFORMAT","Y/m/d"); //Date mask '2004/02/26'
define("_ESTIMATEDTIME","¹À¼Æʱ¼ä");
define("_DOWNLOADSPEED","ÏÂÔØËÙ¶È");
define("_UPLOADSPEED","ÉÏ´«ËÙ¶È");
define("_SHARING","·ÖÏí±ÈÀý");
define("_USER","Óû§");
define("_DONE","ÒѽáÊø");
define("_INCOMPLETE","δÍê³É");
define("_NEW","ÐÂÔö");
define("_TORRENTDETAILS","Torrent µÄÏêϸ×ÊѶ");
define("_STOPDOWNLOAD","ֹͣ Torrent");
define("_RUNTORRENT","Æô¶¯ Torrent");
define("_SEEDTORRENT","Seed Torrent"); // No Official Chinese translation for "seed"
define("_DELETE","ɾ³ý");
define("_ABOUTTODELETE","Ä㽫Ҫɾ³ý");
define("_NOTOWNER","Äã²»ÊÇÕâ¸ö Torrent µµµÄÉÏ´«Õß");
define("_MESSAGETOALL","Õâ¸öѶϢ½«´«Ë͸øÿһλÓû§");
define("_TRYDIFFERENTUSERID","·¢Éú´íÎó: ÇëÊÔÊÔÁíÒ»¸öÓû§ÕʺÅ.");
define("_HASBEENUSED","ÒѾ­±»Ê¹ÓÃÁË.");
define("_RETURNTOEDIT","»Øµ½±à¼­");
define("_ADMINUSERACTIVITY","¹ÜÀí - Óû§»î¶¯¼Ç¼");
define("_ADMIN_MENU","¹ÜÀí");
define("_ACTIVITY_MENU","»î¶¯¼Ç¼");
define("_LINKS_MENU","Á¬½á");
define("_NEWUSER_MENU","еÄÓû§");
define("_BACKUP_MENU","±¸·Ý");
define("_ALLUSERS","ËùÓÐÓû§");
define("_NORECORDSFOUND","ûÓÐÕÒµ½×ÊÁÏ");
define("_SHOWPREVIOUS","ÏÔʾǰһ¸ö");
define("_SHOWMORE","ÏÔʾ¸ü¶à");
define("_ACTIVITYSEARCH","ËÑÑ°»î¶¯¼Ç¼");
define("_FILE","µµ°¸");
define("_ACTION","¶¯×÷");
define("_SEARCH","ËÑÑ°");
define("_ACTIVITYLOG","»î¶¯¼Ç¼Çåµ¥ - ×îºó");
define("_DAYS","ÈÕ");
define("_IP","IP");
define("_TIMESTAMP","ÈÕÆÚ");
define("_USERDETAILS","Óû§×ÊÁÏ");
define("_HITS","´ÎÊý");
define("_UPLOADACTIVITY","ÉÏ´«¼Ç¼");
define("_JOINED","¼ÓÈë±¾Õ¾ÈÕÆÚ"); // header for the date when the user joined (became a member)
define("_LASTVISIT","×îºóµ½·Ã"); // header for when the user last visited the site
define("_USERSACTIVITY","»î¶¯¼Ç¼"); // used for popup to display Activity next to users name
define("_NORMALUSER","»ù´¡Óû§"); // used to describe a normal user's account type
define("_ADMINISTRATOR","¹ÜÀíÔ±"); // used to describe an administrator's account type
define("_SUPERADMIN","³¬¼¶¹ÜÀíÔ±"); // used to describe Super Admin's account type
define("_EDIT","±à¼­");
define("_USERADMIN","¹ÜÀí - ¹ÜÀíÓû§"); // title of page for user administration
define("_EDITUSER","±à¼­Óû§");
define("_UPLOADPARTICIPATION","ÉÏ´«µÄ²ÎÓë¶È");
define("_UPLOADS","ÉÏ´«×ÜÊý"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","²ÎÓë¶È°Ù·Ö±È");
define("_PARTICIPATIONSTATEMENT","²ÎÓë¶ÈÒÔ¼°ÉÏ´«ÊýÁ¿µÄ¼ÆËãÌìÊý:"); // ends with 15 Days
define("_TOTALPAGEVIEWS","×ܹ²¹Û¿´µÄÒ³Êý");
define("_THEME","·ç¸ñ");
define("_USERTYPE","ÕʺÅÀà±ð");
define("_NEWPASSWORD","еÄÃÜÂë");
define("_CONFIRMPASSWORD","È·ÈÏÃÜÂë");
define("_HIDEOFFLINEUSERS","ÔÚÊ×Ò³Òþ²ØÀëÏßÓû§");
define("_UPDATE","¸üÐÂ");
define("_USERIDREQUIRED","ÐèÒªÓû§ ID.");
define("_PASSWORDLENGTH","ÃÜÂë±ØÐëÊÇÁùλÊý³¤.");
define("_PASSWORDNOTMATCH","ÃÜÂë²»·ûºÏ");
define("_PLEASECHECKFOLLOWING","ÇëÈ·ÈÏÒÔÏÂÎÊÌâ"); // Displays errors after this statement
define("_NEWUSER","еÄÓû§");
define("_PASSWORD","ÃÜÂë");
define("_CREATE","ÐÂÔö"); // button text to create a new user
define("_ADMINEDITLINKS","¹ÜÀí - ±à¼­Á¬½á");
define("_FULLURLLINK","ÍêÕûÁ¬½á");
define("_BACKTOPARRENT","»Øµ½ÉÏÒ»¸öĿ¼"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","ÏÂÔØ×ÊѶ");
define("_PERCENTDONE","Íê³É°Ù·Ö±È");
define("_RETURNTOTORRENTS","»Øµ½ Torrents"); // Link at the bottom of each page
define("_DATE","ÈÕÆÚ");
define("_WROTE","дµ½"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","ËͳöÒ»¸öѶϢ"); // Title of page
define("_TO","¼Ä¸ø");
define("_FROM","À´×Ô");
define("_YOURMESSAGE","ÄãµÄѶϢ");
define("_SENDTOALLUSERS","´«Ë͸øËùÓÐÓû§");
define("_FORCEUSERSTOREAD","Ç¿ÖÆ»áÔ±ÔĶÁ"); // Admin option in messaging
define("_SEND","´«ËÍ"); // Button to send private message
define("_PROFILE","¸öÈË×ÊÁÏ");
define("_PROFILEUPDATEDFOR","´Ë»áÔ±µÄ×ÊÁÏÒѾ­±à¼­Íê³É: "); // Profile updated for 'username'
define("_REPLY","»Ø¸²"); // popup text for reply button
define("_MESSAGE","ѶϢ");
define("_MESSAGES","ѶϢ"); // plural (more than one)
define("_RETURNTOMESSAGES","»Øµ½Ñ¶Ï¢");
define("_COMPOSE","±àд"); // As in 'Compose a message' for button
define("_LANGUAGE","Óïϵ"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-dutch.php
0,0 → 1,165
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/*
/* Dutch translator: Robert Scheer <rjscheer@xs4all.nl>
/* $Id: lang-dutch.php,v 1.1 2004/04/16 22:54:34 rj Exp $
/**************************************************************************/
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Selecteer een torrent voor upload");
define("_URLFILE","Adres van het torrent-bestand");
define("_UPLOAD","Upload");
define("_GETFILE","Download");
define("_TORRENTLINKS","Torrent-links");
define("_ONLINE","On-line");
define("_OFFLINE","Off-line");
define("_STORAGE","Opslag");
define("_DRIVESPACE","Schijfruimte");
define("_SERVERSTATS","Serverstatistieken / Wie");
define("_DIRECTORYLIST","Mapinhoud");
define("_ALL","Alles");
define("_PAGEWILLREFRESH","De pagina ververst elke");
define("_SECONDS","seconden");
define("_TURNONREFRESH","Zet paginaverversing AAN");
define("_TURNOFFREFRESH","Zet paginaverversing UIT");
define("_WARNING","WAARSCHUWING");
define("_DRIVESPACEUSED","Schijfruimte in gebruik!");
define("_ADMINMESSAGE","U heeft een bericht van een beheerder in uw brievenbus");
define("_TORRENTS","torrents");
define("_UPLOADHISTORY","Upload-geschiedenis");
define("_MYPROFILE","Bewerk mijn profiel");
define("_ADMINISTRATION","Administratie");
define("_SENDMESSAGETO","Stuur een bericht aan");
define("_TORRENTFILE","torrent-bestand");
define("_FILESIZE","Bestandsgrootte");
define("_STATUS","Status");
define("_ADMIN","Beheer");
define("_BADFILE","kapot bestand");
define("_DATETIMEFORMAT","d/m/Y G:i"); //Date Time mask '15/04/2004 21:10'
define("_DATEFORMAT","d/m/Y"); //Date mask '15/04/2004'
define("_ESTIMATEDTIME","Geschatte tijdsduur");
define("_DOWNLOADSPEED","Download-snelheid");
define("_UPLOADSPEED","Upload-snelheid");
define("_SHARING","Gedeeld");
define("_USER","Gebruiker");
define("_DONE","KLAAR");
define("_INCOMPLETE","INCOMPLEET");
define("_NEW","NIEUW");
define("_TORRENTDETAILS","torrent-details");
define("_STOPDOWNLOAD","Stop torrent-download");
define("_RUNTORRENT","Start torrent");
define("_SEEDTORRENT","Voed torrent");
define("_DELETE","Wissen");
define("_ABOUTTODELETE","U staat op het punt om te wissen");
define("_NOTOWNER","Niet de eigenaar van deze torrent");
define("_MESSAGETOALL","Dit bericht is verzonden naar ALLE GEBRUIKERS");
define("_TRYDIFFERENTUSERID","Fout: Probeer een andere gebruikersnaam.");
define("_HASBEENUSED","is gebruikt.");
define("_RETURNTOEDIT","Terug naar Bewerken");
define("_ADMINUSERACTIVITY","Administratie - Gebruikersactiviteit");
define("_ADMIN_MENU","beheer");
define("_ACTIVITY_MENU","activiteit");
define("_LINKS_MENU","links");
define("_NEWUSER_MENU","nieuwe gebruiker");
define("_BACKUP_MENU","backup");
define("_ALLUSERS","Alle gebruikers");
define("_NORECORDSFOUND","GEEN VELDEN GEVONDEN");
define("_SHOWPREVIOUS","Vorige");
define("_SHOWMORE","Toon meer");
define("_ACTIVITYSEARCH","Zoeken naar activiteit");
define("_FILE","Bestand");
define("_ACTION","Actie");
define("_SEARCH","Zoek");
define("_ACTIVITYLOG","Activiteitslog - Laatste");
define("_DAYS","dagen");
define("_IP","IP-adres");
define("_TIMESTAMP","Tijdstip");
define("_USERDETAILS","Details gebruiker");
define("_HITS","Oproepen");
define("_UPLOADACTIVITY","Upload-activiteit");
define("_JOINED","Deelname"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Laatste bezoek"); // header for when the user last visited the site
define("_USERSACTIVITY","Activiteit"); // used for popup to display Activity next to users name
define("_NORMALUSER","Normale gebruiker"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Beheerder"); // used to describe an administrator's account type
define("_SUPERADMIN","Hoofdbeheerder"); // used to describe Super Admin's account type
define("_EDIT","Bewerk");
define("_USERADMIN","Administratie - Gebruikersadministratie"); // title of page for user administration
define("_EDITUSER","Bewerk gebruiker");
define("_UPLOADPARTICIPATION","Upload-deelname");
define("_UPLOADS","Uploads"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Deelnamepercentage");
define("_PARTICIPATIONSTATEMENT","Deelname en uploads gebaseerd op de laatste"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Paginaoproepen");
define("_THEME","Thema");
define("_USERTYPE","Gebruikerstype");
define("_NEWPASSWORD","Nieuw wachtwoord");
define("_CONFIRMPASSWORD","Bevestig wachtwoord");
define("_HIDEOFFLINEUSERS","Verberg off-line gebruikers op de hoofdpagina");
define("_UPDATE","Bijwerken");
define("_USERIDREQUIRED","Gebruikersnaam vereist.");
define("_PASSWORDLENGTH","Wachtwoord moet 6 of meer tekens bevatten.");
define("_PASSWORDNOTMATCH","Wachtwoorden komen niet overeen");
define("_PLEASECHECKFOLLOWING","Controleert u het volgende"); // Displays errors after this statement
define("_NEWUSER","Nieuwe gebruiker");
define("_PASSWORD","Wachtwoord");
define("_CREATE","Aanmaken"); // button text to create a new user
define("_ADMINEDITLINKS","Administratie - Links bewerken");
define("_FULLURLLINK","Volledige adres link");
define("_BACKTOPARRENT","Terug naar vorige map"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Download-details");
define("_PERCENTDONE","Percentage voltooid");
define("_RETURNTOTORRENTS","Terug naar torrents"); // Link at the bottom of each page
define("_DATE","Datum");
define("_WROTE","schreef"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Zend een bericht"); // Title of page
define("_TO","Aan");
define("_FROM","Van");
define("_YOURMESSAGE","Uw bericht");
define("_SENDTOALLUSERS","Zend naar alle gebruikers");
define("_FORCEUSERSTOREAD","Verplicht gebruiker(s) te lezen"); // Admin option in messaging
define("_SEND","Zend"); // Button to send private message
define("_PROFILE","Profiel");
define("_PROFILEUPDATEDFOR","Profiel bijgewerkt voor"); // Profile updated for 'username'
define("_REPLY","Antwoord"); // popup text for reply button
define("_MESSAGE","Bericht");
define("_MESSAGES","Berichten"); // plural (more than one)
define("_RETURNTOMESSAGES","Terug naar berichten");
define("_COMPOSE","Opstellen"); // As in 'Compose a message' for button
define("_LANGUAGE","Taal"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-english.php
0,0 → 1,161
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Select a Torrent for upload");
define("_URLFILE","URL for the Torrent File");
define("_UPLOAD","Upload");
define("_GETFILE","Get File");
define("_TORRENTLINKS","Torrent Links");
define("_ONLINE","Online");
define("_OFFLINE","Offline");
define("_STORAGE","Storage");
define("_DRIVESPACE","Drive Space");
define("_SERVERSTATS","Server Stats / Who");
define("_DIRECTORYLIST","Directory List");
define("_ALL","All");
define("_PAGEWILLREFRESH","Page Will Refresh Every");
define("_SECONDS","Seconds");
define("_TURNONREFRESH","Turn ON Page Refresh");
define("_TURNOFFREFRESH","Turn OFF Page Refresh");
define("_WARNING","WARNING");
define("_DRIVESPACEUSED","Drive Space is used!");
define("_ADMINMESSAGE","You have a message from an administrator in your message box.");
define("_TORRENTS","Torrents");
define("_UPLOADHISTORY","Upload History");
define("_MYPROFILE","Edit My Profile");
define("_ADMINISTRATION","Administration");
define("_SENDMESSAGETO","Send a Message to");
define("_TORRENTFILE","Torrent File");
define("_FILESIZE","File Size");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","bad file");
define("_DATETIMEFORMAT","m/d/y g:i a"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","m/d/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Estimated Time");
define("_DOWNLOADSPEED","Download Speed");
define("_UPLOADSPEED","Upload Speed");
define("_SHARING","Sharing");
define("_USER","User");
define("_DONE","DONE");
define("_INCOMPLETE","INCOMPLETE");
define("_NEW","NEW");
define("_TORRENTDETAILS","Torrent Details");
define("_STOPDOWNLOAD","Stop Torrent");
define("_RUNTORRENT","Run Torrent");
define("_SEEDTORRENT","Seed Torrent");
define("_DELETE","Delete");
define("_ABOUTTODELETE","You are about to delete");
define("_NOTOWNER","Not Owner of Torrent");
define("_MESSAGETOALL","This message was sent to ALL USERS");
define("_TRYDIFFERENTUSERID","Error: Try a different User ID.");
define("_HASBEENUSED","has been used.");
define("_RETURNTOEDIT","Return to Edit");
define("_ADMINUSERACTIVITY","Administration - User Activity");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","activity");
define("_LINKS_MENU","links");
define("_NEWUSER_MENU","new user");
define("_BACKUP_MENU","backup");
define("_ALLUSERS","All Users");
define("_NORECORDSFOUND","NO RECORDS FOUND");
define("_SHOWPREVIOUS","Previous");
define("_SHOWMORE","Show More");
define("_ACTIVITYSEARCH","Activity Search");
define("_FILE","File");
define("_ACTION","Action");
define("_SEARCH","Search");
define("_ACTIVITYLOG","Activity Log - Last");
define("_DAYS","Days");
define("_IP","IP");
define("_TIMESTAMP","Time Stamp");
define("_USERDETAILS","User Details");
define("_HITS","Hits");
define("_UPLOADACTIVITY","Upload Activity");
define("_JOINED","Joined"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Last Visit"); // header for when the user last visited the site
define("_USERSACTIVITY","Activity"); // used for popup to display Activity next to users name
define("_NORMALUSER","Normal User"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrator"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Edit");
define("_USERADMIN","Administration - User Admin"); // title of page for user administration
define("_EDITUSER","Edit User");
define("_UPLOADPARTICIPATION","Upload Participation");
define("_UPLOADS","Uploads"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Percent Participation");
define("_PARTICIPATIONSTATEMENT","Participation and Uploads based on the last"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Total Page Views");
define("_THEME","Theme");
define("_USERTYPE","User Type");
define("_NEWPASSWORD","New Password");
define("_CONFIRMPASSWORD","Confirm Password");
define("_HIDEOFFLINEUSERS","Hide Offline Users on Home Page");
define("_UPDATE","Update");
define("_USERIDREQUIRED","User ID is required.");
define("_PASSWORDLENGTH","Password must have 6 or more characters.");
define("_PASSWORDNOTMATCH","Passwords do not match.");
define("_PLEASECHECKFOLLOWING","Please check the following"); // Displays errors after this statement
define("_NEWUSER","New User");
define("_PASSWORD","Password");
define("_CREATE","Create"); // button text to create a new user
define("_ADMINEDITLINKS","Administration - Edit Links");
define("_FULLURLLINK","Full URL Link");
define("_BACKTOPARRENT","Back Parent Directory"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Download Details");
define("_PERCENTDONE","Percent Done");
define("_RETURNTOTORRENTS","Return to Torrents"); // Link at the bottom of each page
define("_DATE","Date");
define("_WROTE","wrote"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Send a Message"); // Title of page
define("_TO","To");
define("_FROM","From");
define("_YOURMESSAGE","Your Message");
define("_SENDTOALLUSERS","Send to All Users");
define("_FORCEUSERSTOREAD","Force User(s) to Read"); // Admin option in messaging
define("_SEND","Send"); // Button to send private message
define("_PROFILE","Profile");
define("_PROFILEUPDATEDFOR","Profile Updated for"); // Profile updated for 'username'
define("_REPLY","Reply"); // popup text for reply button
define("_MESSAGE","Message");
define("_MESSAGES","Messages"); // plural (more than one)
define("_RETURNTOMESSAGES","Return to Messages");
define("_COMPOSE","Compose"); // As in 'Compose a message' for button
define("_LANGUAGE","Language"); // label
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-estonian.php
0,0 → 1,172
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
/* Estonian TF Language file
/* Translated by tsimm
/**************************************************************************/
 
define("_CHARSET","iso-8859-15"); // if you don't know... then leave this as is.
define("_SELECTFILE","Vali torrent laadimiseks");
define("_URLFILE","Torrenti URL");
define("_UPLOAD","Lae ülesse");
define("_GETFILE","Tõmba fail");
define("_TORRENTLINKS","Torrentite lingid");
define("_ONLINE","Aktiivne");
define("_OFFLINE","Passiivne");
define("_STORAGE","Kõvaketas");
define("_DRIVESPACE","Kasutatud ruum");
define("_SERVERSTATS","Serveri stat / kasutajad");
define("_DIRECTORYLIST","Kataloogid");
define("_ALL","Kõik");
define("_PAGEWILLREFRESH","Leht uueneb iga");
define("_SECONDS","sekundi tagant");
define("_TURNONREFRESH","Lülita lehe taaslaadimine sisse");
define("_TURNOFFREFRESH","Lülita lehe taaslaadimine välja");
define("_WARNING","HOIATUS");
define("_DRIVESPACEUSED","Kõvaketas!");
define("_ADMINMESSAGE","Sulle on administraatorilt kiri postkasits.");
define("_TORRENTS","Torrentid");
define("_UPLOADHISTORY","Üleslaadimise minevik");
define("_MYPROFILE","Muuda profiili");
define("_ADMINISTRATION","Administratsioon");
define("_SENDMESSAGETO","Saada kiri");
define("_TORRENTFILE","Nimi");
define("_STATUS","Olek");
define("_ADMIN","Adminn");
define("_BADFILE","vigane fail");
define("_DATETIMEFORMAT","m/d/y g:i a"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","m/d/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Järelejäänud aega");
define("_DOWNLOADSPEED","Tirimise kiirus");
define("_UPLOADSPEED","Üleslaadimise kiirus");
define("_SHARING","Jagatud");
define("_USER","Kasutaja");
define("_DONE","VALMIS");
define("_INCOMPLETE","MITTE VALMIS");
define("_NEW","UUS");
define("_TORRENTDETAILS","Torrenti seaded");
define("_STOPDOWNLOAD","Peata torrent");
define("_RUNTORRENT","Käivita torrent");
define("_SEEDTORRENT","Jaga torrentit");
define("_DELETE","Kustuta");
define("_ABOUTTODELETE","Sa oled kustutamas");
define("_NOTOWNER","Ei ole torenti omanik");
define("_MESSAGETOALL","See sõnum saadeti kõikidele kasutajatele");
define("_TRYDIFFERENTUSERID","Viga! Proovi teist kasutaja ID'd.");
define("_HASBEENUSED","on kasutatud.");
define("_RETURNTOEDIT","Naase muutmiseks");
define("_ADMINUSERACTIVITY","Administratsioon - Kasutajate aktiivsus");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","aktiivsus");
define("_LINKS_MENU","lingid");
define("_NEWUSER_MENU","uus kasutaja");
define("_BACKUP_MENU","varunda");
define("_ALLUSERS","kõik kasutajad");
define("_NORECORDSFOUND","INFOT EI LEITUD");
define("_SHOWPREVIOUS","Eelmine");
define("_SHOWMORE","Näita veel");
define("_ACTIVITYSEARCH","Aktiivsuse otsing");
define("_FILE","Fail");
define("_ACTION","Tegevus");
define("_SEARCH","Otsing");
define("_ACTIVITYLOG","Aktiivsuse logi - Viimased");
define("_DAYS","päeva");
define("_IP","IP");
define("_TIMESTAMP","Kuupäeva formaat");
define("_USERDETAILS","Kasutaja seaded");
define("_HITS","Kordi");
define("_UPLOADACTIVITY","Üleslaadimise aktiivsus");
define("_JOINED","Liitus"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Viimati külastas"); // header for when the user last visited the site
define("_USERSACTIVITY","Aktiivsus"); // used for popup to display Activity next to users name
define("_NORMALUSER","Tavakasutaja"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administraator"); // used to describe an administrator's account type
define("_SUPERADMIN","Moderaator"); // used to describe Super Admin's account type
define("_EDIT","Muuda");
define("_USERADMIN","Administratsioon - Kasutajad"); // title of page for user administration
define("_EDITUSER","Muuda kasutajat");
define("_UPLOADPARTICIPATION","Üleslaadimisest osavõtmine");
define("_UPLOADS","Üleslaadimisi"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Osavõtmine protsentuaalselt");
define("_PARTICIPATIONSTATEMENT","Osavõtt ja ulesselaadimised viimased"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Lehevaatamisi kokku");
define("_THEME","Teema");
define("_USERTYPE","Kasutaja tüüp");
define("_NEWPASSWORD","Uus parool");
define("_CONFIRMPASSWORD","Korda parooli");
define("_HIDEOFFLINEUSERS","Peida väljalogitud kasutajad esilehel");
define("_UPDATE","Uuenda");
define("_USERIDREQUIRED","Kasutaja ID on vajalik.");
define("_PASSWORDLENGTH","Parool peab olema pikem kui 5 tähemärki.");
define("_PASSWORDNOTMATCH","Paroolid ei kattu.");
define("_PLEASECHECKFOLLOWING","Kontrolli järgnevaid"); // Displays errors after this statement
define("_NEWUSER","Uus kasutaja");
define("_PASSWORD","Parool");
define("_CREATE","Loo"); // button text to create a new user
define("_ADMINEDITLINKS","Administratsioon - Muuda linke");
define("_FULLURLLINK","Täispikk URL");
define("_BACKTOPARRENT","Kataloog tagasi"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Tirimise seaded");
define("_PERCENTDONE","Protsenti valmis");
define("_RETURNTOTORRENTS","Esilehele"); // Link at the bottom of each page
define("_DATE","Kuupäev");
define("_WROTE","kirjutas"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Saada kiri"); // Title of page
define("_TO","Kellele");
define("_FROM","Kellelt");
define("_YOURMESSAGE","Sinu kiri");
define("_SENDTOALLUSERS","Saada kõikidele kasutajatele");
define("_FORCEUSERSTOREAD","Sunni kasutaja(t/id) lugema"); // Admin option in messaging
define("_SEND","Saada"); // Button to send private message
define("_PROFILE","Profiil");
define("_PROFILEUPDATEDFOR","Profiil uuendatud kasutajale"); // Profile updated for 'username'
define("_REPLY","Vasta"); // popup text for reply button
define("_MESSAGE","Sõnum");
define("_MESSAGES","Sõnumid"); // plural (more than one)
define("_RETURNTOMESSAGES","Naase postkasti"); // links to mailbox
define("_COMPOSE","Koosta"); // As in 'Compose a message' for button
define("_LANGUAGE","Keel"); // label
define("_QUEUELIST","Järjekord"); // Queuelist
define("_MYDIR","Minu kataloog"); // My Directory
define("_RSSTORRENTS","RSS Torrents"); // RSS Torrents
define("_SIZE","Suurus"); // File size
define("_LOGIN","Logi sisse"); // LOGIN button and title at login page
define("_TOTALUL","Kogu ülesselaadimine"); // Total upload at main page
define("_TOTALDL","Kogu allalaadimine"); // Total download at main page
define("_FREESPACE","Vaba ruum"); // Free space at main page
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-finnish.php
0,0 → 1,162
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Valitse torrent tiedosto");
define("_URLFILE","URL torrent tiedostoon");
define("_UPLOAD","Lisää");
define("_GETFILE","Lisää");
define("_TORRENTLINKS","Torrent Linkit");
define("_ONLINE","Online");
define("_OFFLINE","Offline");
define("_STORAGE","Varasto");
define("_DRIVESPACE","Levy tilaa");
define("_SERVERSTATS","Server Statistiikka / Kuka");
define("_DIRECTORYLIST","Hakemisto listaus");
define("_ALL","Kaikki");
define("_PAGEWILLREFRESH","Sivu päivittyy");
define("_SECONDS",":n sekunnin välein");
define("_TURNONREFRESH","Ota käyttöön sivun päivitys");
define("_TURNOFFREFRESH","Ota pois käytöstä sivun päivitys");
define("_WARNING","VAROITUS");
define("_DRIVESPACEUSED","Levy tila on käytetty!");
define("_ADMINMESSAGE","Sinulle on viesti Adminilta");
define("_TORRENTS","Torrentit");
define("_UPLOADHISTORY","Lataus Historia");
define("_MYPROFILE","Editoi profiiliasi");
define("_ADMINISTRATION","Administration");
define("_SENDMESSAGETO","Lähetä viesti");
define("_TORRENTFILE","Torrent tiedosto(t)");
define("_FILESIZE","Tiedoston koko");
define("_STATUS","Tila");
define("_ADMIN","Admin");
define("_BADFILE","viallinen tiedosto");
define("_DATETIMEFORMAT","d/m/y - h:i"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","d/m/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Arvioitu aika");
define("_DOWNLOADSPEED","Imurointi nopeus");
define("_UPLOADSPEED","Lähetys nopeus");
define("_SHARING","Sharing");
define("_USER","Käyttäjä");
define("_DONE","VALMIS");
define("_INCOMPLETE","KESKENERÄINEN");
define("_NEW","UUSI");
define("_TORRENTDETAILS","Torrentin tiedot");
define("_STOPDOWNLOAD","Pysäytä Torrent");
define("_RUNTORRENT","Aja Torrent");
define("_SEEDTORRENT","Seedaa Torrenttia");
define("_DELETE","Poista");
define("_ABOUTTODELETE","Olet poistamassa");
define("_NOTOWNER","Et omista tätä torrenttia");
define("_MESSAGETOALL","Tämä viesti lähetettiin kaikille käyttäjille");
define("_TRYDIFFERENTUSERID","Virhe, yritä eri USER ID:llä");
define("_HASBEENUSED","on käytetty.");
define("_RETURNTOEDIT","Palaa editoimaan");
define("_ADMINUSERACTIVITY","Administration - Käyttäjän aktiivisuus");
define("_ADMIN_MENU","Admin");
define("_ACTIVITY_MENU","Aktiivisuus");
define("_LINKS_MENU","Linkit");
define("_NEWUSER_MENU","Uusi käyttäjä");
define("_BACKUP_MENU","Varmuuskopioi");
define("_ALLUSERS","Kaikki Käyttäjät");
define("_NORECORDSFOUND","Ei löytynyt");
define("_SHOWPREVIOUS","Edellinen");
define("_SHOWMORE","Näytä enemmän");
define("_ACTIVITYSEARCH","Aktiivisuuden Etsintä");
define("_FILE","Tiedosto");
define("_ACTION","Teko");
define("_SEARCH","Etsi");
define("_ACTIVITYLOG","Aktiivisuus Logi - Viimeinen");
define("_DAYS","Päivään");
define("_IP","IP");
define("_TIMESTAMP","Aika leima");
define("_USERDETAILS","Käyttäjän tiedot");
define("_HITS","Osumaa");
define("_UPLOADACTIVITY","Lataus Aktiivisuus");
define("_JOINED","Liittyi"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Viimeksi vieraili"); // header for when the user last visited the site
define("_USERSACTIVITY","Activity"); // used for popup to display Activity next to users name
define("_NORMALUSER","Normaali käyttäjä"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrator"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Editoi");
define("_USERADMIN","Administration - Käyttäjä Admin"); // title of page for user administration
define("_EDITUSER","Editoi Käyttäjän tietoja");
define("_UPLOADPARTICIPATION","Osallistuminen latauksiin");
define("_UPLOADS","Latauksia"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Prosenttia latauksista");
define("_PARTICIPATIONSTATEMENT","Lataukset perustuu viimeiseen"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Vierailut sivulla");
define("_THEME","Teema");
define("_USERTYPE","Käyttäjän tyyppi");
define("_NEWPASSWORD","Uusi salasana");
define("_CONFIRMPASSWORD","Vahvista salasana");
define("_HIDEOFFLINEUSERS","Piilota offlinessä olevat käyttäjät aloitus sivulla");
define("_UPDATE","Päivitä");
define("_USERIDREQUIRED","Käyttäjä ID vaaditaan.");
define("_PASSWORDLENGTH","Salasanan täytyy olla vähintään 6 merkkiä.");
define("_PASSWORDNOTMATCH","Salasana ei täsmää.");
define("_PLEASECHECKFOLLOWING","Tarkista seuraava"); // Displays errors after this statement
define("_NEWUSER","Uusi käyttäjä");
define("_PASSWORD","Salasana");
define("_CREATE","Luo"); // button text to create a new user
define("_ADMINEDITLINKS","Administration - Editoi Linkkejä");
define("_FULLURLLINK","URL Linkki");
define("_BACKTOPARRENT","Takaisin ylempään hakemistoon"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Latauksen Tiedot");
define("_PERCENTDONE","Prosenttia valmis");
define("_RETURNTOTORRENTS","Palaa torrentteihin"); // Link at the bottom of each page
define("_DATE","Päiväys");
define("_WROTE","kirjoitti"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Lähetä Viesti"); // Title of page
define("_TO","Kenelle");
define("_FROM","Keneltä");
define("_YOURMESSAGE","Viestisi");
define("_SENDTOALLUSERS","Lähetä kaikille käyttäjille");
define("_FORCEUSERSTOREAD","Pakota käyttäjä(t) lukemaan"); // Admin option in messaging
define("_SEND","Lähetä"); // Button to send private message
define("_PROFILE","Profiili");
define("_PROFILEUPDATEDFOR","Profiili Päivitetty "); // Profile updated for 'username'
define("_REPLY","Vastaa"); // popup text for reply button
define("_MESSAGE","Viesti");
define("_MESSAGES","Viestit"); // plural (more than one)
define("_RETURNTOMESSAGES","Palaa Viesteihin");
define("_COMPOSE","Vastaa"); // As in 'Compose a message' for button
define("_LANGUAGE","Kieli"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-french.php
0,0 → 1,162
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Choisissez un torrent à télécharger");
define("_URLFILE","URL pour le dossier de torrent");
define("_UPLOAD","Téléchargement");
define("_GETFILE","Charger le Fichier");
define("_TORRENTLINKS","Liens De Torrents");
define("_ONLINE","En Ligne");
define("_OFFLINE","Hors Ligne");
define("_STORAGE","Stockage");
define("_DRIVESPACE","Espace Disque");
define("_SERVERSTATS","Stats Du Serveur / Qui");
define("_DIRECTORYLIST","Listage répertoire");
define("_ALL","Tous");
define("_PAGEWILLREFRESH","La Page Recharge Tous/Toutes les");
define("_SECONDS","Secondes");
define("_TURNONREFRESH","Activer le Rechargement Auto");
define("_TURNOFFREFRESH","Arrêter le Rechargement Auto");
define("_WARNING","AVERTISSEMENT");
define("_DRIVESPACEUSED","L'espace disque est saturé!");
define("_ADMINMESSAGE","Vous avez un message d'un administrateur dans votre boîte de messages.");
define("_TORRENTS","Torrents");
define("_UPLOADHISTORY","Historique Des Téléchargements");
define("_MYPROFILE","Éditer Mon Profil");
define("_ADMINISTRATION","Administration");
define("_SENDMESSAGETO","Envoyez un message à");
define("_TORRENTFILE","Fichier Torrent");
define("_FILESIZE","Taille Du Fichier");
define("_STATUS","Statut");
define("_ADMIN","Admin");
define("_BADFILE","Mauvais Fichier");
define("_DATETIMEFORMAT","d/m/y g:i a"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","d/m/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Temps Estimé");
define("_DOWNLOADSPEED","Vitesse Download");
define("_UPLOADSPEED","Vitesse Upload");
define("_SHARING","Partage");
define("_USER","Utilisateur");
define("_DONE","FAIT");
define("_INCOMPLETE","INACHEVÉ");
define("_NEW","NOUVEAU");
define("_TORRENTDETAILS","Détails du Torrent");
define("_STOPDOWNLOAD","Arrêtez le Téléchargement du Torrent");
define("_RUNTORRENT","Lancer le Torrent");
define("_SEEDTORRENT","Partager le Torrent");
define("_DELETE","Effacer");
define("_ABOUTTODELETE","Vous êtes sur le point de supprimer");
define("_NOTOWNER","Pas propriétaire du torrent");
define("_MESSAGETOALL","Ce message a été envoyé à TOUS LES UTILISATEURS");
define("_TRYDIFFERENTUSERID","Erreur: Essayez un utilisateur différent.");
define("_HASBEENUSED","a été utilisé.");
define("_RETURNTOEDIT","Retour à l'édition");
define("_ADMINUSERACTIVITY","Administration - Activité D'Utilisateurs");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","activité");
define("_LINKS_MENU","liens");
define("_NEWUSER_MENU","nouvel utilisateur");
define("_BACKUP_MENU","sauvegarde");
define("_ALLUSERS","Tous les Utilisateurs");
define("_NORECORDSFOUND","PAS D'ENREGISTREMENT TROUVÉ");
define("_SHOWPREVIOUS","Précédent");
define("_SHOWMORE","Voir Plus");
define("_ACTIVITYSEARCH","Activité des Recherches");
define("_FILE","Fichier");
define("_ACTION","Action");
define("_SEARCH","Recherche");
define("_ACTIVITYLOG","Fichier de journalisation - Dernier");
define("_DAYS","Jours");
define("_IP","IP");
define("_TIMESTAMP","Temps");
define("_USERDETAILS","Détails de l'Utilisateur");
define("_HITS","Hits");
define("_UPLOADACTIVITY","Activité D'Upload");
define("_JOINED","à rejoint"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Dernière Visite"); // header for when the user last visited the site
define("_USERSACTIVITY","Activité"); // used for popup to display Activity next to users name
define("_NORMALUSER","Utilisateur Normal"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrateur"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Éditer");
define("_USERADMIN","Administration - Utilisateurs"); // title of page for user administration
define("_EDITUSER","Éditer L'Utilisateur");
define("_UPLOADPARTICIPATION","Participation au Téléchargement");
define("_UPLOADS","Uploads"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Pourcentage de Participation");
define("_PARTICIPATIONSTATEMENT","La participation et les téléchargements basés sur les derniers"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Pages Vues au Total");
define("_THEME","Thème");
define("_USERTYPE","Type D'Utilisateur");
define("_NEWPASSWORD","Nouveau Mot de passe");
define("_CONFIRMPASSWORD","Confirmez Le Mot de passe");
define("_HIDEOFFLINEUSERS","Masquer les utilisateurs Hors-ligne de la page d'acceuil");
define("_UPDATE","Mise à jour");
define("_USERIDREQUIRED","L'identification de l'utilisateur est exigée.");
define("_PASSWORDLENGTH","Le mot de passe doit avoir 6 caractères ou plus.");
define("_PASSWORDNOTMATCH","Les mots de passe sont différents.");
define("_PLEASECHECKFOLLOWING","Veuillez vérifier ces informations"); // Displays errors after this statement
define("_NEWUSER","Nouvel Utilisateur");
define("_PASSWORD","Mot de passe");
define("_CREATE","Créer"); // button text to create a new user
define("_ADMINEDITLINKS","Administration - Modifier Les Liens");
define("_FULLURLLINK","URL Complète");
define("_BACKTOPARRENT","Répertoire Parent"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Détails Du Téléchargement");
define("_PERCENTDONE","Pourcentage Terminé");
define("_RETURNTOTORRENTS","Revenir aux Torrents"); // Link at the bottom of each page
define("_DATE","Date");
define("_WROTE","a écrit"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Envoyer un message"); // Title of page
define("_TO","À");
define("_FROM","De");
define("_YOURMESSAGE","Votre Message");
define("_SENDTOALLUSERS","Envoyez à tous les utilisateurs");
define("_FORCEUSERSTOREAD","Force Utilisateur(s) à lire"); // Admin option in messaging
define("_SEND","Envoyer"); // Button to send private message
define("_PROFILE","Profil");
define("_PROFILEUPDATEDFOR","Profil mis à jour pour"); // Profile updated for 'username'
define("_REPLY","Répondre"); // popup text for reply button
define("_MESSAGE","Message");
define("_MESSAGES","Messages"); // plural (more than one)
define("_RETURNTOMESSAGES","Retourner aux messages");
define("_COMPOSE","Ecrire"); // As in 'Compose a message' for button
define("_LANGUAGE","Langue"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-galician.php
0,0 → 1,184
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
/**************************************************************************/
/* TorrentFlux - Cliente de Torrent para PHP
/* ============================================
/*
/* Neste arquivo se encuentran todos los mesaxes del sistema.
/*
/* Se queres contribuir cunha traducción no teu idioma, envialle un email
/* có arquivo a qrome@yahoo.com. Mantén por favor a orde orixinal,
/* e so unha mesaxe por liña; revisa tamén a tua traducción polo menos duas veces!
/*
/* Recorda que hai que cambiar a frase entre comillas, non a que está en maiúsculas!
/*
/* Se precisas usar comillas, (") recorda engadir unha diagonal o revés (\),
/* para que se vexa así: Isto é \"texto con comillas\" así.
/* E, se usas código HTML, revísao duas veces.
/*
/* Traducción o galego por Roberto Salgado. A.K.A. DRoBeR
/* E-mail: drober@gmail.com
/*
/**************************************************************************/
 
 
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Seleccione un Torrent para subir");
define("_URLFILE","URL do arquivo Torrent");
define("_UPLOAD","Subir");
define("_GETFILE","Baixar");
define("_TORRENTLINKS","Enlaces Torrent");
define("_ONLINE","En Líña");
define("_OFFLINE","Fora de Líña");
define("_STORAGE","Almacenamento");
define("_DRIVESPACE","Espacio Dispoñible");
define("_SERVERSTATS","Estadísticas / Quén");
define("_DIRECTORYLIST","Listado do Directorio");
define("_ALL","Todos");
define("_PAGEWILLREFRESH","A páxina actualizarase en");
define("_SECONDS","segundos");
define("_TURNONREFRESH","ACTIVAR Actualización Automática");
define("_TURNOFFREFRESH","DESACTIVAR Actualización Automática");
define("_WARNING","ADVERTENCIA");
define("_DRIVESPACEUSED","de espacio no disco está sendo usado!");
define("_ADMINMESSAGE","Ten unha mesaxe dun administrador no seu buzón de mesaxes.");
define("_TORRENTS","Torrentes");
define("_UPLOADHISTORY","Historial de Subidas");
define("_MYPROFILE","Cambiar mi Perfil");
define("_ADMINISTRATION","Administración");
define("_SENDMESSAGETO","Enviarlle unha mesaxe a");
define("_TORRENTFILE","Arquivo Torrent");
define("_FILESIZE","Tamaño");
define("_STATUS","Estado");
define("_ADMIN","Admin");
define("_BADFILE","arquivo incorrecto");
define("_DATETIMEFORMAT","d/m/y g:i a"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","d/m/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Tempo Estimado");
define("_DOWNLOADSPEED","Velocidade de Baixada");
define("_UPLOADSPEED","Velocidade de Subida");
define("_SHARING","Compartindo");
define("_USER","Usuario");
define("_DONE","FINALIZADO");
define("_INCOMPLETE","INCOMPLETO");
define("_NEW","NOVO");
define("_TORRENTDETAILS","Detalles do Torrente");
define("_STOPDOWNLOAD","Deter baixada do Torrente");
define("_RUNTORRENT","Executar Torrente");
define("_SEEDTORRENT","Alimentar Torrente");
define("_DELETE","Borrar");
define("_ABOUTTODELETE","Está a punto de borrar");
define("_NOTOWNER","Ese Torrent non é seu");
define("_MESSAGETOALL","Esta mesaxe é para TÓDOLOS USUARIOS");
define("_TRYDIFFERENTUSERID","Error: Intenta outra ID de Usuario");
define("_HASBEENUSED","foi usado.");
define("_RETURNTOEDIT","Voltar a facer cambios");
define("_ADMINUSERACTIVITY","Administración - Actividades de Usuarios");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","actividade");
define("_LINKS_MENU","enlaces");
define("_NEWUSER_MENU","novo usuario");
define("_BACKUP_MENU","respaldo");
define("_ALLUSERS","Tódolos Usuarios");
define("_NORECORDSFOUND","REXISTROS NON ENCONTRADOS");
define("_SHOWPREVIOUS","Previo");
define("_SHOWMORE","Ver Máis");
define("_ACTIVITYSEARCH","Búsqueda");
define("_FILE","Arquivo");
define("_ACTION","Acción");
define("_SEARCH","Búsqueda");
define("_ACTIVITYLOG","Bitácora dós últimos");
define("_DAYS","días");
define("_IP","IP");
define("_TIMESTAMP","Fecha e Hora");
define("_USERDETAILS","Detalles do Usuario");
define("_HITS","Vistas");
define("_UPLOADACTIVITY","Actividade de Subida");
define("_JOINED","Membro dende"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Última Visita"); // header for when the user last visited the site
define("_USERSACTIVITY","Actividade"); // used for popup to display Activity next to users name
define("_NORMALUSER","Usuario Normal"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrador"); // used to describe anadministrator's account type
define("_SUPERADMIN","Super Administrador"); // used to describe Super Admin's account type
define("_EDIT","Editar");
define("_USERADMIN","Administración de Usuarios"); // title of page for user administration
define("_EDITUSER","Editar Usuario");
define("_UPLOADPARTICIPATION","Participación en Subidas");
define("_UPLOADS","Subidas"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","% de Participación");
define("_PARTICIPATIONSTATEMENT","Participación e Subidas basados nos últimos"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Vistas Totales da Páxina");
define("_THEME","Tema");
define("_USERTYPE","Tipo de Usuario");
define("_NEWPASSWORD","Nova crave");
define("_CONFIRMPASSWORD","Confirme a súa crave");
define("_HIDEOFFLINEUSERS","Esconder Usuarios non conectados no inicio");
define("_UPDATE","Actualizar");
define("_USERIDREQUIRED","Se requiere ID de usuario.");
define("_PASSWORDLENGTH","Crave debe constar de máis de 6 caracteres.");
define("_PASSWORDNOTMATCH","As craves no coinciden.");
define("_PLEASECHECKFOLLOWING","Por favor revise o seguinte:"); //Displays errors after this statement
define("_NEWUSER","Novo Usuario");
define("_PASSWORD","Crave");
define("_CREATE","Crear"); // button text to create a new user
define("_ADMINEDITLINKS","Administración de Enlaces");
define("_FULLURLLINK","URL Compreto do Enlace");
define("_BACKTOPARRENT","Voltar o Directorio anterior"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Detalles da Baixada");
define("_PERCENTDONE","% acabado");
define("_RETURNTOTORRENTS","Voltar os Torrentes"); // Link at the bottom of each page
define("_DATE","Fecha");
define("_WROTE","Escribíu"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Enviar Mesaxe"); // Title of page
define("_TO","Para");
define("_FROM","De");
define("_YOURMESSAGE","Sua Mesaxe");
define("_SENDTOALLUSERS","Enviar a tódolos Usuarios");
define("_FORCEUSERSTOREAD","Obrigar o (os) usuario/s a leer?"); // Admin option in messaging
define("_SEND","Enviar"); // Button to send private message
define("_PROFILE","Perfil");
define("_PROFILEUPDATEDFOR","Perfil Actualizado para"); // Profile updatedfor 'username'
define("_REPLY","Responder"); // popup text for reply button
define("_MESSAGE","Mesaxe");
define("_MESSAGES","Mesaxes"); // plural (more than one)
define("_RETURNTOMESSAGES","Voltar as Mesaxes");
define("_COMPOSE","Compoñer"); // As in 'Compose a message' for button
define("_LANGUAGE","Idioma"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-german.php
0,0 → 1,163
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
define("_CHARSET","iso-8859-1");
define("_SELECTFILE","Wähle eine Torrent für Upload aus");
define("_URLFILE","URL der Torrent Datei");
define("_UPLOAD","Upload");
define("_GETFILE","Hole Datei");
define("_TORRENTLINKS","Torrent Links");
define("_ONLINE","Online");
define("_OFFLINE","Offline");
define("_STORAGE","Speicherkapazität");
define("_DRIVESPACE","Platten Platz");
define("_SERVERSTATS","Server Stats / Who");
define("_DIRECTORYLIST","Verzeichnis Liste");
define("_ALL","Alles");
define("_PAGEWILLREFRESH","Erneuter Seitenaufbau in");
define("_SECONDS","Sekunden");
define("_TURNONREFRESH","Schalte Seitenaufbau AN");
define("_TURNOFFREFRESH","Schalte Seitenaufbau AUS");
define("_WARNING","WARNUNG");
define("_DRIVESPACEUSED","Platten Platz ist benutzt!");
define("_ADMINMESSAGE","Sie haben eine Nachricht vom Administrator in Ihrem Postfach.");
define("_TORRENTS","Torrents");
define("_UPLOADHISTORY","Upload Historie");
define("_MYPROFILE","Bearbeite Mein Profil");
define("_ADMINISTRATION","Administration");
define("_SENDMESSAGETO","Sende eine Nachricht an");
define("_TORRENTFILE","Torrent Datei");
define("_FILESIZE","Datei Größe");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","fehlerhafte Datei");
define("_DATETIMEFORMAT","d/m/y g:i"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","d/m/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Voraussichtliche Ankunftszeit");
define("_DOWNLOADSPEED","Download Speed");
define("_UPLOADSPEED","Upload Speed");
define("_SHARING","Geteilt");
define("_USER","Benutzer");
define("_DONE","FERTIG");
define("_INCOMPLETE","UNVOLLSTÄNDIG");
define("_NEW","NEU");
define("_TORRENTDETAILS","Torrent Details");
define("_STOPDOWNLOAD","Halte Torrent Download an");
define("_RUNTORRENT","Starte Torrent");
define("_SEEDTORRENT","Seed Torrent");
define("_DELETE","Löschen");
define("_ABOUTTODELETE","Möchten Sie löschen");
define("_NOTOWNER","Sie sind nicht der Besitzer des Torrent");
define("_AUTHORIZATIONFAILED","Authorization FAILED. Action has been logged.");
define("_MESSAGETOALL","Diese Nachricht wurde an ALLE Benutzer geschickt");
define("_TRYDIFFERENTUSERID","Fehler: Versuchen Sie eine andere Benutzer ID.");
define("_HASBEENUSED","wurde benutzt.");
define("_RETURNTOEDIT","Zurück zum Bearbeiten");
define("_ADMINUSERACTIVITY","Administration - Benutzer Aktivität");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","aktivität");
define("_LINKS_MENU","links");
define("_NEWUSER_MENU","Neuer Benutzer");
define("_BACKUP_MENU","Sicherung");
define("_ALLUSERS","Alle Benutzer");
define("_NORECORDSFOUND","KEINE EINTRÄGE GEFUNDEN");
define("_SHOWPREVIOUS","Vorhergehende");
define("_SHOWMORE","Zeige mehr");
define("_ACTIVITYSEARCH","Suche Aktivität");
define("_FILE","Datei");
define("_ACTION","Aktion");
define("_SEARCH","Suche");
define("_ACTIVITYLOG","Aktivitäts Log - Letzter Eintrag");
define("_DAYS","Tage");
define("_IP","IP");
define("_TIMESTAMP","Zeit Stempel");
define("_USERDETAILS","Benutzer Details");
define("_HITS","Treffer");
define("_UPLOADACTIVITY","Upload Aktivität");
define("_JOINED","Beigetreten"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Letzter Besuch"); // header for when the user last visited the site
define("_USERSACTIVITY","Aktivität"); // used for popup to display Activity next to users name
define("_NORMALUSER","Normaler Benutzer"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrator"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Bearbeite");
define("_USERADMIN","Administration - Benutzer Admin"); // title of page for user administration
define("_EDITUSER","Bearbeite Benutzer");
define("_UPLOADPARTICIPATION","Upload Beteiligung");
define("_UPLOADS","Uploads"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Pronzentuale Beteiligung");
define("_PARTICIPATIONSTATEMENT","Beteiligung und Uploads"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Seitenaufrufe gesamt");
define("_THEME","Thema");
define("_USERTYPE","Benutzer Typ");
define("_NEWPASSWORD","Neues Passwort");
define("_CONFIRMPASSWORD","Bestätige Passwort");
define("_HIDEOFFLINEUSERS","Verstecke Offline Benutzer auf der Home Page");
define("_UPDATE","Aktualisierung");
define("_USERIDREQUIRED","Benutzer ID benötigt.");
define("_PASSWORDLENGTH","Ihr Passwort muss sechs oder mehr Zeichen haben.");
define("_PASSWORDNOTMATCH","Passwörter stimmen nicht.");
define("_PLEASECHECKFOLLOWING","Bitte überprüfen Sie folgendes"); // Displays errors after this statement
define("_NEWUSER","Neuer Benutzer");
define("_PASSWORD","Passwort");
define("_CREATE","Erstellen"); // button text to create a new user
define("_ADMINEDITLINKS","Administration - Editiere Links");
define("_FULLURLLINK","Kompletter URL Link");
define("_BACKTOPARRENT","Zurück zum übergeordneten Verzeichnis"); // indicates going back to parrent directory
define("_DOWNLOADDETAILS","Download Details");
define("_PERCENTDONE","Prozent fertig");
define("_RETURNTOTORRENTS","Zurück zu den Torrents"); // Link at the bottom of each page
define("_DATE","Datum");
define("_WROTE","schrieb"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Sende eine Nachricht"); // Title of page
define("_TO","An");
define("_FROM","Von");
define("_YOURMESSAGE","Ihre Nachricht");
define("_SENDTOALLUSERS","Sende an Alle Benutzer");
define("_FORCEUSERSTOREAD","Zwinge Benutzer zum Lesen"); // Admin option in messaging
define("_SEND","Senden"); // Button to send private message
define("_PROFILE","Profil");
define("_PROFILEUPDATEDFOR","Profil aktualisiert für"); // Profile updated for 'username'
define("_REPLY","Antworte"); // popup text for reply button
define("_MESSAGE","Nachricht");
define("_MESSAGES","Nachrichten"); // plural (more than one)
define("_RETURNTOMESSAGES","Zuroück zu den Nachrichten");
define("_COMPOSE","Erstellen"); // As in 'Compose a message' for button
define("_LANGUAGE","Sprache"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-hungarian.php
0,0 → 1,165
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/* Translated by: Sore Wa Himitsu Desu ;)
/* Thanks to: Mocsok&Tygryss
/* Dedicated to: The pervs of #Sailormoon.hu
/**************************************************************************/
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Torrent kiválasztása feltöltéshez");
define("_URLFILE","A Torrent fájl URL hivatkozása");
define("_UPLOAD","Feltöltés");
define("_GETFILE","Fájl töltése");
define("_TORRENTLINKS","Torrent Hivatkozások");
define("_ONLINE","Bejelentkezve");
define("_OFFLINE","Kijelentkezve");
define("_STORAGE","Tárolókapacitás");
define("_DRIVESPACE","Meghajtó Kihasználtság");
define("_SERVERSTATS","Szerver Statisztikák / Felhasználók");
define("_DIRECTORYLIST","Könyvtárlista");
define("_ALL","Összes");
define("_PAGEWILLREFRESH","Az Oldal Minden");
define("_SECONDS","Másodpercben Frissül");
define("_TURNONREFRESH","Oldalfrissítés Bekapcsolása");
define("_TURNOFFREFRESH","Oldalfrissítés Kikapcsolása");
define("_WARNING","FIGYELMEZTETÉS");
define("_DRIVESPACEUSED","Helyhiány a meghajtón!");
define("_ADMINMESSAGE","Üzenete érkezett egy Rendszergazdától.");
define("_TORRENTS","Torrentek");
define("_UPLOADHISTORY","Feltöltési Napló");
define("_MYPROFILE","Profil Szerkesztése");
define("_ADMINISTRATION","Adminisztráció");
define("_SENDMESSAGETO","Üzenet küldése a következõ felhasználónak");
define("_TORRENTFILE","Torrent Fájl");
define("_FILESIZE","Fájl Méret");
define("_STATUS","Állapot");
define("_ADMIN","Mûvelet");
define("_BADFILE","hibás fájl");
define("_DATETIMEFORMAT","y/m/d g:i"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","y/m/d"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Becsült Idõ");
define("_DOWNLOADSPEED","Letöltési Sebesség");
define("_UPLOADSPEED","Feltöltési Sebesség");
define("_SHARING","Megosztás");
define("_USER","Felhasználó");
define("_DONE","KÉSZ");
define("_INCOMPLETE","BEFEJEZETLEN");
define("_NEW","ÚJ");
define("_TORRENTDETAILS","Torrent Adatok");
define("_STOPDOWNLOAD","Torrent Letöltés Leállítása");
define("_RUNTORRENT","Torrent Indítása");
define("_SEEDTORRENT","Torrent Seed-elése");
define("_DELETE","Töröl");
define("_ABOUTTODELETE","Törölni készül");
define("_NOTOWNER","Nem a Torrent Tulajdonosa");
define("_MESSAGETOALL","Ez az üzenet MINDEN FELHASZNÁLÓNAK el lett küldve");
define("_TRYDIFFERENTUSERID","Hiba: Próbáljon másik Felhasználói Azonosítót.");
define("_HASBEENUSED","már használt.");
define("_RETURNTOEDIT","Vissza a Szerkesztéshez");
define("_ADMINUSERACTIVITY","Adminisztráció - Felhasználói Aktivitás");
define("_ADMIN_MENU","felügyelet");
define("_ACTIVITY_MENU","Aktivitás");
define("_LINKS_MENU","hivatkozások");
define("_NEWUSER_MENU","új felhasználó");
define("_BACKUP_MENU","archiválás");
define("_ALLUSERS","Minden Felhasználó");
define("_NORECORDSFOUND","NINCS BEJEGYZÉS");
define("_SHOWPREVIOUS","Elõzõ");
define("_SHOWMORE","További bejegyzések");
define("_ACTIVITYSEARCH","Keresés");
define("_FILE","Fájl");
define("_ACTION","Mûvelet");
define("_SEARCH","Keresés");
define("_ACTIVITYLOG","Aktivitás Napló - Utolsó");
define("_DAYS","Nap");
define("_IP","IP");
define("_TIMESTAMP","Dátum");
define("_USERDETAILS","Felhasználói Adatok");
define("_HITS","Találat");
define("_UPLOADACTIVITY","Feltöltési Aktivitás");
define("_JOINED","Csatlakozott"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Legutoljára"); // header for when the user last visited the site
define("_USERSACTIVITY","naplóbejegyzései"); // used for popup to display Activity next to users name
define("_NORMALUSER","Felhasználó"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Rendszergazda"); // used to describe an administrator's account type
define("_SUPERADMIN","Szuper Rendszergazda"); // used to describe Super Admin's account type
define("_EDIT","Módosít");
define("_USERADMIN","Adminisztráció - Felhasználó Karbantartás"); // title of page for user administration
define("_EDITUSER","Felhasználó Módosítása");
define("_UPLOADPARTICIPATION","Feltöltési Részesedés");
define("_UPLOADS","Feltöltések"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Százalék Részesedés");
define("_PARTICIPATIONSTATEMENT","A Részesedés és Feltöltés számítása visszamenõleg"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Összes oldallátogatás");
define("_THEME","Téma");
define("_USERTYPE","Felhasználótípus");
define("_NEWPASSWORD","Új Jelszó");
define("_CONFIRMPASSWORD","Jelszó Megerõsítése");
define("_HIDEOFFLINEUSERS","Kijelentkezett Felhasználók Elrejtése a Fõoldalon");
define("_UPDATE","Alkalmaz");
define("_USERIDREQUIRED","Felhasználó Azonosító Szükséges.");
define("_PASSWORDLENGTH","A Jelszónak legalább 6 karakter hosszúnak kell lennie.");
define("_PASSWORDNOTMATCH","A jelszók nem egyeznek.");
define("_PLEASECHECKFOLLOWING","Kérem ellenõrizze a következõket"); // Displays errors after this statement
define("_NEWUSER","Új Felhasználó");
define("_PASSWORD","Jelszó");
define("_CREATE","Létrehoz"); // button text to create a new user
define("_ADMINEDITLINKS","Adminisztráció - Hivatkozások Szerkesztése");
define("_FULLURLLINK","Teljes URL hivatkozás");
define("_BACKTOPARRENT","Vissza a Fõkönyvtárhoz"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Letöltési Adatok");
define("_PERCENTDONE","Százalék Kész");
define("_RETURNTOTORRENTS","Vissza a Torrentekhez"); // Link at the bottom of each page
define("_DATE","Dátum");
define("_WROTE","írta"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Üzenet küldése"); // Title of page
define("_TO","Kinek");
define("_FROM","Kitõl");
define("_YOURMESSAGE","Üzenet");
define("_SENDTOALLUSERS","MINDEN Felhasználónak Elküld");
define("_FORCEUSERSTOREAD","Felhasználó(k) Kényszerítése az Üzenet olvasására"); // Admin option in messaging
define("_SEND","Küld"); // Button to send private message
define("_PROFILE","Profil");
define("_PROFILEUPDATEDFOR","Új Profil Alkalmazva:"); // Profile updated for 'username'
define("_REPLY","Válasz"); // popup text for reply button
define("_MESSAGE","Üzenet");
define("_MESSAGES","Üzenetek"); // plural (more than one)
define("_RETURNTOMESSAGES","Vissza az Üzenetekhez");
define("_COMPOSE","Üzenet írása"); // As in 'Compose a message' for button
define("_LANGUAGE","Nyelv"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-italian.php
0,0 → 1,162
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Scegli un Torrent da caricare");
define("_URLFILE","URL del File Torrent");
define("_UPLOAD","Upload");
define("_GETFILE","Scarica File");
define("_TORRENTLINKS","Torrent Links");
define("_ONLINE","Online");
define("_OFFLINE","Offline");
define("_STORAGE","Memoria");
define("_DRIVESPACE","Spazio Disco");
define("_SERVERSTATS","Statistiche / Chi");
define("_DIRECTORYLIST","Lista Directory");
define("_ALL","Tutti");
define("_PAGEWILLREFRESH","Questa pagina si aggiorna ogni");
define("_SECONDS","Secondi");
define("_TURNONREFRESH","Abilita aggiornamento pagina");
define("_TURNOFFREFRESH","Disabilita aggiornamento pagina");
define("_WARNING","ATTENZIONE");
define("_DRIVESPACEUSED","Lo spazio disco è usato!");
define("_ADMINMESSAGE","Hai un messaggio dall'amministratore nella tua casella messaggi.");
define("_TORRENTS","Torrents");
define("_UPLOADHISTORY","Cronologia Uploads");
define("_MYPROFILE","Modifica il mio profilo");
define("_ADMINISTRATION","Amministrazione");
define("_SENDMESSAGETO","Manda un messaggio a");
define("_TORRENTFILE","File Torrent");
define("_FILESIZE","Dimensioni file");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","file corrotto");
define("_DATETIMEFORMAT","d/m/y g:i a"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","d/m/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Tempo stimato");
define("_DOWNLOADSPEED","Velocità download");
define("_UPLOADSPEED","Velocità upload");
define("_SHARING","Condivisione");
define("_USER","Utente");
define("_DONE","FATTO");
define("_INCOMPLETE","INCOMPLETO");
define("_NEW","NUOVO");
define("_TORRENTDETAILS","Dettagli Torrent");
define("_STOPDOWNLOAD","Ferma Download Torrent");
define("_RUNTORRENT","Esegui Torrent");
define("_SEEDTORRENT","Seed Torrent");
define("_DELETE","Elimina");
define("_ABOUTTODELETE","Stai per cancellare");
define("_NOTOWNER","Non proprietario del torrent");
define("_MESSAGETOALL","Questo messaggio è stato spedito a TUTTI GLI UTENTI");
define("_TRYDIFFERENTUSERID","Errore: Prova un altro User ID.");
define("_HASBEENUSED","è stato usato.");
define("_RETURNTOEDIT","Ritorna a Modifica");
define("_ADMINUSERACTIVITY","Amministrazione - Attività utente");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","attività");
define("_LINKS_MENU","links");
define("_NEWUSER_MENU","nuovo utente");
define("_BACKUP_MENU","backup");
define("_ALLUSERS","Tutti gli utenti");
define("_NORECORDSFOUND","NESSUN RECORD TROVATO");
define("_SHOWPREVIOUS","Precedente");
define("_SHOWMORE","Visualizza di più");
define("_ACTIVITYSEARCH","Ricerca attività");
define("_FILE","File");
define("_ACTION","Azione");
define("_SEARCH","Ricerca");
define("_ACTIVITYLOG","Log Attività - Ultimo");
define("_DAYS","Giorni");
define("_IP","IP");
define("_TIMESTAMP","Data");
define("_USERDETAILS","Dettagli utente");
define("_HITS","Hits");
define("_UPLOADACTIVITY","Attività upload");
define("_JOINED","Primo login"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Ultima visita"); // header for when the user last visited the site
define("_USERSACTIVITY","Attività"); // used for popup to display Activity next to users name
define("_NORMALUSER","Utente Normale"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Amministratore"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Modifica");
define("_USERADMIN","Amministrazione - Utente admin"); // title of page for user administration
define("_EDITUSER","Modifica Utente");
define("_UPLOADPARTICIPATION","Partecipazione Upload");
define("_UPLOADS","Uploads"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Percentuale partecipazione");
define("_PARTICIPATIONSTATEMENT","Partecipazione e uploads basati sugli ultimi"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Page Views totali");
define("_THEME","Tema");
define("_USERTYPE","Tipo Utente");
define("_NEWPASSWORD","Nuova Password");
define("_CONFIRMPASSWORD","Conferma Password");
define("_HIDEOFFLINEUSERS","Nascondi utenti offline nella Home Page");
define("_UPDATE","Aggiorna");
define("_USERIDREQUIRED","User ID è obbligatorio.");
define("_PASSWORDLENGTH","La password deve essere di 6 o più caratteri.");
define("_PASSWORDNOTMATCH","Le Passwords non corrispondono.");
define("_PLEASECHECKFOLLOWING","Controlla i seguenti campi"); // Displays errors after this statement
define("_NEWUSER","Nuovo utente");
define("_PASSWORD","Password");
define("_CREATE","Crea"); // button text to create a new user
define("_ADMINEDITLINKS","Amministrazione - Modifica links");
define("_FULLURLLINK","URL completo Link");
define("_BACKTOPARRENT","Directory superiore"); // indicates going back to parrent directory
define("_DOWNLOADDETAILS","Dettagli Download");
define("_PERCENTDONE","Percentuale Scaricata");
define("_RETURNTOTORRENTS","Ritorna ai Torrents"); // Link at the bottom of each page
define("_DATE","Data");
define("_WROTE","ha scritto"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Manda un messaggio"); // Title of page
define("_TO","A");
define("_FROM","Da");
define("_YOURMESSAGE","Il tuo messaggio");
define("_SENDTOALLUSERS","Manda a tutti gli utenti");
define("_FORCEUSERSTOREAD","Forza la lettura"); // Admin option in messaging
define("_SEND","Invia"); // Button to send private message
define("_PROFILE","Profilo");
define("_PROFILEUPDATEDFOR","Profilo aggiornato per"); // Profile updated for 'username'
define("_REPLY","Rispondi"); // popup text for reply button
define("_MESSAGE","Messaggio");
define("_MESSAGES","Messaggi"); // plural (more than one)
define("_RETURNTOMESSAGES","Ritorna ai messaggi");
define("_COMPOSE","Componi"); // As in 'Compose a message' for button
define("_LANGUAGE","Lingua"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-norwegian.php
0,0 → 1,162
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
define("_SELECTFILE","Velg en torrent å laste opp");
define("_URLFILE","URL til torrent filen");
define("_UPLOAD","Last opp");
define("_GETFILE","Hent fil");
define("_TORRENTLINKS","Torrent Linker");
define("_ONLINE","Online");
define("_OFFLINE","Offline");
define("_STORAGE","Lagringsplass");
define("_DRIVESPACE","Disk størrelse");
define("_SERVERSTATS","Server Statistikk / Who");
define("_DIRECTORYLIST","Kataloglisting");
define("_ALL","Alle");
define("_PAGEWILLREFRESH","Siden vil oppdateres hvert");
define("_SECONDS","Sekunds intervall");
define("_TURNONREFRESH","Aktivere automatisk sideoppdatering");
define("_TURNOFFREFRESH","Deaktiver automatisk sideoppdatering");
define("_WARNING","ADVARSEL");
define("_DRIVESPACEUSED","Disken er full!");
define("_ADMINMESSAGE","Du har en melding fra en administrator i din meldingsboks.");
define("_TORRENTS","Torrenter");
define("_UPLOADHISTORY","Tidligere opplastinger");
define("_MYPROFILE","Rediger min profil");
define("_ADMINISTRATION","Administrasjon");
define("_SENDMESSAGETO","Send en melding til");
define("_TORRENTFILE","Torrent fil");
define("_FILESIZE","File størrelse");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","feil på filen");
define("_DATETIMEFORMAT","m/d/y g:i a"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","m/d/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Beregnet tid");
define("_DOWNLOADSPEED","Nedlasting");
define("_UPLOADSPEED","Opplasting");
define("_SHARING","Delingsratio");
define("_USER","Bruker");
define("_DONE","FERDIG");
define("_INCOMPLETE","INKOMPLETT");
define("_NEW","NY");
define("_TORRENTDETAILS","Detaljer");
define("_STOPDOWNLOAD","Stop nedlastingen");
define("_RUNTORRENT","Start nedlastingen");
define("_SEEDTORRENT","Seed torrenten");
define("_DELETE","Slett");
define("_ABOUTTODELETE","Du skal til å slette");
define("_NOTOWNER","Ikke eier av torrent");
define("_AUTHORIZATIONFAILED","Godkjenning feileit. Hendelsen har blitt logget.");
define("_MESSAGETOALL","Denne meldingen ble sendt til ALLE BRUKERE");
define("_TRYDIFFERENTUSERID","Feil: Prøv en annen bruker ID.");
define("_HASBEENUSED","has blitt brukt");
define("_RETURNTOEDIT","Tilbake til rediger");
define("_ADMINUSERACTIVITY","Administrasjon - Bruker aktivitet");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","aktivitet");
define("_LINKS_MENU","linker");
define("_NEWUSER_MENU","ny bruker");
define("_BACKUP_MENU","sikkerhetskopi");
define("_ALLUSERS","Alle brukere");
define("_NORECORDSFOUND","INGEN DATA FUNNET");
define("_SHOWPREVIOUS","Forrige");
define("_SHOWMORE","Vis mer");
define("_ACTIVITYSEARCH","Søk aktivitet");
define("_FILE","Fil");
define("_ACTION","Hendelse");
define("_SEARCH","Søk");
define("_ACTIVITYLOG","Aktivitets logg - siste");
define("_DAYS","Dager");
define("_IP","IP");
define("_TIMESTAMP","Tid");
define("_USERDETAILS","Bruker detaljer");
define("_HITS","Treff");
define("_UPLOADACTIVITY","Opplastingsaktivitet");
define("_JOINED","Ble medlem"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Besøkte sist"); // header for when the user last visited the site
define("_USERSACTIVITY","Aktivitet"); // used for popup to display Activity next to users name
define("_NORMALUSER","Normal bruker"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrator"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Rediger");
define("_USERADMIN","Administrasjon - Bruker admin"); // title of page for user administration
define("_EDITUSER","Rediger bruker");
define("_UPLOADPARTICIPATION","Opplastingsdeltagelse");
define("_UPLOADS","Opplastinger"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Prosent deltakelse");
define("_PARTICIPATIONSTATEMENT","Deltakelse og opplastinger de siste"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Totale sidevisninger");
define("_THEME","Tema");
define("_USERTYPE","Brukertype");
define("_NEWPASSWORD","Nytt passord");
define("_CONFIRMPASSWORD","Bekreft Password");
define("_HIDEOFFLINEUSERS","Skjul brukere som er offline på hovedsiden");
define("_UPDATE","Oppdater");
define("_USERIDREQUIRED","Bruker ID kreves.");
define("_PASSWORDLENGTH","Passordet må ha mer enn 6 tegn.");
define("_PASSWORDNOTMATCH","Passordene stemmer ikke.");
define("_PLEASECHECKFOLLOWING","Vennligst sjekk følgende"); // Displays errors after this statement
define("_NEWUSER","Ny bruker");
define("_PASSWORD","Passord");
define("_CREATE","Lag"); // button text to create a new user
define("_ADMINEDITLINKS","Administration - Edit Links");
define("_FULLURLLINK","Full URL Link");
define("_BACKTOPARRENT","Opp en katalog"); // indicates going back to parrent directory
define("_DOWNLOADDETAILS","Nedlastingsdetaljer");
define("_PERCENTDONE","Prosent ferdig");
define("_RETURNTOTORRENTS","Returner til torrenter"); // Link at the bottom of each page
define("_DATE","Dato");
define("_WROTE","skrev"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Send en melding"); // Title of page
define("_TO","Til");
define("_FROM","Fra");
define("_YOURMESSAGE","Din melding");
define("_SENDTOALLUSERS","Send til alle brukere");
define("_FORCEUSERSTOREAD","Tving bruker(e) til å lese"); // Admin option in messaging
define("_SEND","Send"); // Button to send private message
define("_PROFILE","Profil");
define("_PROFILEUPDATEDFOR","Profil oppdatert for"); // Profile updated for 'username'
define("_REPLY","Svar"); // popup text for reply button
define("_MESSAGE","Melding");
define("_MESSAGES","Meldinger"); // plural (more than one)
define("_RETURNTOMESSAGES","Returner til meldinger");
define("_COMPOSE","Ny melding"); // As in 'Compose a message' for button
define("_LANGUAGE","Språk"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-polish.php
0,0 → 1,165
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/*
/* Polish translation by Ragen <ragen@o2.pl>
/*
/**************************************************************************/
 
define("_CHARSET","iso-8859-2"); // if you don't know... then leave this as is.
define("_SELECTFILE","Wybierz Torrenta do wczytania");
define("_URLFILE","Adres URL z plikiem Torrenta");
define("_UPLOAD","Wczytaj");
define("_GETFILE","Pobierz");
define("_TORRENTLINKS","Linki z Torrentami");
define("_ONLINE","Dostêpni");
define("_OFFLINE","Niedostêpni");
define("_STORAGE","Zajête");
define("_DRIVESPACE","Miejce na dysku");
define("_SERVERSTATS","Statystyki serwera / Kto");
define("_DIRECTORYLIST","Katalog");
define("_ALL","Wszystko");
define("_PAGEWILLREFRESH","Strona odswie¿a siê co");
define("_SECONDS","sekund");
define("_TURNONREFRESH","W³±cz od¶wie¿anie strony");
define("_TURNOFFREFRESH","Wy³±cz od¶wie¿anie strony");
define("_WARNING","UWAGA");
define("_DRIVESPACEUSED","Brak miejsca na dysku!");
define("_ADMINMESSAGE","Masz w skrzynce wiadomo¶æ od administratora");
define("_TORRENTS","Torrenty");
define("_UPLOADHISTORY","Historia Przesy³ania");
define("_MYPROFILE","Edytuj Mój Profil");
define("_ADMINISTRATION","Administracja");
define("_SENDMESSAGETO","Wy¶lij Wiadomo¶æ do");
define("_TORRENTFILE","Plik Torrent");
define("_FILESIZE","Rozmiar Pliku");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","uszkodzony plik");
define("_DATETIMEFORMAT","d/m/y G:i"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","d/m/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Szacowany Czas");
define("_DOWNLOADSPEED","Prêdko¶æ ¶ci±gania");
define("_UPLOADSPEED","Prêdko¶æ przesy³ania");
define("_SHARING","Udostêpnione");
define("_USER","U¿ytkownik");
define("_DONE","UKOÑCZONY");
define("_INCOMPLETE","NIEKOMPLETNY");
define("_NEW","NOWY");
define("_TORRENTDETAILS","Szczegó³y Torrenta");
define("_STOPDOWNLOAD","Zatrzymaj Torrenta");
define("_RUNTORRENT","Uruchom Torrenta");
define("_SEEDTORRENT","Udostêpnij Torrenta");
define("_DELETE","Usuñ");
define("_ABOUTTODELETE","Usuwasz plik");
define("_NOTOWNER","Nie jeste¶ w³a¶cicielem tego Torrenta");
define("_MESSAGETOALL","Ta wiadomo¶æ zosta³a wys³ana do WSZYSTKICH");
define("_TRYDIFFERENTUSERID","B³±d: Spróbuj inne ID U¿ytkownika.");
define("_HASBEENUSED","ju¿ instnieje.");
define("_RETURNTOEDIT","Powrót do Edycji");
define("_ADMINUSERACTIVITY","Administracja - Aktywno¶æ U¿ytkowników");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","aktywno¶æ");
define("_LINKS_MENU","linki");
define("_NEWUSER_MENU","nowy u¿ytkownik");
define("_BACKUP_MENU","kopia zapasowa");
define("_ALLUSERS","Wszyscy U¿ytkownicy");
define("_NORECORDSFOUND","BRAK");
define("_SHOWPREVIOUS","Poprzednia");
define("_SHOWMORE","Poka¿ wiêcej");
define("_ACTIVITYSEARCH","Przeszukiwanie Aktywno¶ci");
define("_FILE","Plik");
define("_ACTION","Akcja");
define("_SEARCH","Szukaj");
define("_ACTIVITYLOG","Aktywno¶æ - Ostatnie");
define("_DAYS","Dni");
define("_IP","IP");
define("_TIMESTAMP","Data i Czas");
define("_USERDETAILS","Szczegó³y U¿ytkownia");
define("_HITS","Akcje");
define("_UPLOADACTIVITY","Aktywno¶æ Przesy³ania");
define("_JOINED","Utworzony"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Logowanie"); // header for when the user last visited the site
define("_USERSACTIVITY","Aktywno¶æ"); // used for popup to display Activity next to users name
define("_NORMALUSER","Normalny"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrator"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Edytuj");
define("_USERADMIN","Administracja - U¿ytkownik Admin"); // title of page for user administration
define("_EDITUSER","Edytuj U¿ytkowika");
define("_UPLOADPARTICIPATION","Udzia³ w Przesyle");
define("_UPLOADS","Przes³anych"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Procent Udzia³u");
define("_PARTICIPATIONSTATEMENT","Udzia³ i Przesy³ przez ostatnie"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Liczba Od¶wie¿eñ Strony");
define("_THEME","Temat");
define("_USERTYPE","Typ U¿ytkownika");
define("_NEWPASSWORD","Nowe Has³o");
define("_CONFIRMPASSWORD","Powtórz Has³o");
define("_HIDEOFFLINEUSERS","Ukryj U¿ytkowników Niedostêpnych");
define("_UPDATE","Uaktualnij");
define("_USERIDREQUIRED","ID U¿ytkownika jest wymagane.");
define("_PASSWORDLENGTH","Has³o musi siê sk³adaæ z 6 lub wiêcej znaków.");
define("_PASSWORDNOTMATCH","Has³a musz± byæ identyczne.");
define("_PLEASECHECKFOLLOWING","Sprawd¼ poni¿sze b³êdy"); // Displays errors after this statement
define("_NEWUSER","Nowy U¿ytkownik");
define("_PASSWORD","Has³o");
define("_CREATE","Utwórz"); // button text to create a new user
define("_ADMINEDITLINKS","Administracja - Edytuj Linki");
define("_FULLURLLINK","Pe³ny URL Linka");
define("_BACKTOPARRENT","Katalog Wy¿ej"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Szczegó³y ¦ci±gania");
define("_PERCENTDONE","Ukoñczono");
define("_RETURNTOTORRENTS","Powrót do Torrentów"); // Link at the bottom of each page
define("_DATE","Data");
define("_WROTE","zapisano"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Wy¶lij Wiadomo¶æ"); // Title of page
define("_TO","Do");
define("_FROM","Od");
define("_YOURMESSAGE","Twoja Wiadomo¶æ");
define("_SENDTOALLUSERS","Wy¶lij do Wszystkich");
define("_FORCEUSERSTOREAD","Wymu¶ Odebranie tej Wiadomo¶ci"); // Admin option in messaging
define("_SEND","Wy¶lij"); // Button to send private message
define("_PROFILE","Profil");
define("_PROFILEUPDATEDFOR","Profil Zaktualizowany dla"); // Profile updated for 'username'
define("_REPLY","Odpowiedz"); // popup text for reply button
define("_MESSAGE","Wiadomo¶æ");
define("_MESSAGES","Wiadomo¶ci"); // plural (more than one)
define("_RETURNTOMESSAGES","Powrót do Wiadomo¶ci");
define("_COMPOSE","Utwórz"); // As in 'Compose a message' for button
define("_LANGUAGE","Jêzyk"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-portuguese.php
0,0 → 1,170
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
/************************************************************************/
/* Note on the portuguese translation by Claudio Mossmann: */
/* March, 12, 2004 */
/* Some words like "upload", "download", "link", "server" et al... */
/* are in common use nowadays in Brazil so I guess it is better to */
/* leave them "as is" and do not translate at all by concision sake. */
/************************************************************************/
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Selecione um Torrent para upload");
define("_URLFILE","URL para o arquivo .torrent");
define("_UPLOAD","Upload");
define("_GETFILE","Get File");
define("_TORRENTLINKS","Torrent Links");
define("_ONLINE","Online");
define("_OFFLINE","Offline");
define("_STORAGE","Storage");
define("_DRIVESPACE","Espaço em disco");
define("_SERVERSTATS","Server Stats / Who");
define("_DIRECTORYLIST","Diretório");
define("_ALL","All");
define("_PAGEWILLREFRESH","A página será atualizada a cada");
define("_SECONDS","Segundos");
define("_TURNONREFRESH","LIGAR atualização da página");
define("_TURNOFFREFRESH","DESLIGAR atualização da página");
define("_WARNING","ATENÇÃO");
define("_DRIVESPACEUSED","Espaço em disco é utilizado!"); /* */
define("_ADMINMESSAGE","Há uma mensagem de um administrador para você na sua caixa de mensagens.");
define("_TORRENTS","Torrentes");
define("_UPLOADHISTORY","Upload History");
define("_MYPROFILE","Editar Meu Perfil");
define("_ADMINISTRATION","Administração");
define("_SENDMESSAGETO","Enviar uma Mensagem para");
define("_TORRENTFILE","Torrent File");
define("_FILESIZE","Tamanho do Arquivo");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","arquivo ruim/inapropriado");
define("_DATETIMEFORMAT","m/d/y g:i a"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","m/d/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Tempo Estimado");
define("_DOWNLOADSPEED","Velocidade de Download");
define("_UPLOADSPEED","Velocidade de Upload");
define("_SHARING","Compartilhando");
define("_USER","Usuário");
define("_DONE","PRONTO");
define("_INCOMPLETE","INCOMPLETO");
define("_NEW","NOVO");
define("_TORRENTDETAILS","Torrent Detalhes");
define("_STOPDOWNLOAD","Parar Download do Torrent");
define("_RUNTORRENT","Run Torrent");
define("_SEEDTORRENT","Seed Torrent");
define("_DELETE","Delete");
define("_ABOUTTODELETE","Você está prestes a apagar");
define("_NOTOWNER","Torrent não é de sua propriedade");
define("_MESSAGETOALL","Esta mensagem foi enviada para TODOS OS USUÁRIOS");
define("_TRYDIFFERENTUSERID","Erro: Tente um User ID diferente.");
define("_HASBEENUSED","foi usado.");
define("_RETURNTOEDIT","Retornar para Edição");
define("_ADMINUSERACTIVITY","Administração - Atividade do Usuário");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","atividade");
define("_LINKS_MENU","links");
define("_NEWUSER_MENU","novo usuário");
define("_BACKUP_MENU","backup");
define("_ALLUSERS","Todos os Usuários");
define("_NORECORDSFOUND","NENHUM REGISTRO ENCONTRADO");
define("_SHOWPREVIOUS","Prévio");
define("_SHOWMORE","Mostre Mais");
define("_ACTIVITYSEARCH","Pesquisa Atividade");
define("_FILE","Arquivo");
define("_ACTION","Ação");
define("_SEARCH","Pesquisa");
define("_ACTIVITYLOG","Registro de Atividade - Último");
define("_DAYS","Dias");
define("_IP","IP");
define("_TIMESTAMP","Time Stamp");
define("_USERDETAILS","Detalhes do Usuário");
define("_HITS","Hits");
define("_UPLOADACTIVITY","Atividade de Upload");
define("_JOINED","Aderiu em"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Última Visita"); // header for when the user last visited the site
define("_USERSACTIVITY","Atividade"); // used for popup to display Activity next to users name
define("_NORMALUSER","Usuário Normal"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrador"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Editar");
define("_USERADMIN","Administração - User Admin"); // title of page for user administration
define("_EDITUSER","Editar Usuário");
define("_UPLOADPARTICIPATION","Participação em Upload");
define("_UPLOADS","Uploads"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Participação Percentual");
define("_PARTICIPATIONSTATEMENT","Participação e Uploads basedos nos últimos"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Total Page Views");
define("_THEME","Tema");
define("_USERTYPE","Tipo de Usuário");
define("_NEWPASSWORD","Nova Senha");
define("_CONFIRMPASSWORD","Confirme a Senha");
define("_HIDEOFFLINEUSERS","Ocultar Usuários Offline na Home Page");
define("_UPDATE","Update");
define("_USERIDREQUIRED","User ID é requerido.");
define("_PASSWORDLENGTH","Senha deve ter 6 ou mais caracteres.");
define("_PASSWORDNOTMATCH","Senhas não conferem.");
define("_PLEASECHECKFOLLOWING","Verifique por favor o seguinte"); // Displays errors after this statement
define("_NEWUSER","Novo Usuário");
define("_PASSWORD","Senha");
define("_CREATE","Criar"); // button text to create a new user
define("_ADMINEDITLINKS","Administração - Editar Links");
define("_FULLURLLINK","URL Link Completo");
define("_BACKTOPARRENT","Retornar ao Diretório Pai"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Detalhes do Download");
define("_PERCENTDONE","Porcento Pronto");
define("_RETURNTOTORRENTS","Retornar pata Torrents"); // Link at the bottom of each page
define("_DATE","Date");
define("_WROTE","wrote"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Enviar Mensagem"); // Title of page
define("_TO","To");
define("_FROM","From");
define("_YOURMESSAGE","Sua Mensagem");
define("_SENDTOALLUSERS","Enviar a Todos Usuários");
define("_FORCEUSERSTOREAD","Force Usuário(s) a Ler"); // Admin option in messaging
define("_SEND","Enviar"); // Button to send private message
define("_PROFILE","Perfil");
define("_PROFILEUPDATEDFOR","Perfil Atualizado para"); // Profile updated for 'username'
define("_REPLY","Responder"); // popup text for reply button
define("_MESSAGE","Mensagem");
define("_MESSAGES","Mensagens"); // plural (more than one)
define("_RETURNTOMESSAGES","Retornar para Mensagens");
define("_COMPOSE","Compor Mensagem"); // As in 'Compose a message' for button
define("_LANGUAGE","Language"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-redneck.php
0,0 → 1,163
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
define("_CHARSET","iso-8859-1");
define("_SELECTFILE","Seleck a To'rent fo' upload");
define("_URLFILE","URL fo' th' To'rent File");
define("_UPLOAD","Put it Der");
define("_GETFILE","Git File");
define("_TORRENTLINKS","To'rent Links");
define("_ONLINE","Attend'n");
define("_OFFLINE","Not Here");
define("_STORAGE","Sto'age");
define("_DRIVESPACE","Sto'age Thingy");
define("_SERVERSTATS","Servah Stats / Huh?");
define("_DIRECTORYLIST","Direcko'y List");
define("_ALL","Umm");
define("_PAGEWILLREFRESH","Git Page Ev'ry");
define("_SECONDS","Seconds");
define("_TURNONREFRESH","Turn ON Page Gitt'n");
define("_TURNOFFREFRESH","Turn OFF Page Gitt'n");
define("_WARNING","HEY!");
define("_DRIVESPACEUSED","Sto'age Unit gittin F-U-L-L! Fry mah hide!");
define("_ADMINMESSAGE","Yo' haf a message fum an administrato' in yer thingy box.");
define("_TORRENTS","To'rents");
define("_UPLOADHISTORY","What's been Happen'n");
define("_MYPROFILE","Edit Mah Stuff");
define("_ADMINISTRATION","Administrashun");
define("_SENDMESSAGETO","Give a haller to");
define("_TORRENTFILE","Th' Damn To'rent");
define("_FILESIZE","File Size");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","bad file");
define("_DATETIMEFORMAT","m/d/y g:i a");
define("_DATEFORMAT","m/d/y");
define("_ESTIMATEDTIME","Guess'n Time");
define("_DOWNLOADSPEED","Gitt'n Speed");
define("_UPLOADSPEED","Giv'n Speed");
define("_SHARING","Sharin'");
define("_USER","Feller");
define("_DONE","DONE");
define("_INCOMPLETE","AIN'T DONE");
define("_NEW","NEW");
define("_TORRENTDETAILS","To'rent Details");
define("_STOPDOWNLOAD","Stop To'rent Download");
define("_RUNTORRENT","Helter-skelter To'rent");
define("_SEEDTORRENT","Seed To'rent");
define("_DELETE","Delete");
define("_ABOUTTODELETE","Yer about t'delete");
define("_NOTOWNER","Not Owny of To'rent");
define("_AUTHORIZATIONFAILED","Autho'izashun FAILED. Ackshun has been logged, cuss it all t' tarnation.");
define("_MESSAGETOALL","This hyar message was sent t''ALL USERS");
define("_TRYDIFFERENTUSERID","Erro': Try a diffrunt User ID.");
define("_HASBEENUSED","has been used, cuss it all t' tarnation.");
define("_RETURNTOEDIT","Return t'Edit");
define("_ADMINUSERACTIVITY","Administrashun - User Ackivity");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","ackivity");
define("_LINKS_MENU","links");
define("_NEWUSER_MENU","noo user");
define("_BACKUP_MENU","backup");
define("_ALLUSERS","All Users");
define("_NORECORDSFOUND","NO RECORDS FOUND");
define("_SHOWPREVIOUS","Previous");
define("_SHOWMORE","Show Mo'e");
define("_ACTIVITYSEARCH","Ackivity Search");
define("_FILE","File");
define("_ACTION","Ackshun");
define("_SEARCH","Search");
define("_ACTIVITYLOG","Ackivity Log - Last");
define("_DAYS","Days");
define("_IP","IP");
define("_TIMESTAMP","Time Stamp");
define("_USERDETAILS","Feller Details");
define("_HITS","Hits");
define("_UPLOADACTIVITY","Upload Ackivity");
define("_JOINED","Joined");
define("_LASTVISIT","Last Visit");
define("_USERSACTIVITY","Ackivity");
define("_NORMALUSER","No'mal User");
define("_ADMINISTRATOR","Administrato'");
define("_SUPERADMIN","Super Admin");
define("_EDIT","Edit");
define("_USERADMIN","Administrashun - User Admin");
define("_EDITUSER","Edit User");
define("_UPLOADPARTICIPATION","Upload Participashun");
define("_UPLOADS","Uploads");
define("_PERCENTPARTICIPATION","Percent Participashun");
define("_PARTICIPATIONSTATEMENT","Participashun an' Uploads based on th' last");
define("_TOTALPAGEVIEWS","Total Page Views");
define("_THEME","Theme");
define("_USERTYPE","User Type");
define("_NEWPASSWORD","Noo Passwo'd");
define("_CONFIRMPASSWORD","Confirm Passwo'd");
define("_HIDEOFFLINEUSERS","Hide Offline Users on Home Page");
define("_UPDATE","Update");
define("_USERIDREQUIRED","User ID is required, cuss it all t' tarnation.");
define("_PASSWORDLENGTH","Passwo'd muss haf 6 o' mo'e chareeckers.");
define("_PASSWORDNOTMATCH","Passwo'ds does not match.");
define("_PLEASECHECKFOLLOWING","Please check th' follerin'");
define("_NEWUSER","Noo User");
define("_PASSWORD","Passwo'd");
define("_CREATE","Create");
define("_ADMINEDITLINKS","Administrashun - Edit Links");
define("_FULLURLLINK","Full URL Link");
define("_BACKTOPARRENT","Back Parrent Direcko'y");
define("_DOWNLOADDETAILS","Download Details");
define("_PERCENTDONE","Percent Done");
define("_RETURNTOTORRENTS","Return t'To'rents");
define("_DATE","Date");
define("_WROTE","wrote");
define("_SENDMESSAGETITLE","Send a Message");
define("_TO","To");
define("_FROM","Fum");
define("_YOURMESSAGE","Yer Message");
define("_SENDTOALLUSERS","Send t'All Users");
define("_FORCEUSERSTOREAD","Fo'ce User(s) t'Read");
define("_SEND","Send");
define("_PROFILE","Profile");
define("_PROFILEUPDATEDFOR","Profile Updated fo'");
define("_REPLY","Holler Back");
define("_MESSAGE","Message");
define("_MESSAGES","Messages");
define("_RETURNTOMESSAGES","Return t'Messages");
define("_COMPOSE","Pick'm");
define("_LANGUAGE","Speak");
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-slovenian.php
0,0 → 1,165
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/*
/* Po najboljsih moceh prevedel Mitja Mihelic
/* mitja_mihelic@email.si
/**************************************************************************/
 
define("_CHARSET","iso-8859-2");
define("_SELECTFILE","Dodaj torrent z diska na strežnik");
define("_URLFILE","Prenesi torrent z interneta na strežnik");
define("_UPLOAD","Dodaj");
define("_GETFILE","Prenesi");
define("_TORRENTLINKS","Povezave do Torrentov");
define("_ONLINE","Prijavljeni");
define("_OFFLINE","Neprijavljeni");
define("_STORAGE","Prostor");
define("_DRIVESPACE","Pregled prostora");
define("_SERVERSTATS","Stanje strežnika");
define("_DIRECTORYLIST","Vsebina mape");
define("_ALL","Vse");
define("_PAGEWILLREFRESH","Stran se osveži vsakih");
define("_SECONDS","sekund");
define("_TURNONREFRESH","Omogoči osveževanje strani");
define("_TURNOFFREFRESH","Onemogoči osveževanje strani");
define("_WARNING","POZOR");
define("_DRIVESPACEUSED","Na pogonu zmanjkuje prostora!");
define("_ADMINMESSAGE","V nabiralniku vas čaka sporočilo administratorja.");
define("_TORRENTS","Torrenti");
define("_UPLOADHISTORY","Zgodovina dodajanja na strežnik");
define("_MYPROFILE","Uredi moj profil");
define("_ADMINISTRATION","Administracija");
define("_SENDMESSAGETO","Pošlji sporočilo uporabniku");
define("_TORRENTFILE","Torrent");
define("_FILESIZE","Velikost");
define("_STATUS","Stanje");
define("_ADMIN","Admin");
define("_BADFILE","pokvarjena datoteka");
define("_DATETIMEFORMAT","d/m/Y H:i"); //Date Time mask '26/02/04 03:53 pm'
define("_DATEFORMAT","d/m/y"); //Date mask '26/02/04'
define("_ESTIMATEDTIME","Predvideni čas");
define("_DOWNLOADSPEED","Hitrost prenosa k sebi");
define("_UPLOADSPEED","Hitrost prenosa v svet");
define("_SHARING","Razmerje prenosa");
define("_USER","Uporabnik");
define("_DONE","končano");
define("_INCOMPLETE","nedokončano");
define("_NEW","novo");
define("_TORRENTDETAILS","Podatki o torrentu");
define("_STOPDOWNLOAD","Prekini prenos k sebi");
define("_RUNTORRENT","Zaženi torrent");
define("_SEEDTORRENT","Posadi torrent");
define("_DELETE","Izbriši");
define("_ABOUTTODELETE","Izbrisali boste");
define("_NOTOWNER","Niste lastnik torrenta");
define("_MESSAGETOALL","To sporočilo je bilo poslano vsem uporabnikom");
define("_TRYDIFFERENTUSERID","Napaka: Poskusite z drugim uporabnikom.");
define("_HASBEENUSED","uporabljeno.");
define("_RETURNTOEDIT","Vrnitev na urejanje");
define("_ADMINUSERACTIVITY","Administracija - Dejavnosti uporabnikov");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","dejavnosti");
define("_LINKS_MENU","povezave");
define("_NEWUSER_MENU","dodaj uporabnika");
define("_BACKUP_MENU","varnostna kopija");
define("_ALLUSERS","Vsi uporabniki");
define("_NORECORDSFOUND","Ni zapisov");
define("_SHOWPREVIOUS","Prejšnji");
define("_SHOWMORE","Pokaži več");
define("_ACTIVITYSEARCH","Iskanje");
define("_FILE","Datoteka");
define("_ACTION","Dejavnost");
define("_SEARCH","Išči");
define("_ACTIVITYLOG","Dnevnik dejavnosti zadnjih");
define("_DAYS","dni");
define("_IP","IP");
define("_TIMESTAMP","Čas");
define("_USERDETAILS","Podatki o uporabnikih");
define("_HITS","Ogledi");
define("_UPLOADACTIVITY","Prenosi na strežnik");
define("_JOINED","Dodan");
define("_LASTVISIT","Zadnji obisk");
define("_USERSACTIVITY","Dejavnost");
define("_NORMALUSER","Uporabnik");
define("_ADMINISTRATOR","Administrator");
define("_SUPERADMIN","Super Admin");
define("_EDIT","Uredi");
define("_USERADMIN","Administracija - Urejanje uporabnikov");
define("_EDITUSER","Urejanje uporabnika");
define("_UPLOADPARTICIPATION","Udeležba pri dodajanju");
define("_UPLOADS","Prenosov na strežnik");
define("_PERCENTPARTICIPATION","Odstotek udeležbe");
define("_PARTICIPATIONSTATEMENT","Udeležba in prenosi na strežnik zadnjih");
define("_TOTALPAGEVIEWS","Število ogledov strani");
define("_THEME","Tema");
define("_USERTYPE","Vrsta uporabnika");
define("_NEWPASSWORD","Novo geslo");
define("_CONFIRMPASSWORD","Potrdi geslo");
define("_HIDEOFFLINEUSERS","Skrij neprijavljene uporabnike na domači strani");
define("_UPDATE","Posodobi");
define("_USERIDREQUIRED","Ime uporabnika je obvezno.");
define("_PASSWORDLENGTH","Geslo mora vsebovati najmanj 6 znakov.");
define("_PASSWORDNOTMATCH","Gesli se ne ujemata.");
define("_PLEASECHECKFOLLOWING","Prosim preverite naslednje");
define("_NEWUSER","Nov uporabnik");
define("_PASSWORD","Geslo");
define("_CREATE","Dodaj");
define("_ADMINEDITLINKS","Administracija - Uredi povezave");
define("_FULLURLLINK","Povezava");
define("_BACKTOPARRENT","Nazaj");
define("_DOWNLOADDETAILS","Podrobnosti o prenosu");
define("_PERCENTDONE","Odstotek končanega");
define("_RETURNTOTORRENTS","Vrni se domov");
define("_DATE","Datum");
define("_WROTE","piše");
define("_SENDMESSAGETITLE","Pošlji sporočilo");
define("_TO","Prejemnik");
define("_FROM","Pošiljtelj");
define("_YOURMESSAGE","Vaše sporočilo");
define("_SENDTOALLUSERS","Pošlji vsem uporabnikom");
define("_FORCEUSERSTOREAD","Prisili uporabnike k branju");
define("_SEND","Pošlji");
define("_PROFILE","Profil");
define("_PROFILEUPDATEDFOR","Profil posodobljen za");
define("_REPLY","Odgovori");
define("_MESSAGE","Sporočilo");
define("_MESSAGES","Sporočila");
define("_RETURNTOMESSAGES","Vrni se k sporočilom");
define("_COMPOSE","Sestavi");
define("_LANGUAGE","Jezik");
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-spanish.php
0,0 → 1,187
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
/**************************************************************************/
/* TorrentFlux - Cliente de Torrent para PHP
/* ============================================
/*
/* En este archivo se encuentran todos los mensajes del sistema.
/*
/* Si quieres contribuir con una traducción en tu idioma, envíale un email
/* con el archivo a qrome@yahoo.com. Mantén por favor el orden original,
/* y sólo un mensaje por línea; revisa también tu traducción por lo menos dos veces!
/*
/* Recuerda que hay que cambiar la frase entre comillas, no la que está en mayúsculas!
/*
/* Si necesitas usar comillas, (") recuerda añadir una diagonal al revés (\),
/* para que se vea así: Esto es \"texto con comillas\" así.
/* Y, si usas código HTML, revísalo dos veces.
/*
/* Traducción al español latinoamericano por Alex Neuman van der Hans
/* E-mail: opensource@linux.com.pa
/* Si necesitas traductor para tu proyecto Open Source, envíame un e-mail!
/* http://linux.com.pa/ - El Portal de Linux para Panamá y el Mundo
/*
/* Saludos, besos y abrazos a mi esposa Susan, a quien amo con todo mi corazón!
/**************************************************************************/
 
 
 
define("_CHARSET","iso-8859-1"); // if you don't know... then leave this as is.
define("_SELECTFILE","Seleccione un Torrent para subir");
define("_URLFILE","URL del archivo Torrent");
define("_UPLOAD","Subir");
define("_GETFILE","Consígalo");
define("_TORRENTLINKS","Enlaces Torrent");
define("_ONLINE","En Línea");
define("_OFFLINE","Fuera de Línea");
define("_STORAGE","Almacenamiento");
define("_DRIVESPACE","Espacio Disponible");
define("_SERVERSTATS","Estadísticas / Quién");
define("_DIRECTORYLIST","Listado del Directorio");
define("_ALL","Todos");
define("_PAGEWILLREFRESH","La página se actualizará en");
define("_SECONDS","segundos");
define("_TURNONREFRESH","ACTIVAR Actualización Automática");
define("_TURNOFFREFRESH","DESACTIVAR Actualización Automática");
define("_WARNING","ADVERTENCIA");
define("_DRIVESPACEUSED","de espacio en disco está siendo usado!");
define("_ADMINMESSAGE","Tiene un mensaje de un administrador en su buzón de mensajes.");
define("_TORRENTS","Torrentes");
define("_UPLOADHISTORY","Historial de Subidas");
define("_MYPROFILE","Cambiar mi Perfil");
define("_ADMINISTRATION","Administración");
define("_SENDMESSAGETO","Enviarle un mensaje a");
define("_TORRENTFILE","Archivo Torrent");
define("_FILESIZE","Tamaño");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","archivo incorrecto");
define("_DATETIMEFORMAT","d/m/y g:i a"); //Date Time mask '02/26/04 03:53 pm'
define("_DATEFORMAT","d/m/y"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Tiempo Estimado");
define("_DOWNLOADSPEED","Velocidad de Bajada");
define("_UPLOADSPEED","Velocidad de Subida");
define("_SHARING","Compartiendo");
define("_USER","Usuario");
define("_DONE","FINALIZADO");
define("_INCOMPLETE","INCOMPLETO");
define("_NEW","NUEVO");
define("_TORRENTDETAILS","Detalles del Torrente");
define("_STOPDOWNLOAD","Detener bajada del Torrente");
define("_RUNTORRENT","Ejecutar Torrente");
define("_SEEDTORRENT","Alimentar Torrente");
define("_DELETE","Borrar");
define("_ABOUTTODELETE","Estás a punto de borrar");
define("_NOTOWNER","Ese Torrent no es tuyo");
define("_MESSAGETOALL","Este mensaje es para TODOS LOS USUARIOS");
define("_TRYDIFFERENTUSERID","Error: Intenta otra ID de Usuario");
define("_HASBEENUSED","ha sido usado.");
define("_RETURNTOEDIT","Regresar a hacer cambios");
define("_ADMINUSERACTIVITY","Administración - Actividades de Usuarios");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","actividad");
define("_LINKS_MENU","enlaces");
define("_NEWUSER_MENU","nuevo usuario");
define("_BACKUP_MENU","respaldo");
define("_ALLUSERS","Todos los Usuarios");
define("_NORECORDSFOUND","REGISTROS NO ENCONTRADOS");
define("_SHOWPREVIOUS","Previo");
define("_SHOWMORE","Ver Más");
define("_ACTIVITYSEARCH","Búsqueda");
define("_FILE","Archivo");
define("_ACTION","Acción");
define("_SEARCH","Búsqueda");
define("_ACTIVITYLOG","Bitácora de los últimos");
define("_DAYS","días");
define("_IP","IP");
define("_TIMESTAMP","Fecha y Hora");
define("_USERDETAILS","Detalles del Usuario");
define("_HITS","Vistas");
define("_UPLOADACTIVITY","Actividad de Subida");
define("_JOINED","Miembro desde"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Última Visita"); // header for when the user last visited the site
define("_USERSACTIVITY","Actividad"); // used for popup to display Activity next to users name
define("_NORMALUSER","Usuario Normal"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administrador"); // used to describe anadministrator's account type
define("_SUPERADMIN","Super Administrador"); // used to describe Super Admin's account type
define("_EDIT","Editar");
define("_USERADMIN","Administración de Usuarios"); // title of page for user administration
define("_EDITUSER","Editar Usuario");
define("_UPLOADPARTICIPATION","Participación en Subidas");
define("_UPLOADS","Subidas"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","% de Participación");
define("_PARTICIPATIONSTATEMENT","Participación y Subidas basados en los últimos"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Vistas Totales de Página");
define("_THEME","Tema");
define("_USERTYPE","Tipo de Usuario");
define("_NEWPASSWORD","Nueva clave");
define("_CONFIRMPASSWORD","Confirme su clave");
define("_HIDEOFFLINEUSERS","Esconder Usuarios no conectados en el inicio");
define("_UPDATE","Actualizar");
define("_USERIDREQUIRED","Se requiere ID de usuario.");
define("_PASSWORDLENGTH","Clave debe constar de más de 6 caracteres.");
define("_PASSWORDNOTMATCH","Las claves no coinciden.");
define("_PLEASECHECKFOLLOWING","Por favor revise lo siguiente:"); //Displays errors after this statement
define("_NEWUSER","Nuevo Usuario");
define("_PASSWORD","Clave");
define("_CREATE","Crear"); // button text to create a new user
define("_ADMINEDITLINKS","Administración de Enlaces");
define("_FULLURLLINK","URL Completo del Enlace");
define("_BACKTOPARRENT","Regresar al Directorio anterior"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Detalles de la Bajada");
define("_PERCENTDONE","% acabado");
define("_RETURNTOTORRENTS","Regresar a los Torrentes"); // Link at the bottom of each page
define("_DATE","Fecha");
define("_WROTE","Escribió"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Enviar Mensaje"); // Title of page
define("_TO","Para");
define("_FROM","De");
define("_YOURMESSAGE","Su Mensaje");
define("_SENDTOALLUSERS","Enviar a todos los Usuarios");
define("_FORCEUSERSTOREAD","Obligar al (a los) usuarios a leer?"); // Admin option in messaging
define("_SEND","Enviar"); // Button to send private message
define("_PROFILE","Perfil");
define("_PROFILEUPDATEDFOR","Perfil Actualizado para"); // Profile updatedfor 'username'
define("_REPLY","Responder"); // popup text for reply button
define("_MESSAGE","Mensaje");
define("_MESSAGES","Mensajes"); // plural (more than one)
define("_RETURNTOMESSAGES","Regresar a Mensajes");
define("_COMPOSE","Componer"); // As in 'Compose a message' for button
define("_LANGUAGE","Idioma"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/language/lang-svenska.php
0,0 → 1,161
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
define("_CHARSET","utf-8"); // if you don't know... then leave this as is.
define("_SELECTFILE","Välj torrent att ladda upp");
define("_URLFILE","URL till torrent");
define("_UPLOAD","Ladda upp");
define("_GETFILE","Hämta");
define("_TORRENTLINKS","Torrentlänkar");
define("_ONLINE","Uppkopplad");
define("_OFFLINE","Frånkopplad");
define("_STORAGE","Utrymme");
define("_DRIVESPACE","Diskutrymme");
define("_SERVERSTATS","Server Status / Vem");
define("_DIRECTORYLIST","Kataloglistning");
define("_ALL","Alla");
define("_PAGEWILLREFRESH","Sidan uppdateras med ");
define("_SECONDS","sekunders intervall");
define("_TURNONREFRESH","Aktivera automatisk uppdatering");
define("_TURNOFFREFRESH","Avaktivera automatisk uppdatering");
define("_WARNING","VARNING");
define("_DRIVESPACEUSED","Diskutrymmet är slut!");
define("_ADMINMESSAGE","Du har ett meddelande från administratören.");
define("_TORRENTS","Torrents");
define("_UPLOADHISTORY","Tidigare uppladdningar");
define("_MYPROFILE","Redigera profilen");
define("_ADMINISTRATION","Administrering");
define("_SENDMESSAGETO","Skicka meddelande till");
define("_TORRENTFILE","Torrent");
define("_FILESIZE","Filstorlek");
define("_STATUS","Status");
define("_ADMIN","Admin");
define("_BADFILE","fel på filen");
define("_DATETIMEFORMAT","y/m/d G:i"); //Date Time mask '02/26/04 15:53'
define("_DATEFORMAT","y/m/d"); //Date mask '02/26/04'
define("_ESTIMATEDTIME","Beräknad tid");
define("_DOWNLOADSPEED","Nedladdning");
define("_UPLOADSPEED","Uppladdning");
define("_SHARING","Delningsratio");
define("_USER","Användare");
define("_DONE","KLAR");
define("_INCOMPLETE","INKOMPLETT");
define("_NEW","NY");
define("_TORRENTDETAILS","Detaljer");
define("_STOPDOWNLOAD","Stoppa nedladdningen");
define("_RUNTORRENT","Starta nedladdningen");
define("_SEEDTORRENT","Distribuera torrent");
define("_DELETE","Radera");
define("_ABOUTTODELETE","Du är på väg att radera");
define("_NOTOWNER","Ej ägare av torrent");
define("_MESSAGETOALL","Det här meddelandet skickades till ALLA ANVÄNDARE");
define("_TRYDIFFERENTUSERID","Fel: Försök med ett annat användar-ID");
define("_HASBEENUSED","har använts.");
define("_RETURNTOEDIT","Tillbaka till redigera");
define("_ADMINUSERACTIVITY","Administrering - Användaraktivitet");
define("_ADMIN_MENU","admin");
define("_ACTIVITY_MENU","aktivitet");
define("_LINKS_MENU","länkar");
define("_NEWUSER_MENU","ny användare");
define("_BACKUP_MENU","backup");
define("_ALLUSERS","Alla användare");
define("_NORECORDSFOUND","INGEN DATA FUNNEN");
define("_SHOWPREVIOUS","Föregående");
define("_SHOWMORE","Nästa");
define("_ACTIVITYSEARCH","Sök aktivitet");
define("_FILE","Fil");
define("_ACTION","Händelse");
define("_SEARCH","Sök");
define("_ACTIVITYLOG","Aktivitetslog -");
define("_DAYS","dagar tillbaks");
define("_IP","IP");
define("_TIMESTAMP","Tid");
define("_USERDETAILS","Användardetaljer");
define("_HITS","Sidträffar");
define("_UPLOADACTIVITY","Uppladdningsaktivitet");
define("_JOINED","Skapad"); // header for the date when the user joined (became a member)
define("_LASTVISIT","Senaste besök"); // header for when the user last visited the site
define("_USERSACTIVITY","Aktivitet"); // used for popup to display Activity next to users name
define("_NORMALUSER","Normal användare"); // used to describe a normal user's account type
define("_ADMINISTRATOR","Administratör"); // used to describe an administrator's account type
define("_SUPERADMIN","Super Admin"); // used to describe Super Admin's account type
define("_EDIT","Redigera");
define("_USERADMIN","Administrering - Användaradministrering"); // title of page for user administration
define("_EDITUSER","Redigera användare");
define("_UPLOADPARTICIPATION","Uppladdningsdeltagande");
define("_UPLOADS","Antal uppladdningar"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","Procentuellt deltagande");
define("_PARTICIPATIONSTATEMENT","Deltagande och uppladdningar de senaste"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Totalt antal sidvisningar");
define("_THEME","Tema");
define("_USERTYPE","Användartyp");
define("_NEWPASSWORD","Nytt lösenord");
define("_CONFIRMPASSWORD","Bekräfta lösenord");
define("_HIDEOFFLINEUSERS","Dölj användare som är offline på huvudsidan");
define("_UPDATE","Uppdatera");
define("_USERIDREQUIRED","Användar-ID måste anges.");
define("_PASSWORDLENGTH","Lösenordet måste innehålla minst 6 tecken.");
define("_PASSWORDNOTMATCH","Lösenorden matchar inte varandra.");
define("_PLEASECHECKFOLLOWING","Kontrollera följande"); // Displays errors after this statement
define("_NEWUSER","Ny användare");
define("_PASSWORD","Lösenord");
define("_CREATE","Skapa"); // button text to create a new user
define("_ADMINEDITLINKS","Administring - Redigera länkar");
define("_FULLURLLINK","Full URL");
define("_BACKTOPARRENT","Upp en katalog"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","Nedladdningsdetaljer");
define("_PERCENTDONE","Procent klar");
define("_RETURNTOTORRENTS","Åter till Torrents"); // Link at the bottom of each page
define("_DATE","Datum");
define("_WROTE","skrev"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","Skicka ett meddelande"); // Title of page
define("_TO","Till");
define("_FROM","Från");
define("_YOURMESSAGE","Ditt meddelande");
define("_SENDTOALLUSERS","Skicka till alla användare");
define("_FORCEUSERSTOREAD","Tvinga användare att läsa"); // Admin option in messaging
define("_SEND","Skicka"); // Button to send private message
define("_PROFILE","profil");
define("_PROFILEUPDATEDFOR","Profilen uppdaterad för"); // Profile updated for 'username'
define("_REPLY","Svara"); // popup text for reply button
define("_MESSAGE","Meddelande");
define("_MESSAGES","Meddelanden"); // plural (more than one)
define("_RETURNTOMESSAGES","Åter till meddelanden");
define("_COMPOSE","Nytt meddelande"); // As in 'Compose a message' for button
define("_LANGUAGE","Språk"); // label
 
define("_CURRENTDOWNLOAD","Nuvarande nerladdningar");
define("_CURRENTUPLOAD","Nuvarande uppladdningar");
define("_SERVERLOAD","Server Last");
define("_FREESPACE","Ledigt utrymme");
define("_UPLOADED", "Uppladdat");
 
define("_QMANAGER_MENU","kösystem");
define("_SETTINGS_MENU","inställningar");
define("_SEARCHSETTINGS_MENU","sökinställningar");
define("_ERRORSREPORTED","Fel");
define("_STARTED", "Startad");
define("_ENDED", "Avslutad");
define("_QUEUED","Köad");
define("_DELQUEUE","Ta bort från kö");
define("_FORCESTOP","Döda torrent");
define("_STOPPING","Stannar");
define("_COOKIE_MENU","kakor");
 
?>
/web/kaklik's_web/torrentflux/language/lang-taiwanese.php
0,0 → 1,170
<?php
 
/**************************************************************************/
/* TorrentFlux - PHP Torrent Client
/* ============================================
/*
/* This is the language file with all the system messages
/*
/* If you would like to make a translation, please email qrome@yahoo.com
/* the translated file. Please keep the original text order,
/* and just one message per line, also double check your translation!
/*
/* You need to change the second quoted phrase, not the capital one!
/*
/* If you need to use double quotes (") remember to add a backslash (\),
/* so your entry will look like: This is \"double quoted\" text.
/* And, if you use HTML code, please double check it.
/**************************************************************************/
 
/**************************************************************************/
/* TorrentFlux - Traditional Chinese Translation
/* ============================================
/* WHO: Mac / ycl6
/* DATE: 31st Dec 2004
/* Contact: ycl6@users.sourceforge.net
/**************************************************************************/
 
define("_CHARSET","big5"); // if you don't know... then leave this as is.
define("_SELECTFILE","½Ð¿ï¾Ü¤@­Ó­n¤W¶Çªº Torrent ÀÉ®×");
define("_URLFILE","Torrent Àɮתººô§}");
define("_UPLOAD","¤W¶Ç");
define("_GETFILE","¨ú±oÀÉ®×");
define("_TORRENTLINKS","Torrent ªº³sµ²");
define("_ONLINE","¦b½u");
define("_OFFLINE","Â÷½u");
define("_STORAGE","ÀxÂêŶ¡");
define("_DRIVESPACE","ºÏºÐªÅ¶¡");
define("_SERVERSTATS","¥D¾÷²Î­p¸ê°T");
define("_DIRECTORYLIST","¥Ø¿ý²M³æ");
define("_ALL","¥þ³¡¸ê°T");
define("_PAGEWILLREFRESH","­¶­±·|¦Û°Ê¨C");
define("_SECONDS","¬í§ó·s");
define("_TURNONREFRESH","±Ò°Ê­¶­±§ó·s");
define("_TURNOFFREFRESH","Ãö³¬­¶­±§ó·s");
define("_WARNING","ĵ§i");
define("_DRIVESPACEUSED","ºÏºÐªÅ¶¡¤w³Q¨Ï¥Î!");
define("_ADMINMESSAGE","§Aªº°T®§§¨¤¤¦³¤@«ÊºÞ²z­û±Hµ¹§Aªº°T®§.");
define("_TORRENTS","Torrents");
define("_UPLOADHISTORY","¤W¶Ç¬ö¿ý");
define("_MYPROFILE","½s¿è§Úªº­Ó¤H¸ê®Æ");
define("_ADMINISTRATION","ºÞ²z±±¨î¥x");
define("_SENDMESSAGETO","¶Ç°e°T®§µ¹");
define("_TORRENTFILE","Torrent ÀÉ®×");
define("_FILESIZE","Àɮפj¤p");
define("_STATUS","ª¬ºA");
define("_ADMIN","ºÞ²z");
define("_BADFILE","·lÃaÀÉ®×");
define("_DATETIMEFORMAT","Y/m/d g:i a"); //Date Time mask '2004/02/26 03:53 pm'
define("_DATEFORMAT","Y/m/d"); //Date mask '2004/02/26'
define("_ESTIMATEDTIME","¦ô­p®É¶¡");
define("_DOWNLOADSPEED","¤U¸ü³t«×");
define("_UPLOADSPEED","¤W¶Ç³t«×");
define("_SHARING","¤À¨É¤ñ¨Ò");
define("_USER","¥Î¤á");
define("_DONE","¤wµ²§ô");
define("_INCOMPLETE","¥¼§¹¦¨");
define("_NEW","·s¼W");
define("_TORRENTDETAILS","Torrent ªº¸Ô²Ó¸ê°T");
define("_STOPDOWNLOAD","°±¤î Torrent");
define("_RUNTORRENT","±Ò°Ê Torrent");
define("_SEEDTORRENT","Seed Torrent"); // No Official Chinese translation for "seed"
define("_DELETE","§R°£");
define("_ABOUTTODELETE","§A±N­n§R°£");
define("_NOTOWNER","§A¤£¬O³o­Ó Torrent Àɪº¤W¶ÇªÌ");
define("_MESSAGETOALL","³o­Ó°T®§±N¶Ç°eµ¹¨C¤@¦ì¥Î¤á");
define("_TRYDIFFERENTUSERID","µo¥Í¿ù»~: ½Ð¸Õ¸Õ¥t¤@­Ó¥Î¤á±b¸¹.");
define("_HASBEENUSED","¤w¸g³Q¨Ï¥Î¤F.");
define("_RETURNTOEDIT","¦^¨ì½s¿è");
define("_ADMINUSERACTIVITY","ºÞ²z - ¥Î¤á¬¡°Ê°O¿ý");
define("_ADMIN_MENU","ºÞ²z");
define("_ACTIVITY_MENU","¬¡°Ê°O¿ý");
define("_LINKS_MENU","³sµ²");
define("_NEWUSER_MENU","·sªº¥Î¤á");
define("_BACKUP_MENU","³Æ¥÷");
define("_ALLUSERS","©Ò¦³¥Î¤á");
define("_NORECORDSFOUND","¨S¦³§ä¨ì¸ê®Æ");
define("_SHOWPREVIOUS","Åã¥Ü«e¤@­Ó");
define("_SHOWMORE","Åã¥Ü§ó¦h");
define("_ACTIVITYSEARCH","·j´M¬¡°Ê°O¿ý");
define("_FILE","ÀÉ®×");
define("_ACTION","°Ê§@");
define("_SEARCH","·j´M");
define("_ACTIVITYLOG","¬¡°Ê°O¿ý²M³æ - ³Ì«á");
define("_DAYS","¤é");
define("_IP","IP");
define("_TIMESTAMP","¤é´Á");
define("_USERDETAILS","¥Î¤á¸ê®Æ");
define("_HITS","¦¸¼Æ");
define("_UPLOADACTIVITY","¤W¶Ç°O¿ý");
define("_JOINED","¥[¤J¥»¯¸¤é´Á"); // header for the date when the user joined (became a member)
define("_LASTVISIT","³Ì«á¨ì³X"); // header for when the user last visited the site
define("_USERSACTIVITY","¬¡°Ê°O¿ý"); // used for popup to display Activity next to users name
define("_NORMALUSER","°ò¦¥Î¤á"); // used to describe a normal user's account type
define("_ADMINISTRATOR","ºÞ²z­û"); // used to describe an administrator's account type
define("_SUPERADMIN","¶W¯ÅºÞ²z­û"); // used to describe Super Admin's account type
define("_EDIT","½s¿è");
define("_USERADMIN","ºÞ²z - ºÞ²z¥Î¤á"); // title of page for user administration
define("_EDITUSER","½s¿è¥Î¤á");
define("_UPLOADPARTICIPATION","¤W¶Çªº°Ñ»P«×");
define("_UPLOADS","¤W¶ÇÁ`¼Æ"); // Number of uploads a user has contributed
define("_PERCENTPARTICIPATION","°Ñ»P«×¦Ê¤À¤ñ");
define("_PARTICIPATIONSTATEMENT","°Ñ»P«×¥H¤Î¤W¶Ç¼Æ¶qªº­pºâ¤Ñ¼Æ:"); // ends with 15 Days
define("_TOTALPAGEVIEWS","Á`¦@Æ[¬Ýªº­¶¼Æ");
define("_THEME","­·®æ");
define("_USERTYPE","±b¸¹Ãþ§O");
define("_NEWPASSWORD","·sªº±K½X");
define("_CONFIRMPASSWORD","½T»{±K½X");
define("_HIDEOFFLINEUSERS","¦b­º­¶ÁôÂÃÂ÷½u¥Î¤á");
define("_UPDATE","§ó·s");
define("_USERIDREQUIRED","»Ý­n¥Î¤á ID.");
define("_PASSWORDLENGTH","±K½X¥²¶·¬O¤»¦ì¼Æªø.");
define("_PASSWORDNOTMATCH","±K½X¤£²Å¦X");
define("_PLEASECHECKFOLLOWING","½Ð½T»{¥H¤U°ÝÃD"); // Displays errors after this statement
define("_NEWUSER","·sªº¥Î¤á");
define("_PASSWORD","±K½X");
define("_CREATE","·s¼W"); // button text to create a new user
define("_ADMINEDITLINKS","ºÞ²z - ½s¿è³sµ²");
define("_FULLURLLINK","§¹¾ã³sµ²");
define("_BACKTOPARRENT","¦^¨ì¤W¤@­Ó¥Ø¿ý"); // indicates going back to parent directory
define("_DOWNLOADDETAILS","¤U¸ü¸ê°T");
define("_PERCENTDONE","§¹¦¨¦Ê¤À¤ñ");
define("_RETURNTOTORRENTS","¦^¨ì Torrents"); // Link at the bottom of each page
define("_DATE","¤é´Á");
define("_WROTE","¼g¨ì"); // Used in a reply to tag what the user had writen
define("_SENDMESSAGETITLE","°e¥X¤@­Ó°T®§"); // Title of page
define("_TO","±Hµ¹");
define("_FROM","¨Ó¦Û");
define("_YOURMESSAGE","§Aªº°T®§");
define("_SENDTOALLUSERS","¶Ç°eµ¹©Ò¦³¥Î¤á");
define("_FORCEUSERSTOREAD","±j¨î·|­û¾\Ū"); // Admin option in messaging
define("_SEND","¶Ç°e"); // Button to send private message
define("_PROFILE","­Ó¤H¸ê®Æ");
define("_PROFILEUPDATEDFOR","¦¹·|­ûªº¸ê®Æ¤w¸g½s¿è§¹¦¨: "); // Profile updated for 'username'
define("_REPLY","¦^ÂÐ"); // popup text for reply button
define("_MESSAGE","°T®§");
define("_MESSAGES","°T®§"); // plural (more than one)
define("_RETURNTOMESSAGES","¦^¨ì°T®§");
define("_COMPOSE","½s¼g"); // As in 'Compose a message' for button
define("_LANGUAGE","»y¨t"); // label
 
 
define("_CURRENTDOWNLOAD","Current Download");
define("_CURRENTUPLOAD","Current Upload");
define("_SERVERLOAD","Server Load");
define("_FREESPACE","Free Space");
define("_UPLOADED", "Uploaded");
 
define("_QMANAGER_MENU","queue");
define("_SETTINGS_MENU","settings");
define("_SEARCHSETTINGS_MENU","search settings");
define("_ERRORSREPORTED","Errors");
define("_STARTED", "Started");
define("_ENDED", "Ended");
define("_QUEUED","Queued");
define("_DELQUEUE","Remove from Queue");
define("_FORCESTOP","Kill Torrent");
define("_STOPPING","Stopping");
define("_COOKIE_MENU","cookies");
 
?>
/web/kaklik's_web/torrentflux/lastRSS.php
0,0 → 1,189
<?php
/*
======================================================================
lastRSS 0.6
 
Simple yet powerful PHP class to parse RSS files.
 
by Vojtech Semecky, webmaster@webdot.cz
 
Latest version, features, manual and examples:
http://lastrss.webdot.cz/
 
----------------------------------------------------------------------
TODO
- Iconv nedavat na cely, ale jen na TITLE a DESCRIPTION (u item i celkove)
----------------------------------------------------------------------
LICENSE
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License (GPL)
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
To read the license please visit http://www.gnu.org/copyleft/gpl.html
======================================================================
*/
 
class lastRSS {
// -------------------------------------------------------------------
// Settings
// -------------------------------------------------------------------
var $channeltags = array ('title', 'link', 'description', 'language', 'copyright', 'managingEditor', 'webMaster', 'pubDate', 'lastBuildDate', 'rating', 'docs');
var $itemtags = array('title', 'link', 'description', 'author', 'category', 'comments', 'enclosure', 'guid', 'pubDate', 'source');
var $imagetags = array('title', 'url', 'link', 'width', 'height');
var $textinputtags = array('title', 'description', 'name', 'link');
 
var $strip_html = true;
 
var $time_out = 5;
var $user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox/0.10";
 
// -------------------------------------------------------------------
// Parse RSS file and returns associative array.
// -------------------------------------------------------------------
function Get ($rss_url) {
// If CACHE ENABLED
if ($this->cache_dir != '') {
$cache_file = $this->cache_dir . '/rsscache_' . md5($rss_url);
$timedif = @(time() - filemtime($cache_file));
if ($timedif < $this->cache_time) {
// cached file is fresh enough, return cached array
$result = unserialize(join('', file($cache_file)));
// set 'cached' to 1 only if cached file is correct
if ($result) $result['cached'] = 1;
} else {
// cached file is too old, create new
$result = $this->Parse($rss_url);
$serialized = serialize($result);
if ($f = @fopen($cache_file, 'w')) {
fwrite ($f, $serialized, strlen($serialized));
fclose($f);
}
if ($result) $result['cached'] = 0;
}
}
// If CACHE DISABLED >> load and parse the file directly
else {
$result = $this->Parse($rss_url);
if ($result) $result['cached'] = 0;
}
// return result
return $result;
}
 
// -------------------------------------------------------------------
// Modification of preg_match(); return trimmed field with index 1
// from 'classic' preg_match() array output
// -------------------------------------------------------------------
function my_preg_match ($pattern, $subject) {
preg_match($pattern, $subject, $out);
return trim($out[1]);
}
 
// -------------------------------------------------------------------
// Replace HTML entities &something; by real characters
// -------------------------------------------------------------------
function unhtmlentities ($string) {
$trans_tbl = get_html_translation_table (HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
return strtr ($string, $trans_tbl);
}
 
// -------------------------------------------------------------------
// Encoding conversion function
// -------------------------------------------------------------------
function MyConvertEncoding($in_charset, $out_charset, $string) {
// if substitute_character
if ($this->subs_char) {
// Iconv() to UTF-8. mb_convert_encoding() to $out_charset
$utf = iconv($in_charset, 'UTF-8', $string);
mb_substitute_character($this->subs_char);
return mb_convert_encoding ($utf, $out_charset, 'UTF-8');
} else {
// Iconv() to $out_charset
return iconv($in_charset, $out_charset, $string);
}
}
 
// -------------------------------------------------------------------
// Parse() is private method used by Get() to load and parse RSS file.
// Don't use Parse() in your scripts - use Get($rss_file) instead.
// -------------------------------------------------------------------
function Parse ($rss_url) {
include_once( "db.php" );
include_once( "functions.php" );
 
// Open and load RSS file
$rss_content = fetchHTML( $rss_url );
 
if( empty( $rss_content ) )
{
return false;
}
 
// Parse document encoding
$result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content);
 
// If code page is set convert character encoding to required
if ($this->cp != '')
$rss_content = $this->MyConvertEncoding($result['encoding'], $this->cp, $rss_content);
 
// Parse CHANNEL info
preg_match("'<channel.*?>(.*?)</channel>'si", $rss_content, $out_channel);
foreach($this->channeltags as $channeltag)
{
$temp = $this->my_preg_match("'<$channeltag.*?>(.*?)</$channeltag>'si", $out_channel[1]);
if ($temp != '') $result[$channeltag] = $temp; // Set only if not empty
 
}
 
// Parse TEXTINPUT info
preg_match("'<textinput(|[^>]*[^/])>(.*?)</textinput>'si", $rss_content, $out_textinfo);
// This a little strange regexp means:
// Look for tag <textinput> with or without any attributes, but skip truncated version <textinput /> (it's not beginning tag)
if ($out_textinfo[2]) {
foreach($this->textinputtags as $textinputtag) {
$temp = $this->my_preg_match("'<$textinputtag.*?>(.*?)</$textinputtag>'si", $out_textinfo[2]);
if ($temp != '') $result['textinput_'.$textinputtag] = $temp; // Set only if not empty
}
}
// Parse IMAGE info
preg_match("'<image.*?>(.*?)</image>'si", $rss_content, $out_imageinfo);
if ($out_imageinfo[1]) {
foreach($this->imagetags as $imagetag) {
$temp = $this->my_preg_match("'<$imagetag.*?>(.*?)</$imagetag>'si", $out_imageinfo[1]);
if ($temp != '') $result['image_'.$imagetag] = $temp; // Set only if not empty
}
}
// Parse ITEMS
preg_match_all("'<item(| .*?)>(.*?)</item>'si", $rss_content, $items);
$rss_items = $items[2];
$result['items_count'] = count($items[1]);
$i = 0;
$result['items'] = array(); // create array even if there are no items
foreach($rss_items as $rss_item) {
// Parse one item
foreach($this->itemtags as $itemtag)
{
$temp = $this->my_preg_match("'<$itemtag.*?>(.*?)</$itemtag>'si", $rss_item);
if ($temp != '') $result[items][$i][$itemtag] = $temp; // Set only if not empty
}
// Strip HTML tags and other bullshit from DESCRIPTION (if description is presented)
if ($result['items'][$i]['description'] && $this->strip_html == true)
{
$result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description'])));
}
// Item counter
$i++;
}
return $result;
}
}
 
?>
/web/kaklik's_web/torrentflux/login.php
0,0 → 1,280
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
// ADODB support.
include_once('db.php');
include_once("settingsfunctions.php");
 
// Create Connection.
$db = getdb();
 
loadSettings();
 
session_start("TorrentFlux");
include_once("config.php");
include("themes/".$cfg["default_theme"]."/index.php");
global $cfg;
if(isset($_SESSION['user']))
{
header("location: index.php");
exit;
}
ob_start();
?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $cfg["pagetitle"] ?></title>
<link rel="StyleSheet" href="themes/<?php echo $cfg["default_theme"] ?>/style.css" type="text/css" />
<meta http-equiv="pragma" content="no-cache" />
<meta content="charset=iso-8859-1" />
 
</head>
<body bgcolor="<?php echo $cfg["main_bgcolor"] ?>">
 
<script type="text/javascript">
<!--
function loginvalidate()
{
msg = "";
pass = document.theForm.iamhim.value;
user = document.theForm.username.value;
if (user.length < 1)
{
msg = msg + "* Username is required\n";
document.theForm.username.focus();
}
if(pass.length<1)
{
msg = msg + "* Password is required\n";
if (user.length > 0)
{
document.theForm.iamhim.focus();
}
}
 
if (msg != "")
{
alert("Check the following:\n\n" + msg);
return false;
}
}
-->
</script>
 
 
<br /><br /><br />
<div align="center">
<table border="1" bordercolor="<?php echo $cfg["table_border_dk"] ?>" cellpadding="0" cellspacing="0">
<tr>
<td>
<table border="0" cellpadding="4" cellspacing="0" width="100%">
<tr>
<td align="left" background="themes/<?php echo $cfg["default_theme"] ?>/images/bar.gif" bgcolor="<?php echo $cfg["main_bgcolor"] ?>">
<font class="title"><?php echo $cfg["pagetitle"] ?> Login</font>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_header_bg"] ?>">
<div align="center">
<table width="100%" bgcolor="<?php echo $cfg["body_data_bg"] ?>">
<tr>
<td>
<table bgcolor="<?php echo $cfg["body_data_bg"] ?>" width="352 pixels" cellpadding="1">
<tr>
<td>
<div align="center">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td>
<?php
 
$user = strtolower(getRequestVar('username'));
 
$iamhim = addslashes(getRequestVar('iamhim'));
 
$create_time = time();
 
// Check for user
if(!empty($user) && !empty($iamhim))
{
/* First User check */
$next_loc = "index.php";
$sql = "SELECT count(*) FROM tf_users";
$user_count = $db->GetOne($sql);
if($user_count == 0)
{
// This user is first in DB. Make them super admin.
// this is The Super USER, add them to the user table
 
$record = array(
'user_id'=>$user,
'password'=>md5($iamhim),
'hits'=>1,
'last_visit'=>$create_time,
'time_created'=>$create_time,
'user_level'=>2,
'hide_offline'=>0,
'theme'=>$cfg["default_theme"],
'language_file'=>$cfg["default_language"]
);
$sTable = 'tf_users';
$sql = $db->GetInsertSql($sTable, $record);
 
$result = $db->Execute($sql);
showError($db,$sql);
 
// Test and setup some paths for the TF settings
$pythonCmd = $cfg["pythonCmd"];
$btphpbin = getcwd() . "/TF_BitTornado/btphptornado.py";
$tfQManager = getcwd() . "/TF_BitTornado/tfQManager.py";
$maketorrent = getcwd() . "/TF_BitTornado/btmakemetafile.py";
$btshowmetainfo = getcwd() . "/TF_BitTornado/btshowmetainfo.py";
$tfPath = getcwd() . "/downloads/";
 
if (!isFile($cfg["pythonCmd"]))
{
$pythonCmd = trim(shell_exec("which python"));
if ($pythonCmd == "")
{
$pythonCmd = $cfg["pythonCmd"];
}
}
 
$settings = array(
"pythonCmd" => $pythonCmd,
"btphpbin" => $btphpbin,
"tfQManager" => $tfQManager,
"btmakemetafile" => $maketorrent,
"btshowmetainfo" => $btshowmetainfo,
"path" => $tfPath
);
 
saveSettings($settings);
AuditAction($cfg["constants"]["update"], "Initial Settings Updated for first login.");
$next_loc = "admin.php?op=configSettings";
}
 
$sql = "SELECT uid, hits, hide_offline, theme, language_file FROM tf_users WHERE user_id=".$db->qstr($user)." AND password=".$db->qstr(md5($iamhim));
$result = $db->Execute($sql);
showError($db,$sql);
 
list(
$uid,
$hits,
$cfg["hide_offline"],
$cfg["theme"],
$cfg["language_file"]) = $result->FetchRow();
 
if(!array_key_exists("shutdown",$cfg))
$cfg['shutdown'] = '';
if(!array_key_exists("upload_rate",$cfg))
$cfg['upload_rate'] = '';
 
if($result->RecordCount()==1)
{
// Add a hit to the user
$hits++;
 
$sql = 'select * from tf_users where uid = '.$uid;
$rs = $db->Execute($sql);
showError($db, $sql);
 
$rec = array(
'hits'=>$hits,
'last_visit'=>$db->DBDate($create_time),
'theme'=>$cfg['theme'],
'language_file'=>$cfg['language_file'],
'shutdown'=>$cfg['shutdown'],
'upload_rate'=>$cfg['upload_rate']
);
$sql = $db->GetUpdateSQL($rs, $rec);
 
$result = $db->Execute($sql);
showError($db, $sql);
 
$_SESSION['user'] = $user;
session_write_close();
 
header("location: ".$next_loc);
exit();
}
else
{
AuditAction($cfg["constants"]["access_denied"], "FAILED AUTH: ".$user);
echo "<div align=\"center\">Login failed.<br>Please try again.</div>";
}
}
?>
 
<form name="theForm" action="login.php" method="post" onsubmit="return loginvalidate()">
<table width="100%" cellpadding="5" cellspacing="0" border="0">
<tr>
<td align="right">Username: </td>
<td><input type="text" name="username" value="" size="15" style="font-family:verdana,helvetica,sans-serif; font-size:9px; color:#000;" /></td>
</tr>
<tr>
<td align="right">Password:</td>
<td><input type="password" name="iamhim" value="" size="15" style="font-family:verdana,helvetica,sans-serif; font-size:9px; color:#000" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input class="button" type="submit" value="Login" /></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
 
</div>
 
<script language="JavaScript">
document.theForm.username.focus();
</script>
 
</body>
</html>
 
 
<?php
ob_end_flush();
 
?>
 
/web/kaklik's_web/torrentflux/logout.php
0,0 → 1,53
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
 
include_once("config.php");
 
// Start Session and grab user
session_start("TorrentFlux");
$cfg["user"] = strtolower($_SESSION['user']);
 
// 2004-12-09 PFM
include_once('db.php');
 
// Create Connection.
$db = getdb();
 
logoutUser();
session_destroy();
header('location: login.php');
 
// Remove history for user so they are logged off from screen
function logoutUser()
{
global $cfg, $db;
 
$sql = "DELETE FROM tf_log WHERE user_id=".$db->qstr($cfg["user"])." and action=".$db->qstr($cfg["constants"]["hit"]);
 
// do the SQL
$result = $db->Execute($sql);
showError($db, $sql);
}
?>
/web/kaklik's_web/torrentflux/maketorrent.php
0,0 → 1,533
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
/*****
Usage: btmakemetafile.py <trackerurl> <file> [file...] [params...]
 
--announce_list <arg>
a list of announce URLs - explained below (defaults to '')
 
--httpseeds <arg>
a list of http seed URLs - explained below (defaults to '')
 
--piece_size_pow2 <arg>
which power of 2 to set the piece size to (0 = automatic) (defaults
to 0)
 
--comment <arg>
optional human-readable comment to put in .torrent (defaults to '')
 
--filesystem_encoding <arg>
optional specification for filesystem encoding (set automatically in
recent Python versions) (defaults to '')
 
--target <arg>
optional target file for the torrent (defaults to '')
 
 
announce_list = optional list of redundant/backup tracker URLs, in the format:
url[,url...][|url[,url...]...]
where URLs separated by commas are all tried first
before the next group of URLs separated by the pipe is checked.
If none is given, it is assumed you don't want one in the metafile.
If announce_list is given, clients which support it
will ignore the <announce> value.
Examples:
http://tracker1.com|http://tracker2.com|http://tracker3.com
(tries trackers 1-3 in order)
http://tracker1.com,http://tracker2.com,http://tracker3.com
(tries trackers 1-3 in a randomly selected order)
http://tracker1.com|http://backup1.com,http://backup2.com
(tries tracker 1 first, then tries between the 2 backups randomly)
 
httpseeds = optional list of http-seed URLs, in the format:
url[|url...]
*****/
 
include_once("config.php");
include_once("functions.php");
 
// Variable information
$tpath = $cfg["torrent_file_path"];
$tfile = $_POST['torrent'];
$file = $_GET['path'];
$torrent = cleanFileName(StripFolders( trim($file) )) . ".torrent";
$announce = ( $_POST['announce'] ) ? $_POST['announce'] : "http://";
$ancelist = $_POST['announcelist'];
$comment = $_POST['comments'];
$peice = $_POST['piecesize'];
$alert = ( $_POST['alert'] ) ? 1 : "''";
$private = ( $_POST['Private'] == "Private" ) ? true : false;
$dht = ( $_POST['DHT'] == "DHT" ) ? true : false;
// Let's create the torrent
if( !empty( $announce ) && $announce != "http://" )
{
// Create maketorrent directory if it doesn't exist
if( !is_dir( $tpath ) )
{
@mkdir( $tpath );
}
// Clean up old files
if( @file_exists( $tpath . $tfile ) )
{
@unlink( $tpath . $tfile );
}
// This is the command to execute
$app = "nohup " . $cfg["pythonCmd"] . " -OO " . $cfg["btmakemetafile"] . " " . $announce . " " . escapeshellarg( $cfg['path'] . $file ) . " ";
// Is there comments to add?
if( !empty( $comment ) )
{
$app .= "--comment " . escapeshellarg( $comment ) . " ";
}
 
// Set the piece size
if( !empty( $peice ) )
{
$app .= "--piece_size_pow2 " . $peice . " ";
}
 
if( !empty( $ancelist ) )
{
$check = "/" . str_replace( "/", "\/", quotemeta( $announce ) ) . "/i";
// if they didn't add the primary tracker in, we will add it for them
if( preg_match( $check, $ancelist, $result ) )
$app .= "--announce_list " . escapeshellarg( $ancelist ) . " ";
else
$app .= "--announce_list " . escapeshellarg ( $announce . "," . $ancelist ) . " ";
}
 
// Set the target torrent fiel
$app .= "--target " . escapeshellarg( $tpath . $tfile );
// Set to never timeout for large torrents
set_time_limit( 0 );
// Let's see how long this takes...
$time_start = microtime( true );
 
// Execute the command -- w00t!
exec( $app );
 
// We want to check to make sure the file was successful
$success = false;
$raw = @file_get_contents( $tpath . $tfile );
if( preg_match( "/6:pieces([^:]+):/i", $raw, $results ) )
{
// This means it is a valid torrent
$success = true;
// Make an entry for the owner
AuditAction($cfg["constants"]["file_upload"], $tfile);
 
// Check to see if one of the flags were set
if( $private || $dht )
{
// Add private/dht Flags
// e7:privatei1e
// e17:dht_backup_enablei1e
// e20:dht_backup_requestedi1e
if( preg_match( "/6:pieces([^:]+):/i", $raw, $results ) )
{
$pos = strpos( $raw, "6:pieces" ) + 9 + strlen( $results[1] ) + $results[1];
$fp = @fopen( $tpath . $tfile, "r+" );
@fseek( $fp, $pos, SEEK_SET );
if( $private )
{
@fwrite( $fp, "7:privatei1e17:dht_backup_enablei0e20:dht_backup_requestedi0eee" );
}
else
{
@fwrite( $fp, "e7:privatei0e17:dht_backup_enablei1e20:dht_backup_requestedi1eee" );
}
@fclose( $fp );
}
}
}
else
{
// Something went wrong, clean up
if( @file_exists( $tpath . $tfile ) )
{
@unlink( $tpath . $tfile );
}
}
 
// We are done! how long did we take?
$time_end = microtime( true );
$diff = duration($time_end - $time_start);
 
// make path URL friendly to support non-standard characters
$downpath = urlencode( $tfile );
 
// Depending if we were successful, display the required information
if( $success )
{
$onLoad = "completed( '" . $downpath . "', " . $alert. ", '" . $diff . "' );";
}
else
{
$onLoad = "failed( '" . $downpath . "', " . $alert . " );";
}
}
 
// This is the torrent download prompt
if( !empty( $_GET["download"] ) )
{
$tfile = $_GET["download"];
// ../ is not allowed in the file name
if (!ereg("(\.\.\/)", $tfile))
{
// Does the file exist?
if (file_exists($tpath . $tfile))
{
// Prompt the user to download the new torrent file.
header( "Content-type: application/octet-stream\n" );
header( "Content-disposition: attachment; filename=\"" . $tfile . "\"\n" );
header( "Content-transfer-encoding: binary\n");
header( "Content-length: " . @filesize( $tpath . $tfile ) . "\n" );
// Send the torrent file
$fp = @fopen( $tpath . $tfile, "r" );
@fpassthru( $fp );
@fclose( $fp );
AuditAction($cfg["constants"]["fm_download"], $tfile);
}
else
{
AuditAction($cfg["constants"]["error"], "File Not found for download: ".$cfg['user']." tried to download ".$tfile);
}
}
else
{
AuditAction($cfg["constants"]["error"], "ILLEGAL DOWNLOAD: ".$cfg['user']." tried to download ".$tfile);
}
exit();
}
// Strip the folders from the path
function StripFolders( $path )
{
$pos = strrpos( $path, "/" ) + 1;
$path = substr( $path, $pos );
return $path;
}
 
// Convert a timestamp to a duration string
function duration( $timestamp )
{
$years = floor( $timestamp / ( 60 * 60 * 24 * 365 ) );
$timestamp %= 60 * 60 * 24 * 365;
 
$weeks = floor( $timestamp / ( 60 * 60 * 24 * 7 ) );
$timestamp %= 60 * 60 * 24 * 7;
 
$days = floor( $timestamp / ( 60 * 60 * 24 ) );
$timestamp %= 60 * 60 * 24;
 
$hrs = floor( $timestamp / ( 60 * 60 ) );
$timestamp %= 60 * 60;
 
$mins = floor( $timestamp / 60 );
$secs = $timestamp % 60;
$str = "";
 
if( $years >= 1 )
$str .= "{$years} years ";
if( $weeks >= 1 )
$str .= "{$weeks} weeks ";
if( $days >= 1 )
$str .= "{$days} days ";
if( $hrs >= 1 )
$str .= "{$hrs} hours ";
if( $mins >= 1 )
$str .= "{$mins} minutes ";
if( $secs >= 1 )
$str.="{$secs} seconds ";
 
return $str;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1" />
<META HTTP-EQUIV="Pragma" CONTENT="no-cache; charset=<?php echo _CHARSET ?>" />
<TITLE><?php echo $cfg["pagetitle"]; ?> - Torrent Maker</TITLE>
<LINK REL="icon" HREF="images/favicon.ico" TYPE="image/x-icon" />
<LINK REL="shortcut icon" HREF="images/favicon.ico" TYPE="image/x-icon" />
<LINK REL="StyleSheet" HREF="themes/<?php echo $cfg["theme"]; ?>/style.css" TYPE="text/css" />
</HEAD>
<SCRIPT SRC="tooltip.js" TYPE="text/javascript"></SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
function doSubmit( obj )
{
// Basic check to see if maketorrent is already running
if( obj.value === "Creating..." )
return false;
 
// Run some basic validation
var valid = true;
var tlength = document.maketorrent.torrent.value.length - 8;
var torrent = document.maketorrent.torrent.value.substr( tlength );
document.getElementById('output').innerHTML = "";
document.getElementById('ttag').innerHTML = "";
document.getElementById('atag').innerHTML = "";
 
if( torrent !== ".torrent" )
{
document.getElementById('ttag').innerHTML = "<b style=\"color: #990000;\">*</b>";
document.getElementById('output').innerHTML += "<b style=\"color: #990000;\">* Torrent file must end in .torrent</b><BR />";
valid = false;
}
 
if( document.maketorrent.announce.value === "http://" )
{
document.getElementById('atag').innerHTML = "<b style=\"color: #990000;\">*</b>";
document.getElementById('output').innerHTML += "<b style=\"color: #990000;\">* Please enter a valid announce URL.</b><BR />";
valid = false;
}
 
// For saftely reason, let's force the property to false if it's disabled (private tracker)
if( document.maketorrent.DHT.disabled )
{
document.maketorrent.DHT.checked = false;
}
 
// If validation passed, submit form
if( valid === true )
{
disableForm();
toggleLayer('progress');
 
document.getElementById('output').innerHTML += "<b>Creating torrent...</b><BR /><BR />";
document.getElementById('output').innerHTML += "<i>* Note that larger folder/files will take some time to process,</i><BR />";
document.getElementById('output').innerHTML += "<i>&nbsp;&nbsp;&nbsp;do not close the window until it has been completed.</i><BR /><BR />";
document.getElementById('output').innerHTML += "&nbsp;&nbsp;&nbsp;When completed, the torrent will show in your list<BR />";
document.getElementById('output').innerHTML += "&nbsp;&nbsp;&nbsp;and a download link will be provided.<BR />";
 
return true;
}
return false;
}
 
function disableForm()
{
// Because of IE issue of disabling the submit button,
// we change the text and don't allow resubmitting
document.maketorrent.tsubmit.value = "Creating...";
document.maketorrent.torrent.readOnly = true;
document.maketorrent.announce.readOnly = true;
}
 
function ToggleDHT( dhtstatus )
{
document.maketorrent.DHT.disabled = dhtstatus;
}
 
function toggleLayer( whichLayer )
{
if( document.getElementById )
{
// This is the way the standards work
var style2 = document.getElementById(whichLayer).style;
style2.display = style2.display ? "" : "block";
}
else if( document.all )
{
// This is the way old msie versions work
var style2 = document.all[whichLayer].style;
style2.display = style2.display ? "" : "block";
}
else if( document.layers )
{
// This is the way nn4 works
var style2 = document.layers[whichLayer].style;
style2.display = style2.display ? "" : "block";
}
}
 
function completed( downpath, alertme, timetaken )
{
document.getElementById('output').innerHTML = "<b style='color: #005500;'>Creation completed!</b><BR />";
document.getElementById('output').innerHTML += "Time taken: <i>" + timetaken + "</i><BR />";
document.getElementById('output').innerHTML += "The new torrent has been added to your list.<BR /><BR />"
document.getElementById('output').innerHTML += "<img src='images/green.gif' border='0' title='Torrent Created' align='absmiddle'> You can download the <a style='font-weight: bold;' href='?download=" + downpath + "'>torrent here</a><BR />";
if( alertme === 1 )
alert( 'Creation of torrent completed!' );
}
 
function failed( downpath, alertme )
{
document.getElementById('output').innerHTML = "<b style='color: #AA0000;'>Creation failed!</b><BR /><BR />";
document.getElementById('output').innerHTML += "An error occured while trying to create the torrent.<BR />";
if( alertme === 1 )
alert( 'Creation of torrent failed!' );
}
 
var anlst = "(optional) announce_list = list of tracker URLs<BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;<i>url[,url...][|url[,url...]...]</i><BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URLs separated by commas are tried first<BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;before URLs separated by the pipe is checked.<BR />\n";
anlst += "Examples:<BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;<i>http://a.com<strong>|</strong>http://b.com<strong>|</strong>http://c.com</i><BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tries <b>a-c</b> in order)<BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;<i>http://a.com<strong>,</strong>http://b.com<strong>,</strong>http://c.com</i><BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tries <b>a-c</b> in a randomly selected order)<BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;<i>http://a.com<strong>|</strong>http://b.com<strong>,</strong>http://c.com</i><BR />\n";
anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tries <b>a</b> first, then tries <b>b-c</b> randomly)<BR />\n";
 
var annce = "tracker announce URL.<BR /><BR />\n";
annce += "Example:<BR />\n";
annce += "&nbsp;&nbsp;&nbsp;&nbsp;<i>http://tracker.com/announce</i><BR />\n";
 
var tornt = "torrent name to be saved as<BR /><BR />\n";
tornt += "Example:<BR />\n";
tornt += "&nbsp;&nbsp;&nbsp;&nbsp;<i>gnome-livecd-2.10.torrent</i><BR />\n";
 
var comnt = "add a comment to your torrent file (optional)<BR />\n";
comnt += "";
 
var piece = "data piece size for torrent<BR />\n";
piece += "power of 2 value to set the piece size to<BR />\n";
piece += "(0 = automatic) (0 only option in this version)<BR />\n";
 
var prvte = "private tracker support<BR />\n";
prvte += "(disallows DHT if enabled)<BR />\n";
 
var dhtbl = "DHT (Distributed Hash Table)<BR /><BR />\n";
dhtbl += "can only be set abled if private flag is not set true<BR />\n";
</SCRIPT>
<body topmargin="8" leftmargin="5" bgcolor="<?php echo $cfg["main_bgcolor"] ?>" style="font-family:Tahoma, 'Times New Roman'; font-size:12px;" onLoad="
<?php
if( !empty( $private ) )
echo "ToggleDHT(true);";
else
echo "ToggleDHT(false);";
 
if( !empty( $onLoad ) )
echo $onLoad;
?>">
<div align="center">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<table border="1" bordercolor="<?php echo $cfg["table_border_dk"] ?>" cellpadding="4" cellspacing="0">
<tr>
<td bgcolor="<?php echo $cfg["main_bgcolor"] ?>" background="themes/<?php echo $cfg["theme"] ?>/images/bar.gif">
<?php DisplayTitleBar($cfg["pagetitle"]." - Torrent Maker", false); ?>
</td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_header_bg"] ?>">
<div align="left">
<table width="100%" bgcolor="<?php echo $cfg["body_data_bg"] ?>">
<tr>
<td>
<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post" id="maketorrent" name="maketorrent">
<table>
<tr>
<td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(tornt);" hspace="1" />Torrent name:</td>
<td><input type="text" id="torrent" name="torrent" size="55" value="<?php echo $torrent; ?>" /> <label id="ttag"></label></td>
</tr>
<tr>
<td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(annce);" hspace="1" />Announcement URL:</td>
<td><input type="text" id="announce" name="announce" size="55" value="<?php echo $announce; ?>" /> <label id="atag"></label></td>
</tr>
<tr>
<td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(anlst);" hspace="1" />Announce List:</td>
<td><input type="text" id="announcelist" name="announcelist" size="55" value="<?php echo $ancelist; ?>" /> <label id="altag"></label></td>
</tr>
<tr>
<td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(piece);" hspace="1" />Piece size:</td>
<td><select id="piecesize" name="piecesize">
<option id="0" value="0" selected>0 (Auto)</option>
<!-- Removed for now as it doesn't seem to be working with creating torrents (??) -->
<!--
<option id="256" value="256">256</option>
<option id="512" value="512">512</option>
<option id="1024" value="1024">1024</option>
<option id="2048" value="2048">2048</option>
-->
</select> bytes</td>
</tr>
<tr>
<td valign="top"><img align="absmiddle" src="images/info.gif" onmouseover="return escape(comnt);" hspace="1" />Comments:</td>
<td><textarea cols="50" rows="3" id="comments" name="comments"><?php echo $comment; ?></textarea></td>
</tr>
<tr>
<td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(prvte);" hspace="1" />Private Torrent:</td>
<td>
<input type="radio" id="Private" name="Private" value="Private" onClick="ToggleDHT(true);"<?php echo ( $private ) ? " checked" : ""; ?>>Yes</input>
<input type="radio" id="Private" name="Private" value="NotPrivate" onClick="ToggleDHT(false);"<?php echo ( !$private ) ? " checked" : ""; ?>>No</input>
</td>
</tr>
<tr>
<td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(dhtbl);" hspace="1" />DHT Support:</td>
<td><input type="checkbox" id="DHT" name="DHT"<?php echo ( $dht ) ? " checked" : ""; ?> value="DHT"></input></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>
<input type="submit" id="tsubmit" name="tsubmit" onClick="return doSubmit(this);" value="Create" />
<input type="button" id="Cancel" name="close" value="Close" onClick="window.close();" />
<label for="alert" title="Send alert message box when torrent has been completed.">
<input type="checkbox" id="alert" name="alert"<?php echo ( $alert != "''" ) ? " checked" : ""; ?> value="AlertMe" />
Notify me of completion
</label>
</td>
</tr>
<tr>
<td colspan="2">
<div id="progress" name="progress" align="center" style="display: none;"><img src="images/progress_bar.gif" width="200" height="20" /></div>
<label id="output"></label>
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
<?php
DisplayTorrentFluxLink();
?>
</td>
</tr>
</table>
</div>
<script language="javascript">tt_Init();</script>
</body>
</html>
 
/web/kaklik's_web/torrentflux/message.php
0,0 → 1,128
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
$to_user = getRequestVar('to_user');
if(empty($to_user) or empty($cfg['user']))
{
// the user probably hit this page direct
header("location: index.php");
exit;
}
 
$message = getRequestVar('message');
if (!empty($message))
{
$to_all = getRequestVar('to_all');
if(!empty($to_all))
{
$to_all = 1;
}
else
{
$to_all = 0;
}
 
$force_read = getRequestVar('force_read');
if(!empty($force_read) && IsAdmin())
{
$force_read = 1;
}
else
{
$force_read = 0;
}
 
 
$message = check_html($message, "nohtml");
SaveMessage($to_user, $cfg['user'], $message, $to_all, $force_read);
 
header("location: readmsg.php");
}
else
{
$rmid = getRequestVar('rmid');
if(!empty($rmid))
{
list($from_user, $message, $ip, $time) = GetMessage($rmid);
$message = _DATE.": ".date(_DATETIMEFORMAT, $time)."\n".$from_user." "._WROTE.":\n\n".$message;
$message = ">".str_replace("\n", "\n>", $message);
$message = "\n\n\n".$message;
}
 
DisplayHead(_SENDMESSAGETITLE);
 
?>
 
<form name="theForm" method="post" action="message.php">
<table border="0" cellpadding="3" cellspacing="2" width="100%">
<tr>
<td bgcolor="<?php echo $cfg["table_data_bg"] ?>" align="right"><font size=2 face=Arial><?php echo _TO ?>:</font></td>
<td bgcolor="<?php echo $cfg["table_data_bg"] ?>"><font size=2 face=Arial><input type="Text" name="to_user" value="<?php echo $to_user ?>" size="20" readonly="true"></font></td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_data_bg"] ?>" align="right"><font size=2 face=Arial><?php echo _FROM ?>:</font></td>
<td bgcolor="<?php echo $cfg["table_data_bg"] ?>"><font size=2 face=Arial><input type="Text" name="from_user" value="<?php echo $cfg['user'] ?>" size="20" readonly="true"></font></td>
</tr>
<tr>
<td bgcolor="<?php echo $cfg["table_data_bg"] ?>" colspan="2">
<div align="center">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<font size=2 face=Arial>
<?php echo _YOURMESSAGE ?>:<br>
<textarea cols="72" rows="10" name="message" wrap="hard" tabindex="1"><?php echo $message ?></textarea><br>
<input type="Checkbox" name="to_all" value=1><?php echo _SENDTOALLUSERS ?>
<?php
if (IsAdmin())
{
echo "&nbsp;&nbsp;&nbsp;&nbsp;";
echo "<input type=\"Checkbox\" name=\"force_read\" value=1>"._FORCEUSERSTOREAD."";
}
?>
<br>
<div align="center">
<input type="Submit" name="Submit" value="<?php echo _SEND ?>">
</div>
</font>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</form>
<script>document.theForm.message.focus();</script>
 
<?php
 
DisplayFoot();
 
} // end the else
 
?>
/web/kaklik's_web/torrentflux/metaInfo.php
0,0 → 1,252
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
class dir
{
var $name;
var $subdirs;
var $files;
var $num;
var $prio;
 
function dir($name,$num,$prio)
{
$this->name = $name;
$this->num = $num;
$this->prio = $prio;
$this->files = array();
$this->subdirs = array();
}
 
function &addFile($file)
{
$this->files[] =& $file;
return $file;
}
 
function &addDir($dir)
{
$this->subdirs[] =& $dir;
return $dir;
}
 
// code changed to support php4
// thx to Mistar Muffin
function &findDir($name)
{
foreach (array_keys($this->subdirs) as $v)
{
$dir =& $this->subdirs[$v];
if($dir->name == $name)
{
return $dir;
}
}
return false;
}
 
function draw($parent)
{
echo("d.add(".$this->num.",".$parent.",\"".$this->name."\",".$this->prio.",0);\n");
 
foreach($this->subdirs as $v)
{
$v->draw($this->num);
}
 
foreach($this->files as $v)
{
if(is_object($v))
{
echo("d.add(".$v->num.",".$this->num.",\"".$v->name."\",".$v->prio.",".$v->size.");\n");
}
}
}
 
}
 
class file {
 
var $name;
var $prio;
var $size;
var $num;
 
function file($name,$num,$size,$prio)
{
$this->name = $name;
$this->num = $num;
$this->size = $size;
$this->prio = $prio;
}
}
 
function showMetaInfo($torrent, $allowSave=false)
{
global $cfg;
 
if (empty($torrent))
{
echo _NORECORDSFOUND;
}
elseif ($cfg["enable_file_priority"])
{
 
$prioFileName = $cfg["torrent_file_path"].getAliasName($torrent).".prio";
 
require_once('BDecode.php');
 
echo '<link rel="StyleSheet" href="dtree.css" type="text/css" /><script type="text/javascript" src="dtree.js"></script>';
 
$ftorrent=$cfg["torrent_file_path"].$torrent;
 
$fp = fopen($ftorrent, "rd");
$alltorrent = fread($fp, filesize($ftorrent));
fclose($fp);
 
$btmeta = BDecode($alltorrent);
$torrent_size = $btmeta["info"]["piece length"] * (strlen($btmeta["info"]["pieces"]) / 20);
 
if (array_key_exists('files',$btmeta['info']))
{
$dirnum = count($btmeta['info']['files']);
}
else
{
$dirnum = 0;
}
 
if ( is_readable($prioFileName))
{
$prio = split(',',file_get_contents($prioFileName));
$prio = array_splice($prio,1);
}
else
{
$prio = array();
for($i=0;$i<$dirnum;$i++)
{
$prio[$i] = -1;
}
}
 
$tree = new dir("/",$dirnum,isset($prio[$dirnum])?$prio[$dirnum]:-1);
 
if (array_key_exists('files',$btmeta['info']))
{
foreach( $btmeta['info']['files'] as $filenum => $file)
{
 
$depth = count($file['path']);
$branch =& $tree;
 
for($i=0; $i < $depth; $i++)
{
if ($i != $depth-1)
{
$d =& $branch->findDir($file['path'][$i]);
 
if($d)
{
$branch =& $d;
}
else
{
$dirnum++;
$d =& $branch->addDir(new dir($file['path'][$i], $dirnum, (isset($prio[$dirnum])?$prio[$dirnum]:-1)));
$branch =& $d;
}
}
else
{
$branch->addFile(new file($file['path'][$i]." (".$file['length'].")",$filenum,$file['length'],$prio[$filenum]));
}
 
}
}
}
 
echo "<table><tr>";
echo "<tr><td width=\"110\">Metainfo File:</td><td>".$torrent."</td></tr>";
echo "<tr><td>Directory Name:</td><td>".$btmeta['info']['name']."</td></tr>";
echo "<tr><td>Announce URL:</td><td>".$btmeta['announce']."</td></tr>";
 
if(array_key_exists('comment',$btmeta))
{
echo "<tr><td valign=\"top\">Comment:</td><td>".$btmeta['comment']."</td></tr>";
}
 
echo "<tr><td>Created:</td><td>".date("F j, Y, g:i a",$btmeta['creation date'])."</td></tr>";
echo "<tr><td>Torrent Size:</td><td>".$torrent_size." (".formatBytesToKBMGGB($torrent_size).")</td></tr>";
echo "<tr><td>Chunk size:</td><td>".$btmeta['info']['piece length']." (".formatBytesToKBMGGB($btmeta['info']['piece length']).")</td></tr>";
 
if (array_key_exists('files',$btmeta['info']))
{
 
echo "<tr><td>Selected size:</td><td id=\"sel\">0</td></tr>";
echo "</table><br>\n";
 
if ($allowSave)
{
echo "<form name=\"priority\" action=\"index.php\" method=\"POST\" >";
echo "<input type=\"hidden\" name=\"torrent\" value=\"".$torrent."\" >";
echo "<input type=\"hidden\" name=\"setPriorityOnly\" value=\"true\" >";
}
 
echo "<script type=\"text/javascript\">\n";
echo "var sel = 0;\n";
echo "d = new dTree('d');\n";
 
$tree->draw(-1);
 
echo "document.write(d);\n";
echo "sel = getSizes();\n";
echo "drawSel();\n";
echo "</script>\n";
 
echo "<input type=\"hidden\" name=\"filecount\" value=\"".count($btmeta['info']['files'])."\">";
echo "<input type=\"hidden\" name=\"count\" value=\"".$dirnum."\">";
echo "<br>";
if ($allowSave)
{
echo '<input type="submit" value="Save" >';
echo "<br>";
}
echo "</form>";
}
else
{
echo "</table><br>";
echo $btmeta['info']['name'].$torrent_size." (".formatBytesToKBMGGB($torrent_size).")";
}
}
else
{
$result = shell_exec("cd " . $cfg["torrent_file_path"]."; " . $cfg["pythonCmd"] . " -OO " . $cfg["btshowmetainfo"]." \"".$torrent."\"");
echo "<pre>";
echo $result;
echo "</pre>";
}
}
?>
/web/kaklik's_web/torrentflux/overlib.js
0,0 → 1,1274
//\//////////////////////////////////////////////////////////////////////////////////
//\ overLIB 3.51 -- This notice must remain untouched at all times.
//\ Copyright Erik Bosrup 1998-2002. All rights reserved.
//\
//\ By Erik Bosrup (erik@bosrup.com). Last modified 2002-11-01.
//\ Portions by Dan Steinman (dansteinman.com). Additions by other people are
//\ listed on the overLIB homepage.
//\
//\ Get the latest version at http://www.bosrup.com/web/overlib/
//\
//\ This script is published under an open source license. Please read the license
//\ agreement online at: http://www.bosrup.com/web/overlib/license.html
//\ If you have questions regarding the license please contact erik@bosrup.com.
//\
//\ This script library was originally created for personal use. By request it has
//\ later been made public. This is free software. Do not sell this as your own
//\ work, or remove this copyright notice. For full details on copying or changing
//\ this script please read the license agreement at the link above.
//\
//\ Please give credit on sites that use overLIB and submit changes of the script
//\ so other people can use them as well. This script is free to use, don't abuse.
//\//////////////////////////////////////////////////////////////////////////////////
//\mini
 
 
////////////////////////////////////////////////////////////////////////////////////
// CONSTANTS
// Don't touch these. :)
////////////////////////////////////////////////////////////////////////////////////
var INARRAY = 1;
var CAPARRAY = 2;
var STICKY = 3;
var BACKGROUND = 4;
var NOCLOSE = 5;
var CAPTION = 6;
var LEFT = 7;
var RIGHT = 8;
var CENTER = 9;
var OFFSETX = 10;
var OFFSETY = 11;
var FGCOLOR = 12;
var BGCOLOR = 13;
var TEXTCOLOR = 14;
var CAPCOLOR = 15;
var CLOSECOLOR = 16;
var WIDTH = 17;
var BORDER = 18;
var STATUS = 19;
var AUTOSTATUS = 20;
var AUTOSTATUSCAP = 21;
var HEIGHT = 22;
var CLOSETEXT = 23;
var SNAPX = 24;
var SNAPY = 25;
var FIXX = 26;
var FIXY = 27;
var FGBACKGROUND = 28;
var BGBACKGROUND = 29;
var PADX = 30; // PADX2 out
var PADY = 31; // PADY2 out
var FULLHTML = 34;
var ABOVE = 35;
var BELOW = 36;
var CAPICON = 37;
var TEXTFONT = 38;
var CAPTIONFONT = 39;
var CLOSEFONT = 40;
var TEXTSIZE = 41;
var CAPTIONSIZE = 42;
var CLOSESIZE = 43;
var FRAME = 44;
var TIMEOUT = 45;
var FUNCTION = 46;
var DELAY = 47;
var HAUTO = 48;
var VAUTO = 49;
var CLOSECLICK = 50;
var CSSOFF = 51;
var CSSSTYLE = 52;
var CSSCLASS = 53;
var FGCLASS = 54;
var BGCLASS = 55;
var TEXTFONTCLASS = 56;
var CAPTIONFONTCLASS = 57;
var CLOSEFONTCLASS = 58;
var PADUNIT = 59;
var HEIGHTUNIT = 60;
var WIDTHUNIT = 61;
var TEXTSIZEUNIT = 62;
var TEXTDECORATION = 63;
var TEXTSTYLE = 64;
var TEXTWEIGHT = 65;
var CAPTIONSIZEUNIT = 66;
var CAPTIONDECORATION = 67;
var CAPTIONSTYLE = 68;
var CAPTIONWEIGHT = 69;
var CLOSESIZEUNIT = 70;
var CLOSEDECORATION = 71;
var CLOSESTYLE = 72;
var CLOSEWEIGHT = 73;
 
 
////////////////////////////////////////////////////////////////////////////////////
// DEFAULT CONFIGURATION
// You don't have to change anything here if you don't want to. All of this can be
// changed on your html page or through an overLIB call.
////////////////////////////////////////////////////////////////////////////////////
 
// Main background color (the large area)
// Usually a bright color (white, yellow etc)
if (typeof ol_fgcolor == 'undefined') { var ol_fgcolor = "#CCCCFF";}
// Border color and color of caption
// Usually a dark color (black, brown etc)
if (typeof ol_bgcolor == 'undefined') { var ol_bgcolor = "#333399";}
// Text color
// Usually a dark color
if (typeof ol_textcolor == 'undefined') { var ol_textcolor = "#000000";}
// Color of the caption text
// Usually a bright color
if (typeof ol_capcolor == 'undefined') { var ol_capcolor = "#FFFFFF";}
// Color of "Close" when using Sticky
// Usually a semi-bright color
if (typeof ol_closecolor == 'undefined') { var ol_closecolor = "#9999FF";}
 
// Font face for the main text
if (typeof ol_textfont == 'undefined') { var ol_textfont = "Verdana,Arial,Helvetica";}
 
// Font face for the caption
if (typeof ol_captionfont == 'undefined') { var ol_captionfont = "Verdana,Arial,Helvetica";}
 
// Font face for the close text
if (typeof ol_closefont == 'undefined') { var ol_closefont = "Verdana,Arial,Helvetica";}
 
// Font size for the main text
// When using CSS this will be very small.
if (typeof ol_textsize == 'undefined') { var ol_textsize = "1";}
 
// Font size for the caption
// When using CSS this will be very small.
if (typeof ol_captionsize == 'undefined') { var ol_captionsize = "1";}
 
// Font size for the close text
// When using CSS this will be very small.
if (typeof ol_closesize == 'undefined') { var ol_closesize = "1";}
 
// Width of the popups in pixels
// 100-300 pixels is typical
if (typeof ol_width == 'undefined') { var ol_width = "200";}
 
// How thick the ol_border should be in pixels
// 1-3 pixels is typical
if (typeof ol_border == 'undefined') { var ol_border = "1";}
 
// How many pixels to the right/left of the cursor to show the popup
// Values between 3 and 12 are best
if (typeof ol_offsetx == 'undefined') { var ol_offsetx = 10;}
// How many pixels to the below the cursor to show the popup
// Values between 3 and 12 are best
if (typeof ol_offsety == 'undefined') { var ol_offsety = 10;}
 
// Default text for popups
// Should you forget to pass something to overLIB this will be displayed.
if (typeof ol_text == 'undefined') { var ol_text = "Default Text"; }
 
// Default caption
// You should leave this blank or you will have problems making non caps popups.
if (typeof ol_cap == 'undefined') { var ol_cap = ""; }
 
// Decides if sticky popups are default.
// 0 for non, 1 for stickies.
if (typeof ol_sticky == 'undefined') { var ol_sticky = 0; }
 
// Default background image. Better left empty unless you always want one.
if (typeof ol_background == 'undefined') { var ol_background = ""; }
 
// Text for the closing sticky popups.
// Normal is "Close".
if (typeof ol_close == 'undefined') { var ol_close = "Close"; }
 
// Default vertical alignment for popups.
// It's best to leave RIGHT here. Other options are LEFT and CENTER.
if (typeof ol_hpos == 'undefined') { var ol_hpos = RIGHT; }
 
// Default status bar text when a popup is invoked.
if (typeof ol_status == 'undefined') { var ol_status = ""; }
 
// If the status bar automatically should load either text or caption.
// 0=nothing, 1=text, 2=caption
if (typeof ol_autostatus == 'undefined') { var ol_autostatus = 0; }
 
// Default height for popup. Often best left alone.
if (typeof ol_height == 'undefined') { var ol_height = -1; }
 
// Horizontal grid spacing that popups will snap to.
// 0 makes no grid, anything else will cause a snap to that grid spacing.
if (typeof ol_snapx == 'undefined') { var ol_snapx = 0; }
 
// Vertical grid spacing that popups will snap to.
// 0 makes no grid, andthing else will cause a snap to that grid spacing.
if (typeof ol_snapy == 'undefined') { var ol_snapy = 0; }
 
// Sets the popups horizontal position to a fixed column.
// Anything above -1 will cause fixed position.
if (typeof ol_fixx == 'undefined') { var ol_fixx = -1; }
 
// Sets the popups vertical position to a fixed row.
// Anything above -1 will cause fixed position.
if (typeof ol_fixy == 'undefined') { var ol_fixy = -1; }
 
// Background image for the popups inside.
if (typeof ol_fgbackground == 'undefined') { var ol_fgbackground = ""; }
 
// Background image for the popups frame.
if (typeof ol_bgbackground == 'undefined') { var ol_bgbackground = ""; }
 
// How much horizontal left padding text should get by default when BACKGROUND is used.
if (typeof ol_padxl == 'undefined') { var ol_padxl = 1; }
 
// How much horizontal right padding text should get by default when BACKGROUND is used.
if (typeof ol_padxr == 'undefined') { var ol_padxr = 1; }
 
// How much vertical top padding text should get by default when BACKGROUND is used.
if (typeof ol_padyt == 'undefined') { var ol_padyt = 1; }
 
// How much vertical bottom padding text should get by default when BACKGROUND is used.
if (typeof ol_padyb == 'undefined') { var ol_padyb = 1; }
 
// If the user by default must supply all html for complete popup control.
// Set to 1 to activate, 0 otherwise.
if (typeof ol_fullhtml == 'undefined') { var ol_fullhtml = 0; }
 
// Default vertical position of the popup. Default should normally be BELOW.
// ABOVE only works when HEIGHT is defined.
if (typeof ol_vpos == 'undefined') { var ol_vpos = BELOW; }
 
// Default height of popup to use when placing the popup above the cursor.
if (typeof ol_aboveheight == 'undefined') { var ol_aboveheight = 0; }
 
// Default icon to place next to the popups caption.
if (typeof ol_capicon == 'undefined') { var ol_capicon = ""; }
 
// Default frame. We default to current frame if there is no frame defined.
if (typeof ol_frame == 'undefined') { var ol_frame = self; }
 
// Default timeout. By default there is no timeout.
if (typeof ol_timeout == 'undefined') { var ol_timeout = 0; }
 
// Default javascript funktion. By default there is none.
if (typeof ol_function == 'undefined') { var ol_function = null; }
 
// Default timeout. By default there is no timeout.
if (typeof ol_delay == 'undefined') { var ol_delay = 0; }
 
// If overLIB should decide the horizontal placement.
if (typeof ol_hauto == 'undefined') { var ol_hauto = 0; }
 
// If overLIB should decide the vertical placement.
if (typeof ol_vauto == 'undefined') { var ol_vauto = 0; }
 
 
 
// If the user has to click to close stickies.
if (typeof ol_closeclick == 'undefined') { var ol_closeclick = 0; }
 
// This variable determines if you want to use CSS or inline definitions.
// CSSOFF=no CSS CSSSTYLE=use CSS inline styles CSSCLASS=use classes
if (typeof ol_css == 'undefined') { var ol_css = CSSOFF; }
 
// Main background class (eqv of fgcolor)
// This is only used if CSS is set to use classes (ol_css = CSSCLASS)
if (typeof ol_fgclass == 'undefined') { var ol_fgclass = ""; }
 
// Frame background class (eqv of bgcolor)
// This is only used if CSS is set to use classes (ol_css = CSSCLASS)
if (typeof ol_bgclass == 'undefined') { var ol_bgclass = ""; }
 
// Main font class
// This is only used if CSS is set to use classes (ol_css = CSSCLASS)
if (typeof ol_textfontclass == 'undefined') { var ol_textfontclass = ""; }
 
// Caption font class
// This is only used if CSS is set to use classes (ol_css = CSSCLASS)
if (typeof ol_captionfontclass == 'undefined') { var ol_captionfontclass = ""; }
 
// Close font class
// This is only used if CSS is set to use classes (ol_css = CSSCLASS)
if (typeof ol_closefontclass == 'undefined') { var ol_closefontclass = ""; }
 
// Unit to be used for the text padding above
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
// Options include "px", "%", "in", "cm"
if (typeof ol_padunit == 'undefined') { var ol_padunit = "px";}
 
// Unit to be used for height of popup
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
// Options include "px", "%", "in", "cm"
if (typeof ol_heightunit == 'undefined') { var ol_heightunit = "px";}
 
// Unit to be used for width of popup
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
// Options include "px", "%", "in", "cm"
if (typeof ol_widthunit == 'undefined') { var ol_widthunit = "px";}
 
// Font size unit for the main text
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_textsizeunit == 'undefined') { var ol_textsizeunit = "px";}
 
// Decoration of the main text ("none", "underline", "line-through" or "blink")
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_textdecoration == 'undefined') { var ol_textdecoration = "none";}
 
// Font style of the main text ("normal" or "italic")
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_textstyle == 'undefined') { var ol_textstyle = "normal";}
 
// Font weight of the main text ("normal", "bold", "bolder", "lighter", ect.)
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_textweight == 'undefined') { var ol_textweight = "normal";}
 
// Font size unit for the caption
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_captionsizeunit == 'undefined') { var ol_captionsizeunit = "px";}
 
// Decoration of the caption ("none", "underline", "line-through" or "blink")
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_captiondecoration == 'undefined') { var ol_captiondecoration = "none";}
 
// Font style of the caption ("normal" or "italic")
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_captionstyle == 'undefined') { var ol_captionstyle = "normal";}
 
// Font weight of the caption ("normal", "bold", "bolder", "lighter", ect.)
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_captionweight == 'undefined') { var ol_captionweight = "bold";}
 
// Font size unit for the close text
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_closesizeunit == 'undefined') { var ol_closesizeunit = "px";}
 
// Decoration of the close text ("none", "underline", "line-through" or "blink")
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_closedecoration == 'undefined') { var ol_closedecoration = "none";}
 
// Font style of the close text ("normal" or "italic")
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_closestyle == 'undefined') { var ol_closestyle = "normal";}
 
// Font weight of the close text ("normal", "bold", "bolder", "lighter", ect.)
// Only used if CSS inline styles are being used (ol_css = CSSSTYLE)
if (typeof ol_closeweight == 'undefined') { var ol_closeweight = "normal";}
 
 
 
////////////////////////////////////////////////////////////////////////////////////
// ARRAY CONFIGURATION
// You don't have to change anything here if you don't want to. The following
// arrays can be filled with text and html if you don't wish to pass it from
// your html page.
////////////////////////////////////////////////////////////////////////////////////
 
// Array with texts.
if (typeof ol_texts == 'undefined') { var ol_texts = new Array("Text 0", "Text 1"); }
 
// Array with captions.
if (typeof ol_caps == 'undefined') { var ol_caps = new Array("Caption 0", "Caption 1"); }
 
 
////////////////////////////////////////////////////////////////////////////////////
// END CONFIGURATION
// Don't change anything below this line, all configuration is above.
////////////////////////////////////////////////////////////////////////////////////
 
 
 
 
 
 
 
////////////////////////////////////////////////////////////////////////////////////
// INIT
////////////////////////////////////////////////////////////////////////////////////
 
// Runtime variables init. Used for runtime only, don't change, not for config!
var o3_text = "";
var o3_cap = "";
var o3_sticky = 0;
var o3_background = "";
var o3_close = "Close";
var o3_hpos = RIGHT;
var o3_offsetx = 2;
var o3_offsety = 2;
var o3_fgcolor = "";
var o3_bgcolor = "";
var o3_textcolor = "";
var o3_capcolor = "";
var o3_closecolor = "";
var o3_width = 100;
var o3_border = 1;
var o3_status = "";
var o3_autostatus = 0;
var o3_height = -1;
var o3_snapx = 0;
var o3_snapy = 0;
var o3_fixx = -1;
var o3_fixy = -1;
var o3_fgbackground = "";
var o3_bgbackground = "";
var o3_padxl = 0;
var o3_padxr = 0;
var o3_padyt = 0;
var o3_padyb = 0;
var o3_fullhtml = 0;
var o3_vpos = BELOW;
var o3_aboveheight = 0;
var o3_capicon = "";
var o3_textfont = "Verdana,Arial,Helvetica";
var o3_captionfont = "Verdana,Arial,Helvetica";
var o3_closefont = "Verdana,Arial,Helvetica";
var o3_textsize = "1";
var o3_captionsize = "1";
var o3_closesize = "1";
var o3_frame = self;
var o3_timeout = 0;
var o3_timerid = 0;
var o3_allowmove = 0;
var o3_function = null;
var o3_delay = 0;
var o3_delayid = 0;
var o3_hauto = 0;
var o3_vauto = 0;
var o3_closeclick = 0;
 
var o3_css = CSSOFF;
var o3_fgclass = "";
var o3_bgclass = "";
var o3_textfontclass = "";
var o3_captionfontclass = "";
var o3_closefontclass = "";
var o3_padunit = "px";
var o3_heightunit = "px";
var o3_widthunit = "px";
var o3_textsizeunit = "px";
var o3_textdecoration = "";
var o3_textstyle = "";
var o3_textweight = "";
var o3_captionsizeunit = "px";
var o3_captiondecoration = "";
var o3_captionstyle = "";
var o3_captionweight = "";
var o3_closesizeunit = "px";
var o3_closedecoration = "";
var o3_closestyle = "";
var o3_closeweight = "";
 
 
 
// Display state variables
var o3_x = 0;
var o3_y = 0;
var o3_allow = 0;
var o3_showingsticky = 0;
var o3_removecounter = 0;
 
// Our layer
var over = null;
var fnRef;
 
// Decide browser version
var ns4 = (navigator.appName == 'Netscape' && parseInt(navigator.appVersion) == 4);
var ns6 = (document.getElementById)? true:false;
var ie4 = (document.all)? true:false;
if (ie4) var docRoot = 'document.body';
var ie5 = false;
if (ns4) {
var oW = window.innerWidth;
var oH = window.innerHeight;
window.onresize = function () {if (oW!=window.innerWidth||oH!=window.innerHeight) location.reload();}
}
 
 
// Microsoft Stupidity Check(tm).
if (ie4) {
if ((navigator.userAgent.indexOf('MSIE 5') > 0) || (navigator.userAgent.indexOf('MSIE 6') > 0)) {
if(document.compatMode && document.compatMode == 'CSS1Compat') docRoot = 'document.documentElement';
ie5 = true;
}
if (ns6) {
ns6 = false;
}
}
 
 
// Capture events, alt. diffuses the overlib function.
if ( (ns4) || (ie4) || (ns6)) {
document.onmousemove = mouseMove
if (ns4) document.captureEvents(Event.MOUSEMOVE)
} else {
overlib = no_overlib;
nd = no_overlib;
ver3fix = true;
}
 
 
// Fake function for 3.0 users.
function no_overlib() {
return ver3fix;
}
 
 
 
////////////////////////////////////////////////////////////////////////////////////
// PUBLIC FUNCTIONS
////////////////////////////////////////////////////////////////////////////////////
 
 
// overlib(arg0, ..., argN)
// Loads parameters into global runtime variables.
function overlib() {
// Load defaults to runtime.
o3_text = ol_text;
o3_cap = ol_cap;
o3_sticky = ol_sticky;
o3_background = ol_background;
o3_close = ol_close;
o3_hpos = ol_hpos;
o3_offsetx = ol_offsetx;
o3_offsety = ol_offsety;
o3_fgcolor = ol_fgcolor;
o3_bgcolor = ol_bgcolor;
o3_textcolor = ol_textcolor;
o3_capcolor = ol_capcolor;
o3_closecolor = ol_closecolor;
o3_width = ol_width;
o3_border = ol_border;
o3_status = ol_status;
o3_autostatus = ol_autostatus;
o3_height = ol_height;
o3_snapx = ol_snapx;
o3_snapy = ol_snapy;
o3_fixx = ol_fixx;
o3_fixy = ol_fixy;
o3_fgbackground = ol_fgbackground;
o3_bgbackground = ol_bgbackground;
o3_padxl = ol_padxl;
o3_padxr = ol_padxr;
o3_padyt = ol_padyt;
o3_padyb = ol_padyb;
o3_fullhtml = ol_fullhtml;
o3_vpos = ol_vpos;
o3_aboveheight = ol_aboveheight;
o3_capicon = ol_capicon;
o3_textfont = ol_textfont;
o3_captionfont = ol_captionfont;
o3_closefont = ol_closefont;
o3_textsize = ol_textsize;
o3_captionsize = ol_captionsize;
o3_closesize = ol_closesize;
o3_timeout = ol_timeout;
o3_function = ol_function;
o3_delay = ol_delay;
o3_hauto = ol_hauto;
o3_vauto = ol_vauto;
o3_closeclick = ol_closeclick;
o3_css = ol_css;
o3_fgclass = ol_fgclass;
o3_bgclass = ol_bgclass;
o3_textfontclass = ol_textfontclass;
o3_captionfontclass = ol_captionfontclass;
o3_closefontclass = ol_closefontclass;
o3_padunit = ol_padunit;
o3_heightunit = ol_heightunit;
o3_widthunit = ol_widthunit;
o3_textsizeunit = ol_textsizeunit;
o3_textdecoration = ol_textdecoration;
o3_textstyle = ol_textstyle;
o3_textweight = ol_textweight;
o3_captionsizeunit = ol_captionsizeunit;
o3_captiondecoration = ol_captiondecoration;
o3_captionstyle = ol_captionstyle;
o3_captionweight = ol_captionweight;
o3_closesizeunit = ol_closesizeunit;
o3_closedecoration = ol_closedecoration;
o3_closestyle = ol_closestyle;
o3_closeweight = ol_closeweight;
fnRef = '';
 
// Special for frame support, over must be reset...
if ( (ns4) || (ie4) || (ns6) ) {
if (over) cClick();
o3_frame = ol_frame;
if (ns4) over = o3_frame.document.overDiv
if (ie4) over = o3_frame.overDiv.style
if (ns6) over = o3_frame.document.getElementById("overDiv");
}
// What the next argument is expected to be.
var parsemode = -1, udf, v = null;
var ar = arguments;
udf = (!ar.length ? 1 : 0);
 
for (i = 0; i < ar.length; i++) {
 
if (parsemode < 0) {
// Arg is maintext, unless its a PARAMETER
if (typeof ar[i] == 'number') {
udf = (ar[i] == FUNCTION ? 0 : 1);
i--;
} else {
o3_text = ar[i];
}
 
parsemode = 0;
} else {
// Note: NS4 doesn't like switch cases with vars.
if (ar[i] == INARRAY) { udf = 0; o3_text = ol_texts[ar[++i]]; continue; }
if (ar[i] == CAPARRAY) { o3_cap = ol_caps[ar[++i]]; continue; }
if (ar[i] == STICKY) { o3_sticky = 1; continue; }
if (ar[i] == BACKGROUND) { o3_background = ar[++i]; continue; }
if (ar[i] == NOCLOSE) { o3_close = ""; continue; }
if (ar[i] == CAPTION) { o3_cap = ar[++i]; continue; }
if (ar[i] == CENTER || ar[i] == LEFT || ar[i] == RIGHT) { o3_hpos = ar[i]; continue; }
if (ar[i] == OFFSETX) { o3_offsetx = ar[++i]; continue; }
if (ar[i] == OFFSETY) { o3_offsety = ar[++i]; continue; }
if (ar[i] == FGCOLOR) { o3_fgcolor = ar[++i]; continue; }
if (ar[i] == BGCOLOR) { o3_bgcolor = ar[++i]; continue; }
if (ar[i] == TEXTCOLOR) { o3_textcolor = ar[++i]; continue; }
if (ar[i] == CAPCOLOR) { o3_capcolor = ar[++i]; continue; }
if (ar[i] == CLOSECOLOR) { o3_closecolor = ar[++i]; continue; }
if (ar[i] == WIDTH) { o3_width = ar[++i]; continue; }
if (ar[i] == BORDER) { o3_border = ar[++i]; continue; }
if (ar[i] == STATUS) { o3_status = ar[++i]; continue; }
if (ar[i] == AUTOSTATUS) { o3_autostatus = (o3_autostatus == 1) ? 0 : 1; continue; }
if (ar[i] == AUTOSTATUSCAP) { o3_autostatus = (o3_autostatus == 2) ? 0 : 2; continue; }
if (ar[i] == HEIGHT) { o3_height = ar[++i]; o3_aboveheight = ar[i]; continue; } // Same param again.
if (ar[i] == CLOSETEXT) { o3_close = ar[++i]; continue; }
if (ar[i] == SNAPX) { o3_snapx = ar[++i]; continue; }
if (ar[i] == SNAPY) { o3_snapy = ar[++i]; continue; }
if (ar[i] == FIXX) { o3_fixx = ar[++i]; continue; }
if (ar[i] == FIXY) { o3_fixy = ar[++i]; continue; }
if (ar[i] == FGBACKGROUND) { o3_fgbackground = ar[++i]; continue; }
if (ar[i] == BGBACKGROUND) { o3_bgbackground = ar[++i]; continue; }
if (ar[i] == PADX) { o3_padxl = ar[++i]; o3_padxr = ar[++i]; continue; }
if (ar[i] == PADY) { o3_padyt = ar[++i]; o3_padyb = ar[++i]; continue; }
if (ar[i] == FULLHTML) { o3_fullhtml = 1; continue; }
if (ar[i] == BELOW || ar[i] == ABOVE) { o3_vpos = ar[i]; continue; }
if (ar[i] == CAPICON) { o3_capicon = ar[++i]; continue; }
if (ar[i] == TEXTFONT) { o3_textfont = ar[++i]; continue; }
if (ar[i] == CAPTIONFONT) { o3_captionfont = ar[++i]; continue; }
if (ar[i] == CLOSEFONT) { o3_closefont = ar[++i]; continue; }
if (ar[i] == TEXTSIZE) { o3_textsize = ar[++i]; continue; }
if (ar[i] == CAPTIONSIZE) { o3_captionsize = ar[++i]; continue; }
if (ar[i] == CLOSESIZE) { o3_closesize = ar[++i]; continue; }
if (ar[i] == FRAME) { opt_FRAME(ar[++i]); continue; }
if (ar[i] == TIMEOUT) { o3_timeout = ar[++i]; continue; }
if (ar[i] == FUNCTION) { udf = 0; if (typeof ar[i+1] != 'number') v = ar[++i]; opt_FUNCTION(v); continue; }
if (ar[i] == DELAY) { o3_delay = ar[++i]; continue; }
if (ar[i] == HAUTO) { o3_hauto = (o3_hauto == 0) ? 1 : 0; continue; }
if (ar[i] == VAUTO) { o3_vauto = (o3_vauto == 0) ? 1 : 0; continue; }
if (ar[i] == CLOSECLICK) { o3_closeclick = (o3_closeclick == 0) ? 1 : 0; continue; }
if (ar[i] == CSSOFF) { o3_css = ar[i]; continue; }
if (ar[i] == CSSSTYLE) { o3_css = ar[i]; continue; }
if (ar[i] == CSSCLASS) { o3_css = ar[i]; continue; }
if (ar[i] == FGCLASS) { o3_fgclass = ar[++i]; continue; }
if (ar[i] == BGCLASS) { o3_bgclass = ar[++i]; continue; }
if (ar[i] == TEXTFONTCLASS) { o3_textfontclass = ar[++i]; continue; }
if (ar[i] == CAPTIONFONTCLASS) { o3_captionfontclass = ar[++i]; continue; }
if (ar[i] == CLOSEFONTCLASS) { o3_closefontclass = ar[++i]; continue; }
if (ar[i] == PADUNIT) { o3_padunit = ar[++i]; continue; }
if (ar[i] == HEIGHTUNIT) { o3_heightunit = ar[++i]; continue; }
if (ar[i] == WIDTHUNIT) { o3_widthunit = ar[++i]; continue; }
if (ar[i] == TEXTSIZEUNIT) { o3_textsizeunit = ar[++i]; continue; }
if (ar[i] == TEXTDECORATION) { o3_textdecoration = ar[++i]; continue; }
if (ar[i] == TEXTSTYLE) { o3_textstyle = ar[++i]; continue; }
if (ar[i] == TEXTWEIGHT) { o3_textweight = ar[++i]; continue; }
if (ar[i] == CAPTIONSIZEUNIT) { o3_captionsizeunit = ar[++i]; continue; }
if (ar[i] == CAPTIONDECORATION) { o3_captiondecoration = ar[++i]; continue; }
if (ar[i] == CAPTIONSTYLE) { o3_captionstyle = ar[++i]; continue; }
if (ar[i] == CAPTIONWEIGHT) { o3_captionweight = ar[++i]; continue; }
if (ar[i] == CLOSESIZEUNIT) { o3_closesizeunit = ar[++i]; continue; }
if (ar[i] == CLOSEDECORATION) { o3_closedecoration = ar[++i]; continue; }
if (ar[i] == CLOSESTYLE) { o3_closestyle = ar[++i]; continue; }
if (ar[i] == CLOSEWEIGHT) { o3_closeweight = ar[++i]; continue; }
}
}
if (udf && o3_function) o3_text = o3_function();
 
if (o3_delay == 0) {
return overlib351();
} else {
o3_delayid = setTimeout("overlib351()", o3_delay);
return false;
}
}
 
 
 
// Clears popups if appropriate
function nd() {
if ( o3_removecounter >= 1 ) { o3_showingsticky = 0 };
if ( (ns4) || (ie4) || (ns6) ) {
if ( o3_showingsticky == 0 ) {
o3_allowmove = 0;
if (over != null) hideObject(over);
} else {
o3_removecounter++;
}
}
return true;
}
 
 
 
 
 
 
 
////////////////////////////////////////////////////////////////////////////////////
// OVERLIB 3.51 FUNCTION
////////////////////////////////////////////////////////////////////////////////////
 
 
// This function decides what it is we want to display and how we want it done.
function overlib351() {
 
// Make layer content
var layerhtml;
 
if (o3_background != "" || o3_fullhtml) {
// Use background instead of box.
layerhtml = ol_content_background(o3_text, o3_background, o3_fullhtml);
} else {
// They want a popup box.
 
// Prepare popup background
if (o3_fgbackground != "" && o3_css == CSSOFF) {
o3_fgbackground = "BACKGROUND=\""+o3_fgbackground+"\"";
}
if (o3_bgbackground != "" && o3_css == CSSOFF) {
o3_bgbackground = "BACKGROUND=\""+o3_bgbackground+"\"";
}
 
// Prepare popup colors
if (o3_fgcolor != "" && o3_css == CSSOFF) {
o3_fgcolor = "BGCOLOR=\""+o3_fgcolor+"\"";
}
if (o3_bgcolor != "" && o3_css == CSSOFF) {
o3_bgcolor = "BGCOLOR=\""+o3_bgcolor+"\"";
}
 
// Prepare popup height
if (o3_height > 0 && o3_css == CSSOFF) {
o3_height = "HEIGHT=" + o3_height;
} else {
o3_height = "";
}
 
// Decide which kinda box.
if (o3_cap == "") {
// Plain
layerhtml = ol_content_simple(o3_text);
} else {
// With caption
if (o3_sticky) {
// Show close text
layerhtml = ol_content_caption(o3_text, o3_cap, o3_close);
} else {
// No close text
layerhtml = ol_content_caption(o3_text, o3_cap, "");
}
}
}
// We want it to stick!
if (o3_sticky) {
if (o3_timerid > 0) {
clearTimeout(o3_timerid);
o3_timerid = 0;
}
o3_showingsticky = 1;
o3_removecounter = 0;
}
// Write layer
layerWrite(layerhtml);
// Prepare status bar
if (o3_autostatus > 0) {
o3_status = o3_text;
if (o3_autostatus > 1) {
o3_status = o3_cap;
}
}
 
// When placing the layer the first time, even stickies may be moved.
o3_allowmove = 0;
 
// Initiate a timer for timeout
if (o3_timeout > 0) {
if (o3_timerid > 0) clearTimeout(o3_timerid);
o3_timerid = setTimeout("cClick()", o3_timeout);
}
 
// Show layer
disp(o3_status);
 
// Stickies should stay where they are.
if (o3_sticky) o3_allowmove = 0;
 
return (o3_status != '');
}
 
 
 
////////////////////////////////////////////////////////////////////////////////////
// LAYER GENERATION FUNCTIONS
////////////////////////////////////////////////////////////////////////////////////
 
// Makes simple table without caption
function ol_content_simple(text) {
if (o3_css == CSSCLASS) txt = "<TABLE WIDTH="+o3_width+" BORDER=0 CELLPADDING="+o3_border+" CELLSPACING=0 class=\""+o3_bgclass+"\"><TR><TD><TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 class=\""+o3_fgclass+"\"><TR><TD VALIGN=TOP><FONT class=\""+o3_textfontclass+"\">"+text+"</FONT></TD></TR></TABLE></TD></TR></TABLE>";
if (o3_css == CSSSTYLE) txt = "<TABLE WIDTH="+o3_width+" BORDER=0 CELLPADDING="+o3_border+" CELLSPACING=0 style=\"background-color: "+o3_bgcolor+"; height: "+o3_height+o3_heightunit+";\"><TR><TD><TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 style=\"color: "+o3_fgcolor+"; background-color: "+o3_fgcolor+"; height: "+o3_height+o3_heightunit+";\"><TR><TD VALIGN=TOP><FONT style=\"font-family: "+o3_textfont+"; color: "+o3_textcolor+"; font-size: "+o3_textsize+o3_textsizeunit+"; text-decoration: "+o3_textdecoration+"; font-weight: "+o3_textweight+"; font-style:"+o3_textstyle+"\">"+text+"</FONT></TD></TR></TABLE></TD></TR></TABLE>";
if (o3_css == CSSOFF) txt = "<TABLE WIDTH="+o3_width+" BORDER=0 CELLPADDING="+o3_border+" CELLSPACING=0 "+o3_bgcolor+" "+o3_height+"><TR><TD><TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 "+o3_fgcolor+" "+o3_fgbackground+" "+o3_height+"><TR><TD VALIGN=TOP><FONT FACE=\""+o3_textfont+"\" COLOR=\""+o3_textcolor+"\" SIZE=\""+o3_textsize+"\">"+text+"</FONT></TD></TR></TABLE></TD></TR></TABLE>";
 
set_background("");
return txt;
}
 
 
 
 
// Makes table with caption and optional close link
function ol_content_caption(text, title, close) {
closing = "";
closeevent = "onMouseOver";
 
if (o3_closeclick == 1) closeevent = "onClick";
if (o3_capicon != "") o3_capicon = "<IMG SRC=\""+o3_capicon+"\"> ";
 
if (close != "") {
if (o3_css == CSSCLASS) closing = "<TD ALIGN=RIGHT><A HREF=\"javascript:return "+fnRef+"cClick();\" "+closeevent+"=\"return " + fnRef + "cClick();\" class=\""+o3_closefontclass+"\">"+close+"</A></TD>";
if (o3_css == CSSSTYLE) closing = "<TD ALIGN=RIGHT><A HREF=\"javascript:return "+fnRef+"cClick();\" "+closeevent+"=\"return " + fnRef + "cClick();\" style=\"color: "+o3_closecolor+"; font-family: "+o3_closefont+"; font-size: "+o3_closesize+o3_closesizeunit+"; text-decoration: "+o3_closedecoration+"; font-weight: "+o3_closeweight+"; font-style:"+o3_closestyle+";\">"+close+"</A></TD>";
if (o3_css == CSSOFF) closing = "<TD ALIGN=RIGHT><A HREF=\"javascript:return "+fnRef+"cClick();\" "+closeevent+"=\"return " + fnRef + "cClick();\"><FONT COLOR=\""+o3_closecolor+"\" FACE=\""+o3_closefont+"\" SIZE=\""+o3_closesize+"\">"+close+"</FONT></A></TD>";
}
 
if (o3_css == CSSCLASS) txt = "<TABLE WIDTH="+o3_width+" BORDER=0 CELLPADDING="+o3_border+" CELLSPACING=0 class=\""+o3_bgclass+"\"><TR><TD><TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0><TR><TD><FONT class=\""+o3_captionfontclass+"\">"+o3_capicon+title+"</FONT></TD>"+closing+"</TR></TABLE><TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 class=\""+o3_fgclass+"\"><TR><TD VALIGN=TOP><FONT class=\""+o3_textfontclass+"\">"+text+"</FONT></TD></TR></TABLE></TD></TR></TABLE>";
if (o3_css == CSSSTYLE) txt = "<TABLE WIDTH="+o3_width+" BORDER=0 CELLPADDING="+o3_border+" CELLSPACING=0 style=\"background-color: "+o3_bgcolor+"; background-image: url("+o3_bgbackground+"); height: "+o3_height+o3_heightunit+";\"><TR><TD><TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0><TR><TD><FONT style=\"font-family: "+o3_captionfont+"; color: "+o3_capcolor+"; font-size: "+o3_captionsize+o3_captionsizeunit+"; font-weight: "+o3_captionweight+"; font-style: "+o3_captionstyle+"; text-decoration: " + o3_captiondecoration + ";\">"+o3_capicon+title+"</FONT></TD>"+closing+"</TR></TABLE><TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 style=\"color: "+o3_fgcolor+"; background-color: "+o3_fgcolor+"; height: "+o3_height+o3_heightunit+";\"><TR><TD VALIGN=TOP><FONT style=\"font-family: "+o3_textfont+"; color: "+o3_textcolor+"; font-size: "+o3_textsize+o3_textsizeunit+"; text-decoration: "+o3_textdecoration+"; font-weight: "+o3_textweight+"; font-style:"+o3_textstyle+"\">"+text+"</FONT></TD></TR></TABLE></TD></TR></TABLE>";
if (o3_css == CSSOFF) txt = "<TABLE WIDTH="+o3_width+" BORDER=0 CELLPADDING="+o3_border+" CELLSPACING=0 "+o3_bgcolor+" "+o3_bgbackground+" "+o3_height+"><TR><TD><TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0><TR><TD><B><FONT COLOR=\""+o3_capcolor+"\" FACE=\""+o3_captionfont+"\" SIZE=\""+o3_captionsize+"\">"+o3_capicon+title+"</FONT></B></TD>"+closing+"</TR></TABLE><TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 "+o3_fgcolor+" "+o3_fgbackground+" "+o3_height+"><TR><TD VALIGN=TOP><FONT COLOR=\""+o3_textcolor+"\" FACE=\""+o3_textfont+"\" SIZE=\""+o3_textsize+"\">"+text+"</FONT></TD></TR></TABLE></TD></TR></TABLE>";
 
set_background("");
return txt;
}
 
// Sets the background picture, padding and lots more. :)
function ol_content_background(text, picture, hasfullhtml) {
var txt;
if (hasfullhtml) {
txt = text;
} else {
var pU, hU, wU;
pU = (o3_padunit == '%' ? '%' : '');
hU = (o3_heightunit == '%' ? '%' : '');
wU = (o3_widthunit == '%' ? '%' : '');
 
if (o3_css == CSSCLASS) txt = "<TABLE WIDTH="+o3_width+" BORDER=0 CELLPADDING=0 CELLSPACING=0 HEIGHT="+o3_height+"><TR><TD COLSPAN=3 HEIGHT="+o3_padyt+"></TD></TR><TR><TD WIDTH="+o3_padxl+"></TD><TD VALIGN=TOP WIDTH="+(o3_width-o3_padxl-o3_padxr)+"><FONT class=\""+o3_textfontclass+"\">"+text+"</FONT></TD><TD WIDTH="+o3_padxr+"></TD></TR><TR><TD COLSPAN=3 HEIGHT="+o3_padyb+"></TD></TR></TABLE>";
if (o3_css == CSSSTYLE) txt = "<TABLE WIDTH="+o3_width+wU+" BORDER=0 CELLPADDING=0 CELLSPACING=0 HEIGHT="+o3_height+hU+"><TR><TD COLSPAN=3 HEIGHT="+o3_padyt+pU+"></TD></TR><TR><TD WIDTH="+o3_padxl+pU+"></TD><TD VALIGN=TOP WIDTH="+(o3_width-o3_padxl-o3_padxr)+pU+"><FONT style=\"font-family: "+o3_textfont+"; color: "+o3_textcolor+"; font-size: "+o3_textsize+o3_textsizeunit+";\">"+text+"</FONT></TD><TD WIDTH="+o3_padxr+pU+"></TD></TR><TR><TD COLSPAN=3 HEIGHT="+o3_padyb+pU+"></TD></TR></TABLE>";
if (o3_css == CSSOFF) txt = "<TABLE WIDTH="+o3_width+" BORDER=0 CELLPADDING=0 CELLSPACING=0 HEIGHT="+o3_height+"><TR><TD COLSPAN=3 HEIGHT="+o3_padyt+"></TD></TR><TR><TD WIDTH="+o3_padxl+"></TD><TD VALIGN=TOP WIDTH="+(o3_width-o3_padxl-o3_padxr)+"><FONT FACE=\""+o3_textfont+"\" COLOR=\""+o3_textcolor+"\" SIZE=\""+o3_textsize+"\">"+text+"</FONT></TD><TD WIDTH="+o3_padxr+"></TD></TR><TR><TD COLSPAN=3 HEIGHT="+o3_padyb+"></TD></TR></TABLE>";
}
set_background(picture);
return txt;
}
 
// Loads a picture into the div.
function set_background(pic) {
if (pic == "") {
if (ns4) over.background.src = null;
if (ie4) over.backgroundImage = "none";
if (ns6) over.style.backgroundImage = "none";
} else {
if (ns4) {
over.background.src = pic;
} else if (ie4) {
over.backgroundImage = "url("+pic+")";
} else if (ns6) {
over.style.backgroundImage = "url("+pic+")";
}
}
}
 
 
 
////////////////////////////////////////////////////////////////////////////////////
// HANDLING FUNCTIONS
////////////////////////////////////////////////////////////////////////////////////
 
 
// Displays the popup
function disp(statustext) {
if ( (ns4) || (ie4) || (ns6) ) {
if (o3_allowmove == 0) {
placeLayer();
showObject(over);
o3_allowmove = 1;
}
}
 
if (statustext != "") {
self.status = statustext;
}
}
 
// Decides where we want the popup.
function placeLayer() {
var placeX, placeY;
// HORIZONTAL PLACEMENT
if (o3_fixx > -1) {
// Fixed position
placeX = o3_fixx;
} else {
winoffset = (ie4) ? eval('o3_frame.'+docRoot+'.scrollLeft') : o3_frame.pageXOffset;
if (ie4) iwidth = eval('o3_frame.'+docRoot+'.clientWidth');
if (ns4 || ns6) iwidth = o3_frame.innerWidth;
// If HAUTO, decide what to use.
if (o3_hauto == 1) {
if ( (o3_x - winoffset) > ((eval(iwidth)) / 2)) {
o3_hpos = LEFT;
} else {
o3_hpos = RIGHT;
}
}
// From mouse
if (o3_hpos == CENTER) { // Center
placeX = o3_x+o3_offsetx-(o3_width/2);
if (placeX < winoffset) placeX = winoffset;
}
if (o3_hpos == RIGHT) { // Right
placeX = o3_x+o3_offsetx;
if ( (eval(placeX) + eval(o3_width)) > (winoffset + iwidth) ) {
placeX = iwidth + winoffset - o3_width;
if (placeX < 0) placeX = 0;
}
}
if (o3_hpos == LEFT) { // Left
placeX = o3_x-o3_offsetx-o3_width;
if (placeX < winoffset) placeX = winoffset;
}
// Snapping!
if (o3_snapx > 1) {
var snapping = placeX % o3_snapx;
if (o3_hpos == LEFT) {
placeX = placeX - (o3_snapx + snapping);
} else {
// CENTER and RIGHT
placeX = placeX + (o3_snapx - snapping);
}
if (placeX < winoffset) placeX = winoffset;
}
}
 
// VERTICAL PLACEMENT
if (o3_fixy > -1) {
// Fixed position
placeY = o3_fixy;
} else {
scrolloffset = (ie4) ? eval('o3_frame.'+docRoot+'.scrollTop') : o3_frame.pageYOffset;
 
// If VAUTO, decide what to use.
if (o3_vauto == 1) {
if (ie4) iheight = eval('o3_frame.'+docRoot+'.clientHeight');
if (ns4 || ns6) iheight = o3_frame.innerHeight;
 
iheight = (eval(iheight)) / 2;
if ( (o3_y - scrolloffset) > iheight) {
o3_vpos = ABOVE;
} else {
o3_vpos = BELOW;
}
}
 
 
// From mouse
if (o3_vpos == ABOVE) {
if (o3_aboveheight == 0) {
var divref = (ie4) ? o3_frame.document.all['overDiv'] : over;
o3_aboveheight = (ns4) ? divref.clip.height : divref.offsetHeight;
}
 
placeY = o3_y - (o3_aboveheight + o3_offsety);
if (placeY < scrolloffset) placeY = scrolloffset;
} else {
// BELOW
placeY = o3_y + o3_offsety;
}
 
// Snapping!
if (o3_snapy > 1) {
var snapping = placeY % o3_snapy;
if (o3_aboveheight > 0 && o3_vpos == ABOVE) {
placeY = placeY - (o3_snapy + snapping);
} else {
placeY = placeY + (o3_snapy - snapping);
}
if (placeY < scrolloffset) placeY = scrolloffset;
}
}
 
 
// Actually move the object.
repositionTo(over, placeX, placeY);
}
 
 
// Moves the layer
function mouseMove(e) {
if ( (ns4) || (ns6) ) {o3_x=e.pageX; o3_y=e.pageY;}
if (ie4) {o3_x=event.x; o3_y=event.y;}
if (ie5) {o3_x=eval('event.x+o3_frame.'+docRoot+'.scrollLeft'); o3_y=eval('event.y+o3_frame.'+docRoot+'.scrollTop');}
if (o3_allowmove == 1) {
placeLayer();
}
}
 
// The Close onMouseOver function for stickies
function cClick() {
hideObject(over);
o3_showingsticky = 0;
return false;
}
 
 
// Makes sure target frame has overLIB
function compatibleframe(frameid) {
if (ns4) {
if (typeof frameid.document.overDiv =='undefined') return false;
} else if (ie4) {
if (typeof frameid.document.all["overDiv"] =='undefined') return false;
} else if (ns6) {
if (frameid.document.getElementById('overDiv') == null) return false;
}
 
return true;
}
 
 
 
////////////////////////////////////////////////////////////////////////////////////
// LAYER FUNCTIONS
////////////////////////////////////////////////////////////////////////////////////
 
 
// Writes to a layer
function layerWrite(txt) {
txt += "\n";
if (ns4) {
var lyr = o3_frame.document.overDiv.document
lyr.write(txt)
lyr.close()
} else if (ie4) {
o3_frame.document.all["overDiv"].innerHTML = txt
} else if (ns6) {
range = o3_frame.document.createRange();
range.setStartBefore(over);
domfrag = range.createContextualFragment(txt);
while (over.hasChildNodes()) {
over.removeChild(over.lastChild);
}
over.appendChild(domfrag);
}
}
 
// Make an object visible
function showObject(obj) {
if (ns4) obj.visibility = "show";
else if (ie4) obj.visibility = "visible";
else if (ns6) obj.style.visibility = "visible";
}
 
// Hides an object
function hideObject(obj) {
if (ns4) obj.visibility = "hide";
else if (ie4) obj.visibility = "hidden";
else if (ns6) obj.style.visibility = "hidden";
 
if (o3_timerid > 0) clearTimeout(o3_timerid);
if (o3_delayid > 0) clearTimeout(o3_delayid);
o3_timerid = 0;
o3_delayid = 0;
self.status = "";
}
 
// Move a layer
function repositionTo(obj,xL,yL) {
if ( (ns4) || (ie4) ) {
obj.left = (ie4 ? xL + 'px' : xL);
obj.top = (ie4 ? yL + 'px' : yL);
} else if (ns6) {
obj.style.left = xL + "px";
obj.style.top = yL+ "px";
}
}
 
function getFrameRef(thisFrame, ofrm) {
var retVal = '';
for (var i=0; i<thisFrame.length; i++) {
if (thisFrame[i].length > 0) {
retVal = getFrameRef(thisFrame[i],ofrm);
if (retVal == '') continue;
} else if (thisFrame[i] != ofrm) continue;
retVal = '['+i+']' + retVal;
break;
}
return retVal;
}
 
 
 
 
////////////////////////////////////////////////////////////////////////////////////
// PARSER FUNCTIONS
////////////////////////////////////////////////////////////////////////////////////
 
 
// Defines which frame we should point to.
function opt_FRAME(frm) {
o3_frame = compatibleframe(frm) ? frm : ol_frame;
 
if (o3_frame != ol_frame) {
var tFrm = getFrameRef(top.frames, o3_frame);
var sFrm = getFrameRef(top.frames, ol_frame);
 
if (sFrm.length == tFrm.length) {
l = tFrm.lastIndexOf('[');
if (l) {
while(sFrm.substring(0,l) != tFrm.substring(0,l)) l = tFrm.lastIndexOf('[',l-1);
tFrm = tFrm.substr(l);
sFrm = sFrm.substr(l);
}
}
var cnt = 0, p = '', str = tFrm;
while((k = str.lastIndexOf('[')) != -1) {
cnt++;
str = str.substring(0,k);
}
 
for (var i=0; i<cnt; i++) p = p + 'parent.';
fnRef = p + 'frames' + sFrm + '.';
}
 
if ( (ns4) || (ie4 || (ns6)) ) {
if (ns4) over = o3_frame.document.overDiv;
if (ie4) over = o3_frame.overDiv.style;
if (ns6) over = o3_frame.document.getElementById("overDiv");
}
 
return 0;
}
 
// Calls an external function
function opt_FUNCTION(callme) {
o3_text = (callme ? callme() : (o3_function ? o3_function() : 'No Function'));
return 0;
}
 
 
 
 
//end (For internal purposes.)
////////////////////////////////////////////////////////////////////////////////////
// OVERLIB 2 COMPATABILITY FUNCTIONS
// If you aren't upgrading you can remove the below section.
////////////////////////////////////////////////////////////////////////////////////
 
// Converts old 0=left, 1=right and 2=center into constants.
function vpos_convert(d) {
if (d == 0) {
d = LEFT;
} else {
if (d == 1) {
d = RIGHT;
} else {
d = CENTER;
}
}
return d;
}
 
// Simple popup
function dts(d,text) {
o3_hpos = vpos_convert(d);
overlib(text, o3_hpos, CAPTION, "");
}
 
// Caption popup
function dtc(d,text, title) {
o3_hpos = vpos_convert(d);
overlib(text, CAPTION, title, o3_hpos);
}
 
// Sticky
function stc(d,text, title) {
o3_hpos = vpos_convert(d);
overlib(text, CAPTION, title, o3_hpos, STICKY);
}
 
// Simple popup right
function drs(text) {
dts(1,text);
}
 
// Caption popup right
function drc(text, title) {
dtc(1,text,title);
}
 
// Sticky caption right
function src(text,title) {
stc(1,text,title);
}
 
// Simple popup left
function dls(text) {
dts(0,text);
}
 
// Caption popup left
function dlc(text, title) {
dtc(0,text,title);
}
 
// Sticky caption left
function slc(text,title) {
stc(0,text,title);
}
 
// Simple popup center
function dcs(text) {
dts(2,text);
}
 
// Caption popup center
function dcc(text, title) {
dtc(2,text,title);
}
 
// Sticky caption center
function scc(text,title) {
stc(2,text,title);
}
/web/kaklik's_web/torrentflux/profile.php
0,0 → 1,520
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
//****************************************************************************
// showIndex -- main view
function showIndex()
{
global $cfg, $db;
 
$hideChecked = "";
 
if ($cfg["hide_offline"] == 1)
{
$hideChecked = "checked";
}
 
DisplayHead($cfg["user"]."'s "._PROFILE);
 
echo "<div align=\"center\">";
echo "<table border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" width=\"760\">";
echo "<tr><td colspan=6 bgcolor=\"".$cfg["table_data_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\">".$cfg["user"]."'s "._PROFILE."</font>";
echo "</td></tr><tr><td align=\"center\">";
 
$total_activity = GetActivityCount();
 
$sql= "SELECT user_id, hits, last_visit, time_created, user_level FROM tf_users WHERE user_id=".$db->qstr($cfg["user"]);
list($user_id, $hits, $last_visit, $time_created, $user_level) = $db->GetRow($sql);
 
$user_type = _NORMALUSER;
if (IsAdmin())
{
$user_type = _ADMINISTRATOR;
}
if (IsSuperAdmin())
{
$user_type = _SUPERADMIN;
}
 
 
$user_activity = GetActivityCount($cfg["user"]);
 
if ($user_activity == 0)
{
$user_percent = 0;
}
else
{
$user_percent = number_format(($user_activity/$total_activity)*100);
}
 
?>
 
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td width="50%" bgcolor="<?php echo $cfg["table_data_bg"] ?>" valign="top">
 
<div align="center">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="right"><?php echo _JOINED ?>:&nbsp;</td>
<td><strong><?php echo date(_DATETIMEFORMAT, $time_created) ?></strong></td>
</tr>
<tr>
<td colspan="2" align="center">&nbsp;</td>
</tr>
<tr>
<td align="right"><?php echo _UPLOADPARTICIPATION ?>:&nbsp;</td>
<td>
<table width="200" border="0" cellpadding="0" cellspacing="0">
<tr>
<td background="themes/<?php echo $cfg["theme"] ?>/images/proglass.gif" width="<?php echo $user_percent*2 ?>"><img src="images/blank.gif" width="1" height="12" border="0"></td>
<td background="themes/<?php echo $cfg["theme"] ?>/images/noglass.gif" width="<?php echo (200 - ($user_percent*2)) ?>"><img src="images/blank.gif" width="1" height="12" border="0"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="right"><?php echo _UPLOADS ?>:&nbsp;</td>
<td><strong><?php echo $user_activity ?></strong></td>
</tr>
<tr>
<td align="right"><?php echo _PERCENTPARTICIPATION ?>:&nbsp;</td>
<td><strong><?php echo $user_percent ?>%</strong></td>
</tr>
<tr>
<td colspan="2" align="center"><div align="center" class="tiny">(<?php echo _PARTICIPATIONSTATEMENT. " ".$cfg['days_to_keep']." "._DAYS ?>)</div><br></td>
</tr>
<tr>
<td align="right"><?php echo _TOTALPAGEVIEWS ?>:&nbsp;</td>
<td><strong><?php echo $hits ?></strong></td>
</tr>
<tr>
<td align="right"><?php echo _USERTYPE ?>:&nbsp;</td>
<td><strong><?php echo $user_type ?></strong></td>
</tr>
<tr>
<td colspan="2" align="center">
<table>
<tr>
<td align="center">
<BR />[ <a href="?op=showCookies">Cookie Management</a> ]
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
 
</td>
<td valign="top">
<div align="center">
<table cellpadding="5" cellspacing="0" border="0">
<form name="theForm" action="profile.php?op=updateProfile" method="post" onsubmit="return validateProfile()">
<tr>
<td align="right"><?php echo _USER ?>:</td>
<td>
<input readonly="true" type="Text" value="<?php echo $cfg["user"] ?>" size="15">
</td>
</tr>
<tr>
<td align="right"><?php echo _NEWPASSWORD ?>:</td>
<td>
<input name="pass1" type="Password" value="" size="15">
</td>
</tr>
<tr>
<td align="right"><?php echo _CONFIRMPASSWORD ?>:</td>
<td>
<input name="pass2" type="Password" value="" size="15">
</td>
</tr>
<tr>
<td align="right"><?php echo _THEME ?>:</td>
<td>
<select name="theme">
<?php
$arThemes = GetThemes();
for($inx = 0; $inx < sizeof($arThemes); $inx++)
{
$selected = "";
if ($cfg["theme"] == $arThemes[$inx])
{
$selected = "selected";
}
echo "<option value=\"".$arThemes[$inx]."\" ".$selected.">".$arThemes[$inx]."</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td align="right"><?php echo _LANGUAGE ?>:</td>
<td>
<select name="language">
<?php
$arLanguage = GetLanguages();
for($inx = 0; $inx < sizeof($arLanguage); $inx++)
{
$selected = "";
if ($cfg["language_file"] == $arLanguage[$inx])
{
$selected = "selected";
}
echo "<option value=\"".$arLanguage[$inx]."\" ".$selected.">".GetLanguageFromFile($arLanguage[$inx])."</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<input name="hideOffline" type="Checkbox" value="1" <?php echo $hideChecked ?>> <?php echo _HIDEOFFLINEUSERS ?><br>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="Submit" value="<?php echo _UPDATE ?>">
</td>
</tr>
</form>
</table>
</div>
</td>
</tr>
</table>
 
 
<script language="JavaScript">
function validateProfile()
{
var msg = ""
if (theForm.pass1.value != "" || theForm.pass2.value != "")
{
if (theForm.pass1.value.length <= 5 || theForm.pass2.value.length <= 5)
{
msg = msg + "* <?php echo _PASSWORDLENGTH ?>\n";
theForm.pass1.focus();
}
if (theForm.pass1.value != theForm.pass2.value)
{
msg = msg + "* <?php echo _PASSWORDNOTMATCH ?>\n";
theForm.pass1.value = "";
theForm.pass2.value = "";
theForm.pass1.focus();
}
}
 
if (msg != "")
{
alert("<?php echo _PLEASECHECKFOLLOWING ?>:\n\n" + msg);
return false;
}
else
{
return true;
}
}
</script>
 
<?php
echo "</td></tr>";
echo "</table></div><br><br>";
 
DisplayFoot();
}
 
 
//****************************************************************************
// updateProfile -- update profile
function updateProfile($pass1, $pass2, $hideOffline, $theme, $language)
{
Global $cfg;
 
if ($pass1 != "")
{
$_SESSION['user'] = md5($cfg["pagetitle"]);
}
 
UpdateUserProfile($cfg["user"], $pass1, $hideOffline, $theme, $language);
 
DisplayHead($cfg["user"]."'s "._PROFILE);
 
echo "<div align=\"center\">";
echo "<table border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\" width=\"760\">";
echo "<tr><td colspan=6 background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<font class=\"title\">".$cfg["user"]."'s "._PROFILE."</font>";
echo "</td></tr><tr><td align=\"center\">";
?>
<br>
<?php echo _PROFILEUPDATEDFOR." ".$cfg["user"] ?>
<br><br>
<?php
echo "</td></tr>";
echo "</table></div><br><br>";
 
DisplayFoot();
}
 
 
//****************************************************************************
// ShowCookies -- show cookies for user
function ShowCookies()
{
global $cfg, $db;
DisplayHead($cfg["user"] . "'s "._PROFILE);
 
$cid = $_GET["cid"]; // Cookie ID
 
// Used for when editing a cookie
$hostvalue = $datavalue = "";
if( !empty( $cid ) )
{
// Get cookie information from database
$cookie = getCookie( $cid );
$hostvalue = " value=\"" . $cookie['host'] . "\"";
$datavalue = " value=\"" . $cookie['data'] . "\"";
}
 
?>
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
function popUp(name_file)
{
window.open (name_file,'help','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=800,height=600')
}
// End -->
</script>
<div align="center">[<a href="?">Return to Profile</a>]</div>
<br />
<div align="center">
<form action="?op=<?php echo ( !empty( $cid ) ) ? "modCookie" : "addCookie"; ?>"" method="post">
<input type="hidden" name="cid" value="<?php echo $cid;?>" />
<table border="1" bordercolor="<?php echo $cfg["table_admin_border"];?>" cellpadding="2" cellspacing="0" bgcolor="<?php echo $cfg["table_data_bg"];?>">
<tr>
<td colspan="3" bgcolor="<?php echo $cfg["table_header_bg"];?>" background="themes/<? echo $cfg["theme"] ?>/images/bar.gif">
<img src="images/properties.png" width=18 height=13 border=0 align="absbottom">&nbsp;<font class="title">Cookie Management</font>
</td>
</tr>
<tr>
<td width="80" align="right">&nbsp;Host:</td>
<td>
<input type="Text" size="50" maxlength="255" name="host"<?php echo $hostvalue;?>><BR />
</td>
<td>
www.host.com
</td>
</tr>
<tr>
<td width="80" align="right">&nbsp;Data:</td>
<td>
<input type="Text" size="50" maxlength="255" name="data"<?php echo $datavalue;?>><BR />
</td>
<td>
uid=123456;pass=a1b2c3d4e5f6g7h8i9j1
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td colspan="2">
<input type="Submit" value="<?php echo ( !empty( $cid ) ) ? _UPDATE : "Add"; ?>">
</td>
</tr>
<?php
// We are editing a cookie, so have a link back to cookie list
if( !empty( $cid ) )
{
?>
<tr>
<td colspan="3">
<center>[ <a href="?op=editCookies">back</a> ]</center>
</td>
</tr>
<?php
}
else
{
?>
<tr>
<td colspan="3">
<table border="1" bordercolor="<?php echo $cfg["table_admin_border"];?>" cellpadding="2" cellspacing="0" bgcolor="<?php echo $cfg["table_data_bg"];?>" width="100%">
<tr>
<td style="font-weight: bold; padding-left: 3px;" width="50">Action</td>
<td style="font-weight: bold; padding-left: 3px;">Host</td>
<td style="font-weight: bold; padding-left: 3px;">Data</td>
</tr>
<?php
// Output the list of cookies in the database
$sql = "SELECT c.cid, c.host, c.data FROM tf_cookies AS c, tf_users AS u WHERE u.uid=c.uid AND u.user_id='" . $cfg["user"] . "'";
$dat = $db->GetAll( $sql );
if( empty( $dat ) )
{
?>
<tr>
<td colspan="3">No cookie entries exist.</td>
</tr>
<?php
}
else
{
foreach( $dat as $cookie )
{
?>
<tr>
<td>
<a href="?op=deleteCookie&cid=<?php echo $cookie["cid"];?>"><img src="images/delete_on.gif" width=16 height=16 border=0 title="<?php echo _DELETE . " " . $cookie["host"]; ?>" align="absmiddle"></a>
<a href="?op=editCookies&cid=<?php echo $cookie["cid"];?>"><img src="images/properties.png" width=18 height=13 border=0 title="<?php echo _EDIT . " " . $cookie["host"]; ?>" align="absmiddle"></a>
</td>
<td><?php echo $cookie["host"];?></td>
<td><?php echo $cookie["data"];?></td>
</tr>
<?php
}
}
?>
</table>
</td>
</tr>
<?php
}
?>
<tr>
<td colspan="3">
<br>
<div align="center">
<A HREF="javascript:popUp('cookiehelp.php')">How to get cookie information....</A>
</div>
</td>
</tr>
</table>
</form>
</div>
<br />
<br />
<br />
<?php
DisplayFoot();
}
 
//****************************************************************************
// addCookie -- adding a Cookie Host Information
//****************************************************************************
function addCookie( $newCookie )
{
if( !empty( $newCookie ) )
{
global $cfg;
AddCookieInfo( $newCookie );
AuditAction( $cfg["constants"]["admin"], "New Cookie: " . $newCookie["host"] . " | " . $newCookie["data"] );
}
header( "location: profile.php?op=showCookies" );
}
 
//****************************************************************************
// deleteCookie -- delete a Cookie Host Information
//****************************************************************************
function deleteCookie($cid)
{
global $cfg;
$cookie = getCookie( $cid );
deleteCookieInfo( $cid );
AuditAction( $cfg["constants"]["admin"], _DELETE . " Cookie: " . $cookie["host"] );
header( "location: profile.php?op=showCookies" );
}
 
//****************************************************************************
// modCookie -- edit a Cookie Host Information
//****************************************************************************
function modCookie($cid,$newCookie)
{
global $cfg;
modCookieInfo($cid,$newCookie);
AuditAction($cfg["constants"]["admin"], "Modified Cookie: ".$newCookie["host"]." | ".$newCookie["data"]);
header("location: profile.php?op=showCookies");
}
 
//****************************************************************************
//****************************************************************************
//****************************************************************************
//****************************************************************************
// TRAFFIC CONTROLER
$op = getRequestVar('op');
 
switch ($op)
{
 
default:
showIndex();
exit;
break;
 
case "updateProfile":
$pass1 = getRequestVar('pass1');
$pass2 = getRequestVar('pass2');
$hideOffline = getRequestVar('hideOffline');
$theme = getRequestVar('theme');
$language = getRequestVar('language');
 
updateProfile($pass1, $pass2, $hideOffline, $theme, $language);
break;
 
// Show main Cookie Management
case "showCookies":
case "editCookies":
showCookies();
break;
 
// Add a new cookie to user
case "addCookie":
$newCookie["host"] = getRequestVar('host');
$newCookie["data"] = getRequestVar('data');
addCookie( $newCookie );
break;
 
// Modify an existing cookie from user
case "modCookie":
$newCookie["host"] = getRequestVar( 'host' );
$newCookie["data"] = getRequestVar( 'data' );
$cid = getRequestVar( 'cid' );
modCookie( $cid, $newCookie );
break;
 
// Delete selected cookie from user
case "deleteCookie":
$cid = $_GET["cid"];
deleteCookie( $cid );
break;
 
}
//****************************************************************************
//****************************************************************************
//****************************************************************************
//****************************************************************************
 
?>
/web/kaklik's_web/torrentflux/readmsg.php
0,0 → 1,138
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
 
if(empty($cfg['user']))
{
// the user probably hit this page direct
header("location: index.php");
exit;
}
 
$delete = getRequestVar('delete');
if(!empty($delete))
{
DeleteMessage($delete);
header("location: ".$_SERVER['PHP_SELF']);
}
 
$mid = getRequestVar('mid');
if (!empty($mid))
{
list($from_user, $message, $ip, $time, $isnew, $force_read) = GetMessage($mid);
if(!empty($from_user) && $isnew == 1)
{
// We have a Message that is being seen
// Mark it as NOT new.
MarkMessageRead($mid);
}
 
DisplayHead(_MESSAGES);
$message = check_html($message, "nohtml");
$message = str_replace("\n", "<br>", $message);
echo "<a href=\"".$_SERVER['PHP_SELF']."\"><img src=\"images/up_dir.gif\" width=16 height=16 title=\""._RETURNTOMESSAGES."\" border=0>"._RETURNTOMESSAGES."</a><br>";
echo "<table width=\"740\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\"><tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" colspan=2>";
echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr><td>";
echo _FROM.": <strong>".$from_user."</strong></td><td align=\"right\">";
if (IsUser($from_user))
{
echo "<a href=\"message.php?to_user=".$from_user."&rmid=".$mid."\"><img src=\"images/reply.gif\" width=16 height=16 title=\""._REPLY."\" border=0></a>";
}
echo "<a href=\"".$_SERVER['PHP_SELF']."?delete=".$mid."\"><img src=\"images/delete_on.gif\" width=16 height=16 title=\""._DELETE."\" border=0></a></td></tr></table>";
echo "</td></tr>";
echo "<tr><td colspan=2>"._DATE.": <strong>".date(_DATETIMEFORMAT, $time)."</strong></td></tr>";
echo "</tr><td colspan=2 bgcolor=\"".$cfg["table_data_bg"]."\">"._MESSAGE.":<blockquote><strong>".$message."</strong></blockquote></td></tr>";
echo "</table>";
}
else
{
DisplayHead(_MESSAGES);
// read and display all messages in a list.
$inx = 0;
DisplayMessageList();
echo "<table width=\"760\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\"><tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"20%\"><div align=center class=\"title\">"._FROM."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._MESSAGE."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"20%\"><div align=center class=\"title\">"._DATE."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"10%\"><div align=center class=\"title\">"._ADMIN."</div></td>";
echo "</tr>";
 
$sql = "SELECT mid, from_user, message, IsNew, ip, time, force_read FROM tf_messages WHERE to_user=".$db->qstr($cfg['user'])." ORDER BY time";
$result = $db->Execute($sql);
showError($db,$sql);
 
while(list($mid, $from_user, $message, $new, $ip, $time, $force_read) = $result->FetchRow())
{
if($new == 1)
{
$mail_image = "images/new_message.gif";
}
else
{
$mail_image = "images/old_message.gif";
}
$display_message = check_html($message, "nohtml");
if(strlen($display_message) >= 40) { // needs to be trimmed
$display_message = substr($display_message, 0, 39);
$display_message .= "...";
}
$link = $_SERVER['PHP_SELF']."?mid=".$mid;
 
echo "<tr><td>&nbsp;&nbsp;<a href=\"".$link."\"><img src=\"".$mail_image."\" width=14 height=11 title=\"\" border=0 align=\"absmiddle\"></a>&nbsp;&nbsp; <a href=\"".$link."\">".$from_user."</a></td>";
echo "<td><a href=\"".$link."\">".$display_message."</a></td>";
echo "<td align=\"center\"><a href=\"".$link."\">".date(_DATETIMEFORMAT, $time)."</a></td>";
echo "<td align=\"right\">";
 
// Is this a force_read from an admin?
if ($force_read == 1)
{
// Yes, then don't let them delete the message yet
echo "<img src=\"images/delete_off.gif\" width=16 height=16 title=\"\" border=0>";
}
else
{
// No, let them reply or delete it
if (IsUser($from_user))
{
echo "<a href=\"message.php?to_user=".$from_user."&rmid=".$mid."\"><img src=\"images/reply.gif\" width=16 height=16 title=\""._REPLY."\" border=0></a>";
}
echo "<a href=\"".$_SERVER['PHP_SELF']."?delete=".$mid."\"><img src=\"images/delete_on.gif\" width=16 height=16 title=\""._DELETE."\" border=0></a></td></tr>";
}
$inx++;
} // End While
echo "</table>";
 
if($inx == 0)
{
echo "<div align=\"center\"><strong>-- "._NORECORDSFOUND." --</strong></div>";
}
 
} // end the else
 
DisplayFoot();
?>
/web/kaklik's_web/torrentflux/readrss.php
0,0 → 1,207
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
include_once("lastRSS.php");
 
// check http://varchars.com/rss/ for feeds
 
// The following is for PHP < 4.3
if (!function_exists('html_entity_decode'))
{
function html_entity_decode($string, $opt = ENT_COMPAT)
{
$trans_tbl = get_html_translation_table (HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
 
if ($opt & 1)
{
// Translating single quotes
// Add single quote to translation table;
// doesn't appear to be there by default
$trans_tbl["&apos;"] = "'";
}
 
if (!($opt & 2))
{
// Not translating double quotes
// Remove double quote from translation table
unset($trans_tbl["&quot;"]);
}
 
return strtr ($string, $trans_tbl);
}
}
 
// Just to be safe ;o)
if (!defined("ENT_COMPAT")) define("ENT_COMPAT", 2);
if (!defined("ENT_NOQUOTES")) define("ENT_NOQUOTES", 0);
if (!defined("ENT_QUOTES")) define("ENT_QUOTES", 3);
 
DisplayHead("RSS Torrents");
 
// Get RSS feeds from Database
$arURL = GetRSSLinks();
 
// create lastRSS object
$rss = new lastRSS();
 
// setup transparent cache
$rss->cache_dir = $cfg["torrent_file_path"];
$rss->cache_time = $cfg["rss_cache_min"] * 60; // 1200 = 20 min. 3600 = 1 hour
$rss->strip_html = false; // don't remove HTML from the description
 
echo "<a name=\"top\"></a><div align=\"center\">";
echo "<table border=1 cellspacing=0 width=\"760\" cellpadding=5><tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\">RSS Feeds (jump list):";
echo "<ul>";
 
// Loop through each RSS feed
foreach( $arURL as $rid => $url )
{
if( $rs = $rss->get( $url ) )
{
if( !empty( $rs["items"] ) )
{
// Cache rss feed so we don't have to call it again
$rssfeed[] = $rs;
echo "<li><a href=\"#".$rid."\">".$rs["title"]."</a></li>\n";
}
else
{
$rssfeed[] = "";
echo "<li>* RSS timed out * (<a href=\"#".$rid."\">".$url."</a>)</li>\n";
}
}
else
{
// Unable to grab RSS feed, must of timed out
$rssfeed[] = "";
echo "<li>* RSS timed out * (<a href=\"#".$rid."\">".$url."</a>)</li>\n";
}
}
echo "</ul>* Click on Torrent Links below to add them to the Torrent Download List</td>";
echo "</tr></table>";
echo "</div>";
 
// Parse through cache RSS feed
foreach( $rssfeed as $rid => $rs )
{
$title = "";
$content = "";
$pageUrl = "";
 
if( !empty( $rs["items"] ) )
{
// get Site title and Page Link
$title = $rs["title"];
$pageUrl = $rs["link"];
 
$content = "";
 
for ($i=0; $i < count($rs["items"]); $i++)
{
$link = $rs["items"][$i]["link"];
$title2 = $rs["items"][$i]["title"];
$pubDate = (!empty($rs["items"][$i]["pubDate"])) ? $rs["items"][$i]["pubDate"] : "Unknown";
 
// RSS entry needs to have a link, otherwise pointless
if( empty( $link ) )
continue;
 
if($link != "" && $title2 !="")
{
$content .= "<tr><td><img src=\"images/download_owner.gif\" width=\"16\" height=\"16\" title=\"".$link."\"><a href=\"index.php?url_upload=".$link."\">".$title2."</a></td><td> ".$pubDate."</td></tr>\n";
}
else
{
$content .= "<tr><td class=\"tiny\"><img src=\"images/download_owner.gif\" width=\"16\" height=\"16\">".ScrubDescription(str_replace("Torrent: <a href=\"", "Torrent: <a href=\"index.php?url_upload=", html_entity_decode($rs["items"][$i]["description"])), $title2)."</td><td valign=\"top\">".$pubDate."</td></tr>";
}
}
}
else
{
// Request timed out, display timeout message
echo "<br>**** RSS timed out: <a href=\"".$url."\" target=\"_blank\">".$url."</a>";
}
 
if ($content != "") { // Close the content and add a line break
$content .= "<br>";
}
displayNews($title, $pageUrl, $content, $rid);
}
 
DisplayFoot();
 
 
 
function displayNews($title, $pageUrl, $content, $rid) {
global $cfg;
// Draw the Table
echo "<a name=\"".$rid."\"></a><table width=\"760\" border=1 bordercolor=\"".$cfg["table_admin_border"]."\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"".$cfg["table_data_bg"]."\">";
echo "<tr><td colspan=2 bgcolor=\"".$cfg["table_header_bg"]."\" background=\"themes/".$cfg["theme"]."/images/bar.gif\">";
echo "<img src=\"images/properties.png\" width=18 height=13 border=0>&nbsp;&nbsp;<strong><a href=\"".$pageUrl."\" target=\"_blank\"><font class=\"adminlink\">".$title."</font></a>&nbsp;&nbsp;<font class=\"tinywhite\">[<a href=\"#\"><font class=\"tinywhite\">top</font></a>]</font></strong>";
echo "</td></tr>";
echo "<tr><td bgcolor=\"".$cfg["table_header_bg"]."\"><div align=center class=\"title\">"._TORRENTFILE."</div></td>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\" width=\"33%\"><div align=center class=\"title\">"._TIMESTAMP."</div></td>";
 
echo $content;
 
echo "</table>";
}
 
// Scrub the description to take out the ugly long URLs
function ScrubDescription($desc, $title)
{
$rtnValue = "";
 
$parts = explode("</a>", $desc);
 
$replace = ereg_replace('">.*$', '">'.$title."</a>", $parts[0]);
 
if (strpos($parts[1], "Search:") !== false)
{
$parts[1] = $parts[1]."</a>\n";
}
 
for($inx = 2; $inx < count($parts); $inx++)
{
if (strpos($parts[$inx], "Info: <a ") !== false)
{
// We have an Info: and URL to clean
$parts[$inx] = ereg_replace('">.*$', '" target="_blank">Read More...</a>', $parts[$inx]);
}
}
 
$rtnValue = $replace;
for ($inx = 1; $inx < count($parts); $inx++)
{
$rtnValue .= $parts[$inx];
}
 
return $rtnValue;
}
 
?>
/web/kaklik's_web/torrentflux/searchEngines/NewNovaEngine.php
0,0 → 1,595
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
/*
v 1.00 - Mar 31, 06 - Created
*/
 
 
class SearchEngine extends SearchEngineBase
{
var $dateAdded = "";
 
function SearchEngine($cfg)
{
$this->mainURL = "newnova.org";
$this->altURL = "newnova.org";
$this->mainTitle = "NewNova";
$this->engineName = "NewNova";
 
$this->author = "kboy";
$this->version = "1.00";
$this->updateURL = "http://www.torrentflux.com/forum/index.php?topic=1002.0.html";
 
$this->Initialize($cfg);
}
 
//----------------------------------------------------------------
// Function to Get Main Categories
function populateMainCategories()
{
$this->mainCatalog["1"] = "Games";
$this->mainCatalog["2"] = "Movies";
$this->mainCatalog["3"] = "TV Shows";
$this->mainCatalog["4"] = "Music";
$this->mainCatalog["5"] = "Apps";
$this->mainCatalog["6"] = "Miscellaneous";
$this->mainCatalog["7"] = "Anime";
}
 
//----------------------------------------------------------------
// Function to Get Sub Categories
function getSubCategories($mainGenre)
{
$output = array();
 
$mainGenreName = $this->GetMainCatName($mainGenre);
 
if($mainGenre == "6")
{
$mainGenreName = "Misc";
}
 
$request = '/list_torrents/' . str_replace(" ","",strtolower($mainGenreName)) . '.html';
 
if ($this->makeRequest($request))
{
$thing = $this->htmlPage;
 
if (is_integer(strpos($thing,"seperator")))
{
$thing = substr($thing,strpos($thing,"seperator")+strlen("seperator"));
$thing = substr($thing,strpos($thing,"<table"));
$thing = substr($thing,0,strpos($thing,"</table>"));
 
while (is_integer(strpos($thing,"href=\"JavaScript:showTbl2(")))
{
 
$thing = substr($thing,strpos($thing,"href=\"JavaScript:showTbl2(")+strlen("href=\"JavaScript:showTbl2("));
$tmpStr = substr($thing,0,strpos($thing,')'));
$tmpArr = split(",",$tmpStr);
 
$subid = substr($tmpArr[0],strpos($tmpArr[0],'/')+1);
while(is_integer(strpos($subid,"/")))
{
$subid = substr($subid,strpos($subid,'/')+1);
}
$subid = str_replace(array("'"),"",$subid);
$subname = str_replace(array("'"),"",$tmpArr[1]);
 
if($subname != $mainGenreName)
{
$output[$subid] = $subname;
}
}
}
}
 
return $output;
}
 
//----------------------------------------------------------------
// Function to get Latest..
function getLatest()
{
//http://www.newnova.org/list_news.html
$request = "/list_news.html";
 
if (array_key_exists("mode",$_REQUEST))
{
if($_REQUEST["mode"] == "yesterday" )
{
$request = "/list_news_1.html";
}
}
 
if (array_key_exists("subGenre",$_REQUEST))
{
$request = "/list_torrents/".$_REQUEST["subGenre"].".html";
}
 
if (array_key_exists("dteAdded",$_REQUEST))
{
$this->dateAdded = $_REQUEST["dteAdded"];
}
 
if ($this->makeRequest($request))
{
return $this->parseResponse();
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Function to perform Search.
function performSearch($searchTerm)
{
 
$request = "/search.foo?data[searchTerm]=".$searchTerm."&";
 
if ($this->makeRequest($request))
{
return $this->parseResponse();
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Override the base to show custom table header.
// Function to setup the table header
function tableHeader()
{
 
$output = "<table width=\"100%\" cellpadding=3 cellspacing=0 border=0>";
 
$output .= "<br>\n";
 
$output .= "<tr bgcolor=\"".$this->cfg["table_header_bg"]."\">";
$output .= "<td colspan=7 align=center><strong>".$this->dateAdded."</strong></td>";
$output .= "</tr>\n";
 
$output .= "<tr bgcolor=\"".$this->cfg["table_header_bg"]."\">";
$output .= " <td>&nbsp;</td>";
$output .= " <td><strong>Torrent Name</strong> &nbsp;(";
 
$tmpURI = str_replace(array("?hideSeedless=yes","&hideSeedless=yes","?hideSeedless=no","&hideSeedless=no"),"",$_SERVER["REQUEST_URI"]);
 
// Check to see if Question mark is there.
if (strpos($tmpURI,'?'))
{
$tmpURI .= "&";
}
else
{
$tmpURI .= "?";
}
 
if($this->hideSeedless == "yes")
{
$output .= "<a href=\"". $tmpURI . "hideSeedless=no\">Show Seedless</a>";
}
else
{
$output .= "<a href=\"". $tmpURI . "hideSeedless=yes\">Hide Seedless</a>";
}
 
$output .= ")</td>";
$output .= " <td><strong>Category</strong></td>";
$output .= " <td align=center><strong>&nbsp;&nbsp;Size</strong></td>";
$output .= " <td><strong>Seeds</strong></td>";
$output .= " <td><strong>Peers</strong></td>";
$output .= " <td align=center><strong>Kind</strong></td>";
$output .= "</tr>\n";
 
return $output;
}
 
//----------------------------------------------------------------
// Function to parse the response.
function parseResponse()
{
 
if (is_integer(strpos($this->htmlPage,"seperator")))
{
$dteAdded = substr($this->htmlPage,strpos($this->htmlPage,"seperator",20)+strlen("seperator"));
$dteAdded = substr($dteAdded,strpos($dteAdded,">")+1);
$this->dateAdded = substr($dteAdded,0,strpos($dteAdded,"<"));
}
else
{
if (!strlen($this->dateAdded) > 0)
{
$this->dateAdded = date(' j. F Y',time());
}
}
 
$output = $this->tableHeader();
 
$thing = $this->htmlPage;
 
if (is_integer(strpos($thing,"Loading...")))
{
$thing = substr($thing,strpos($thing,"Loading..."));
$thing = substr($thing,strpos($thing,"<script>")+strlen("<script>"));
$tmpList = substr($thing,0,strpos($thing,"</script>"));
}
else
{
$tmpList = $thing;
}
 
// We got a response so display it.
// Chop the front end off.
if (is_integer(strpos($tmpList,"at2_nws_hdr")))
{
$output .= $this->nwsTableRows($tmpList);
}
elseif (is_integer(strpos($tmpList,"at2_header")))
{
$output .= $this->at2TableRows($tmpList);
}
else
{
if(is_integer(strpos($thing,"search returned no results")))
{
$output .= "<center>Your search returned no results. Please refine your search</center><br>";
}
}
 
if (is_integer(strpos($thing,"seperator")))
{
$dteAdd = substr($thing,strpos($thing,"seperator",20)+strlen("seperator"));
$dteAdd = substr($dteAdd,strpos($dteAdd,">")+1);
$dteAdd = substr($dteAdd,0,strpos($dteAdd,"<"));
}
 
$output .= "</table>";
 
$pages = '';
 
if(array_key_exists("LATEST",$_REQUEST))
{
if (array_key_exists("mode",$_REQUEST))
{
if (! $_REQUEST["mode"] == "yesterday")
{
$pages .= "<br><a href=\"".$this->searchURL()."&LATEST=1&mode=yesterday&dteAdded=".$dteAdd."\" title=\"Yesterday's Latest\">Yesterday's Latest</a>";
}
}
else
{
$pages .= "<br><a href=\"".$this->searchURL()."&LATEST=1&mode=yesterday&dteAdded=".$dteAdd."\" title=\"Yesterday's Latest\">Yesterday's Latest</a>";
}
 
$output .= "<br><div align=center>".$pages."</div><br>";
}
 
return $output;
}
 
function at2TableRows($tmpList)
{
$output = '';
$bg = $this->cfg["bgLight"];
 
while (is_integer(strpos($tmpList,"at2_header")))
{
$tmpList = substr($tmpList,strpos($tmpList,"at2_header(")+strlen("at2_header('"));
$curCat = substr($tmpList,0,strpos($tmpList,"'"));
$tmpList = substr($tmpList,strpos($tmpList,"at2("));
if (is_int(array_search($curCat,$this->catFilter)))
{
// Skip this category.
}
else
{
// We have something to-do.
if (is_integer(strpos($tmpList,"at2_header(")))
{
$tmpList2 = substr($tmpList,0,strpos($tmpList,"at2_header("));
}
elseif (is_integer(strpos($tmpList,"str.push")))
{
$tmpList2 = substr($tmpList,0,strpos($tmpList,"str.push"));
}
 
//prepare line
$tmpList2 = str_replace("at2(","",$tmpList2);
 
// ok so now we have the listing.
$tmpListArr = split(");",$tmpList2);
 
$output .= $this->buildTableRows($tmpListArr, $bg);
}
 
// set tmpList to end of this category.
if (is_integer(strpos($tmpList,"at2_header(")))
{
$tmpList = substr($tmpList,strpos($tmpList,"at2_header("));
}
elseif (is_integer(strpos($tmpList,"str.push")))
{
$tmpList = substr($tmpList,strpos($tmpList,"str.push"));
}
 
// ok switch colors.
if ($bg == $this->cfg["bgLight"])
{
$bg = $this->cfg["bgDark"];
}
else
{
$bg = $this->cfg["bgLight"];
}
 
}
return $output;
}
 
function nwsTableRows($tmpList)
{
$output = '';
$bg = $this->cfg["bgLight"];
 
while (is_integer(strpos($tmpList,"at2_nws_hdr")))
{
$tmpList = substr($tmpList,strpos($tmpList,"at2_nws_hdr(")+strlen("at2_nws_hdr('"));
$curCat = substr($tmpList,0,strpos($tmpList,"'"));
$tmpList = substr($tmpList,strpos($tmpList,"at2("));
 
if (is_int(array_search($curCat,$this->catFilter)))
{
// Skip this category.
}
else
{
// We have something to-do.
if (is_integer(strpos($tmpList,"at2_nws_hdr(")))
{
$tmpList2 = substr($tmpList,0,strpos($tmpList,"at2_nws_hdr("));
}
elseif (is_integer(strpos($tmpList,"str.push")))
{
$tmpList2 = substr($tmpList,0,strpos($tmpList,"str.push"));
}
 
//prepare line
$tmpList2 = str_replace("at2(","",$tmpList2);
 
// ok so now we have the listing.
$tmpListArr = split(");",$tmpList2);
 
$output .= $this->buildTableRows($tmpListArr, $bg);
}
 
// set tmpList to end of this category.
if (is_integer(strpos($tmpList,"at2_nws_hdr(")))
{
$tmpList = substr($tmpList,strpos($tmpList,"at2_nws_hdr("));
}
elseif (is_integer(strpos($tmpList,"str.push")))
{
$tmpList = substr($tmpList,strpos($tmpList,"str.push"));
}
 
// ok switch colors.
if ($bg == $this->cfg["bgLight"])
{
$bg = $this->cfg["bgDark"];
}
else
{
$bg = $this->cfg["bgLight"];
}
 
}
return $output;
}
 
function buildTableRows($tmpListArr, $bg)
{
 
$output = "";
 
foreach($tmpListArr as $key =>$value)
{
 
$buildLine = true;
$ts = new tNova($value);
 
// Determine if we should build this output
if (is_int(array_search($ts->MainCategory,$this->catFilter)))
{
$buildLine = false;
}
 
if ($this->hideSeedless == "yes")
{
if($ts->Seeds == "N/A" || $ts->Seeds == "0")
{
$buildLine = false;
}
}
 
if (!empty($ts->torrentFile) && $buildLine) {
 
$output .= trim($ts->BuildOutput($bg, $this->searchURL()));
 
// ok switch colors.
if ($bg == $this->cfg["bgLight"])
{
$bg = $this->cfg["bgDark"];
}
else
{
$bg = $this->cfg["bgLight"];
}
}
}
 
return $output;
}
}
 
 
// This is a worker class that takes in a row in a table and parses it.
class tNova
{
var $torrentName = "";
var $torrentDisplayName = "";
var $torrentFile = "";
var $torrentSize = "";
var $torrentStatus = "";
var $MainId = "";
var $MainCategory = "";
var $SubCategory = "";
 
var $fileCount = "";
var $torrentAdded = "";
var $Seeds = "";
var $Peers = "";
var $Data = "";
 
/*
function at2 (
0 torrent_id,
1 torrent_additiondate_day,
2 torrent_server_id,
3 torrent_viewserver_id,
4 torrent_view_link,
5 torrent_link_desc,
6 torrent_name,
7 torrent_link,
8 torrent_filesize_mb,
9 torrent_lastnrseeds,
10 torrent_lastnrleeches,
11 torrent_quality,
12 torrent_submitter_id,
13 torrent_submitter_nickname,
14 torrent_submitter_status,
15 torrent_infolink,
16 torrent_type_id,
17 torrent_tracker_has_nostats,
18 torrent_tracker_has_unknownstats,
19 torrent_lastcheck_nr_invalid,
20 torrent_is_moderated,
21 torrent_is_deleted,
22 torrent_is_softdeleted,
23 torrent_has_rights,
24 torrent_tracker_registered
)
*/
 
function tNova( $htmlLine , $dteAdded = "")
{
if (strlen($htmlLine) > 0)
{
 
$this->Data = $htmlLine;
 
// Chunck up the row into columns.
$tmpListArr = split(",",str_replace(array("'"),"",$htmlLine));
 
if(count($tmpListArr) >= 24)
{
$this->torrentAdded = " | Added" . $dteAdded . " " . $tmpListArr[1];
if(strlen($tmpListArr[13])>0)
{
$this->torrentAdded .= " By ". $tmpListArr[13];
}
 
if( $tmpListArr[2])
{
$this->torrentFile = "http://www.newnova.org/site/torrents/" . trim($tmpListArr[7]);
}else{
$this->torrentFile = "http://www.newnova.org/get/" . trim($tmpListArr[7]);
}
 
$tmpArr = split(" - ",$tmpListArr[5]);
if(count($tmpArr) == 2)
{
$this->MainCategory = trim($tmpArr[0]);
$this->SubCategory = trim($tmpArr[1]);
}
else
{
$this->MainCategory = trim($tmpListArr[5]);
}
 
$this->torrentName = $tmpListArr[6];
$this->torrentSize = $tmpListArr[8];
$this->Seeds = $tmpListArr[9];
$this->Peers = $tmpListArr[10];
$this->torrentStatus = $tmpListArr[11];
 
if ($this->Peers == '')
{
$this->Peers = "N/A";
if (empty($this->Seeds)) $this->Seeds = "N/A";
}
if ($this->Seeds == '') $this->Seeds = "N/A";
 
$this->torrentDisplayName = $this->torrentName;
if(strlen($this->torrentDisplayName) > 50)
{
$this->torrentDisplayName = substr($this->torrentDisplayName,0,50)."...";
}
}
}
}
 
//----------------------------------------------------------------
// Function to build output for the table.
function BuildOutput($bg, $searchURL = '')
{
$output = "<tr>\n";
$output .= " <td width=16 bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\"><img src=\"images/download_owner.gif\" width=\"16\" height=\"16\" title=\"".$this->torrentName." ".$this->torrentAdded."\" border=0></a></td>\n";
$output .= " <td bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\" title=\"".$this->torrentName."\">".$this->torrentDisplayName."</a></td>\n";
 
if (strlen($this->SubCategory) > 1){
$genre = $this->MainCategory . " - " . $this->SubCategory;
}else{
$genre = $this->MainCategory;
}
 
$output .= " <td bgcolor=\"".$bg."\">". $genre ."</td>\n";
 
$output .= " <td bgcolor=\"".$bg."\" align=right>".$this->torrentSize."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Seeds."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Peers."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->torrentStatus."</td>\n";
$output .= "</tr>\n";
 
return $output;
 
}
}
 
?>
/web/kaklik's_web/torrentflux/searchEngines/SearchEngineBase.php
0,0 → 1,315
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
 
/*
This is the base search engine class that is inherited from to
create specialized search engines.
 
Each new Search must use the following nameing standards.
???Engine.php where ??? is the search engine name.
 
!! All changes and customizations should be done in those files and not in this file. !!
 
*/
// Created By Kboy
class SearchEngineBase
{
var $engineName = ''; // The Engine Name Must be the same as the File name
// minus Engine.
 
var $mainTitle = ''; // The displayed Main Title for the engine.
var $mainURL = ''; // The Primary URL used in searching or paging.
var $altURL = ''; // The alternate URL used in searching or paging.
 
var $author = ''; // the author of this engine
var $version = '';
var $updateURL = 'http://www.torrentflux.com/forum/index.php/board,14.0.html';
 
// ------------------------------------------------------------------------------
// You should only need to set the above variables in each of the custom classes.
// ------------------------------------------------------------------------------
 
var $cfg = array(); // The config array that holds the config settings of
// TorrentFlux at time of initialization
// This may contain the mainCatalog and catFilter
// as assigned by the admin tool.
// If it doesn't then we ask the individual engines for there
// mainCatalog and catFilter.
 
 
var $mainCatalogName = ''; // The name of the Main Catalog
var $mainCatalog = array(); // An array of Main Catalog entries.
var $subCatalog = array(); // An array of Sub Catalog entries.
 
var $catFilterName = ''; // Name of Filter used to retrieve from DB.
var $catFilter = array(); // An array of categories to Filter out from DB.
 
var $curRequest =''; // The actual Request sent to the Search Engine
var $hideSeedless = false; // Boolean to determine if we should hide or show seedless torrents
var $searchTerm = ''; // Search term passed into the engine
 
var $htmlPage = ''; // HTML created by the engine for displaying
var $msg = ''; // Message to be displayed
var $pg = ''; // Page Variable used in Paging
 
var $fp = ''; // Pointer to a socket connection
 
var $initialized = false; // Boolean to determine if the search engine initialized ok.
 
/**
* Constructor
*/
function SearchEngineBase()
{
die('Virtual Class -- cannot instantiate');
}
 
//----------------------------------------------------------------
// Initialize the Search Engine setting up the Catalog and Filters.
// and Testing the connection.
function Initialize($cfg)
{
$rtnValue = false;
 
$this->cfg = unserialize($cfg);
$this->pg = getRequestVar('pg');
 
if (empty($this->altURL))
$this->altURL = $this->mainURL;
 
if (empty($this->cfg))
{
$this->msg = "Config not passed";
$this->initialized = false;
return;
}
 
$this->catFilterName = $this->engineName."GenreFilter";
$this->mainCatalogName = $this->engineName."_catalog";
 
if (array_key_exists('hideSeedless',$_SESSION))
$this->hideSeedless = $_SESSION['hideSeedless'];
 
if (array_key_exists($this->catFilterName,$this->cfg))
$this->catFilter = $this->cfg[$this->catFilterName];
else
$this->catFilter = array();
 
if (array_key_exists($this->mainCatalogName,$this->cfg))
$this->mainCatalog = $this->cfg[$this->mainCatalogName];
else
$this->populateMainCategories();
 
if ( $this->getConnection() )
$rtnValue = true;
 
$this->closeConnection();
 
// in PHP 5 use
//$this->curRequest = http_build_query($_REQUEST);
$this->curRequest = $this->http_query_builder($_REQUEST);
 
$this->initialized = $rtnValue;
}
 
//------------------------------------------------------------------
// This is for backward compatibility.
function http_query_builder( $formdata, $numeric_prefix = null, $key = null )
{
$res = array();
foreach ((array)$formdata as $k=>$v) {
$tmp_key = urlencode(is_int($k) ? $numeric_prefix.$k : $k);
if ($key) $tmp_key = $key.'['.$tmp_key.']';
if ( is_array($v) || is_object($v) ) {
$res[] = http_query_builder($v, null, $tmp_key);
} else {
$res[] = $tmp_key."=".urlencode($v);
}
}
$separator = ini_get('arg_separator.output');
return implode($separator, $res);
}
 
//----------------------------------------------------------------
// Function to populate the mainCatalog
function populateMainCategories()
{
return;
}
 
//----------------------------------------------------------------
// Function to Get Sub Categories
function getSubCategories($mainGenre)
{
return array();
}
 
//----------------------------------------------------------------
// Function to test Connection.
function getConnection()
{
// Try to connect
if (!$this->fp = @fsockopen ($this->mainURL, 80, $errno, $errstr, 30))
{
// Error Connecting
$this->msg = "Error connecting to ".$this->mainURL."!";
return false;
}
return true;
}
 
//----------------------------------------------------------------
// Function to Close Connection.
function closeConnection()
{
if($this->fp)
{
fclose($this->fp);
}
}
 
//----------------------------------------------------------------
// Function to return the URL needed by tf
function searchURL()
{
return "torrentSearch.php?searchEngine=".$this->engineName;
}
 
//----------------------------------------------------------------
// Function to Make the GetRequest
function makeRequest($request, $useAlt = false)
{
$rtnVal = false;
 
if (isset($_SESSION['lastOutBoundURI']))
{
$refererURI = $_SESSION['lastOutBoundURI'];
}
else
{
$refererURI = "http://".$this->mainURL;
}
 
if ($useAlt)
{
$request = "http://".$this->altURL. $request;
}
else
{
$request = "http://".$this->mainURL. $request;
}
 
$this->htmlPage = FetchHTML( $request, $refererURI );
$rtnVal = true;
 
return $rtnVal;
}
 
//----------------------------------------------------------------
// Function to Get Main Categories
function getMainCategories($filtered = true)
{
$output = array();
 
foreach ($this->mainCatalog as $mainId => $mainName)
{
if ($filtered)
{
// see if this is filtered out.
if (!(@in_array($mainId, $this->catFilter)))
{
$output[$mainId] = $mainName;
}
}
else
{
$output[$mainId] = $mainName;
}
}
 
return $output;
}
 
//----------------------------------------------------------------
// Function to Get Main Category Name
function GetMainCatName($mainGenre)
{
$mainGenreName = '';
foreach ($this->getMainCategories() as $mainId => $mainName)
{
if ($mainId == $mainGenre)
{
$mainGenreName = $mainName;
}
}
return $mainGenreName;
}
 
//----------------------------------------------------------------
// Function to setup the table header
function tableHeader()
{
$output = "<table width=\"100%\" cellpadding=3 cellspacing=0 border=0>";
 
$output .= "<br>\n";
$output .= "<tr bgcolor=\"".$this->cfg["table_header_bg"]."\">";
$output .= " <td>&nbsp;</td>";
$output .= " <td><strong>Torrent Name</strong> &nbsp;(";
 
$tmpURI = str_replace(array("?hideSeedless=yes","&hideSeedless=yes","?hideSeedless=no","&hideSeedless=no"),"",$_SERVER["REQUEST_URI"]);
 
// Check to see if Question mark is there.
if (strpos($tmpURI,'?'))
{
$tmpURI .= "&";
}
else
{
$tmpURI .= "?";
}
 
if($this->hideSeedless == "yes")
{
$output .= "<a href=\"". $tmpURI . "hideSeedless=no\">Show Seedless</a>";
}
else
{
$output .= "<a href=\"". $tmpURI . "hideSeedless=yes\">Hide Seedless</a>";
}
 
$output .= ")</td>";
$output .= " <td><strong>Category</strong></td>";
$output .= " <td align=center><strong>&nbsp;&nbsp;Size</strong></td>";
$output .= " <td><strong>Seeds</strong></td>";
$output .= " <td><strong>Peers</strong></td>";
$output .= "</tr>\n";
 
return $output;
}
 
}
 
?>
 
/web/kaklik's_web/torrentflux/searchEngines/TorrentBoxEngine.php
0,0 → 1,390
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
class SearchEngine extends SearchEngineBase
{
 
function SearchEngine($cfg)
{
$this->mainURL = "torrentbox.com";
$this->altURL = "torrentbox.com";
$this->mainTitle = "TorrentBox";
$this->engineName = "TorrentBox";
 
$this->author = "kboy";
$this->version = "1.00";
$this->updateURL = "http://www.torrentflux.com/forum/index.php/topic,876.0.html";
 
$this->Initialize($cfg);
}
 
function populateMainCategories()
{
$this->mainCatalog["0"] = "(all types)";
$this->mainCatalog["9"] = "Anime";
$this->mainCatalog["90"] = "Apps";
$this->mainCatalog["11"] = "Books";
$this->mainCatalog["10"] = "Comics";
$this->mainCatalog["91"] = "Games";
$this->mainCatalog["6"] = "Misc";
$this->mainCatalog["92"] = "Movies";
$this->mainCatalog["93"] = "Music";
$this->mainCatalog["8"] = "Pics";
$this->mainCatalog["3"] = "TV";
$this->mainCatalog["13"] = "Videos";
}
 
//----------------------------------------------------------------
// Function to Get Sub Categories
function getSubCategories($mainGenre)
{
$output = array();
 
switch ($mainGenre)
{
case "90" :
$output["51"] = "Linux";
$output["52"] = "Mac";
$output["50"] = "Windows";
$output["5"] = "Misc";
break;
case "91" :
$output["4"] = "Misc";
$output["41"] = "PC";
$output["42"] = "PS2";
$output["43"] = "PSX";
$output["44"] = "ROMS";
$output["40"] = "Xbox";
break;
case "92" :
$output["14"] = "DVD-R";
$output["100"] = "Action";
$output["101"] = "Adventure";
$output["102"] = "Animation";
$output["103"] = "Comedy";
$output["104"] = "Drama";
$output["105"] = "Documentary";
$output["106"] = "Horror";
$output["107"] = "Sci-Fi";
$output["1"] = "Misc";
break;
case "93" :
$output["15"] = "Alternative";
$output["16"] = "Blues";
$output["17"] = "Electronic";
$output["18"] = "Pop";
$output["19"] = "Rap";
$output["20"] = "Rock";
$output["21"] = "Reggae";
$output["22"] = "Jazz";
$output["23"] = "Dance";
$output["24"] = "Christian";
$output["25"] = "Spanish";
$output["2"] = "Misc";
break;
}
 
return $output;
 
}
 
//----------------------------------------------------------------
// Function to Make the Request (overriding base)
function makeRequest($request)
{
return parent::makeRequest($request, false);
}
 
//----------------------------------------------------------------
// Function to get Latest..
function getLatest()
{
$cat = getRequestVar('subGenre');
if (empty($cat)) $cat = getRequestVar('cat');
 
$request = "/torrents-browse.php";
 
if(!empty($cat))
{
if(strpos($request,"?"))
{
$request .= "&cat=".$cat;
}
else
{
$request .= "?cat=".$cat;
}
}
 
if (!empty($this->pg))
{
if(strpos($request,"?"))
{
$request .= "&page=" . $this->pg;
}
else
{
$request .= "?page=" . $this->pg;
}
}
 
if ($this->makeRequest($request))
{
return $this->parseResponse();
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Function to perform Search.
function performSearch($searchTerm)
{
 
$searchTerm = str_replace(" ", "+", $searchTerm);
$request = "/torrents-search.php?search=".$searchTerm;
 
if(!empty($cat))
{
$request .= "&cat=".$cat;
}
 
$onlyname = getRequestVar('onlyname');
if (empty($onlyname)) $onlyname = "no";
$request .= "&onlyname=".$onlyname;
 
$incldead = getRequestVar('incldead');
if (empty($incldead)) $incldead = "0";
$request .= "&incldead=".$incldead;
 
 
$request .= "&submit=";
 
if (!empty($this->pg))
{
$request .= "&page=" . $this->pg;
}
 
if ($this->makeRequest($request))
{
return $this->parseResponse();
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Function to parse the response.
function parseResponse()
{
$output = $this->tableHeader();
 
$thing = $this->htmlPage;
 
// We got a response so display it.
// Chop the front end off.
while (is_integer(strpos($thing,">Uploader<")))
{
$thing = substr($thing,strpos($thing,">Uploader<"));
$thing = substr($thing,strpos($thing,"<tr"));
$tmpList = substr($thing,0,strpos($thing,"</table>"));
// ok so now we have the listing.
$tmpListArr = split("</tr>",$tmpList);
 
$bg = $this->cfg["bgLight"];
 
foreach($tmpListArr as $key =>$value)
{
$buildLine = true;
if (strpos($value,"download.php"))
{
$ts = new tBox($value);
 
// Determine if we should build this output
if (is_int(array_search($ts->CatName,$this->catFilter)))
{
$buildLine = false;
}
 
if ($this->hideSeedless == "yes")
{
if($ts->Seeds == "N/A" || $ts->Seeds == "0")
{
$buildLine = false;
}
}
 
if (!empty($ts->torrentFile) && $buildLine) {
 
$output .= trim($ts->BuildOutput($bg));
 
// ok switch colors.
if ($bg == $this->cfg["bgLight"])
{
$bg = $this->cfg["bgDark"];
}
else
{
$bg = $this->cfg["bgLight"];
}
}
 
}
}
// set thing to end of this table.
$thing = substr($thing,strpos($thing,"</table>"));
}
 
$output .= "</table>";
 
//http://www.torrentbox.com/torrents-browse.php?cat=4&page=2
// is there paging at the bottom?
if (strpos($thing, "<span class=\"pager\">") != false)
{
// Yes, then lets grab it and display it! ;)
$thing = substr($thing,strpos($thing,"<span class=\"pager\">")+strlen("<span class=\"pager\">"));
$pages = substr($thing,0,strpos($thing,"</span>"));
if(strpos($this->curRequest,"LATEST"))
{
if(strpos($pages,"cat="))
{
$pages = str_replace("page=","pg=",str_replace("http://www.torrentbox.com/torrents-browse.php?",$this->searchURL()."&LATEST=1&",$pages));
}
else
{
$pages = str_replace("http://www.torrentbox.com/torrents-browse.php?page=",$this->searchURL()."&LATEST=1&pg=",$pages);
}
}
else
{
$pages = str_replace("page","pg",str_replace("http://www.torrentbox.com/torrents-browse.php?search=",$this->searchURL()."&searchterm=",$pages));
}
$output .= "<div align=center>".$pages."</div>";
}
 
return $output;
}
}
 
// This is a worker class that takes in a row in a table and parses it.
class tBox
{
var $torrentName = "";
var $torrentDisplayName = "";
var $torrentFile = "";
var $torrentSize = "";
var $torrentStatus = "";
var $CatId = "";
var $CatName = "";
var $fileCount = "";
var $Seeds = "";
var $Peers = "";
var $Data = "";
 
var $dateAdded = "";
var $dwnldCount = "";
 
function tBox( $htmlLine )
{
if (strlen($htmlLine) > 0)
{
 
$this->Data = $htmlLine;
 
// Fix messed up end td's once in a while.
$htmlLine = eregi_replace("<(.)*1ff8(.)*/td>",'</td>',$htmlLine);
$htmlLine = eregi_replace("1ff8",'',$htmlLine);
 
// Chunck up the row into columns.
$tmpListArr = split("</td>",$htmlLine);
 
if(count($tmpListArr) > 8)
{
$this->CatName = $this->cleanLine($tmpListArr["0"]); // Cat Name
if (strpos($this->CatName,">"))
{
$this->CatName = trim(substr($this->CatName,strpos($this->CatName,">")+1));
}
$this->torrentName = $this->cleanLine($tmpListArr["1"]); // TorrentName
 
$tmpStr = substr($tmpListArr["2"],strpos($tmpListArr["2"],"href=\"")+strlen("href=\"")); // Download Link
 
$this->torrentFile = substr($tmpStr,0,strpos($tmpStr,"\""));
 
$this->dateAdded = $this->cleanLine($tmpListArr["4"]); // Date Added
$this->torrentSize = $this->cleanLine($tmpListArr["5"]); // Size of File
$this->dwnldCount = $this->cleanLine($tmpListArr["6"]); // Download Count
$this->Seeds = $this->cleanLine($tmpListArr["7"]); // Seeds
$this->Peers = $this->cleanLine($tmpListArr["8"]); // Peers
//$tmpListArr["9"] = $this->cleanLine($tmpListArr["9"]); // Person who Uploaded it.
 
if ($this->Peers == '')
{
$this->Peers = "N/A";
if (empty($this->Seeds)) $this->Seeds = "N/A";
}
if ($this->Seeds == '') $this->Seeds = "N/A";
 
$this->torrentDisplayName = $this->torrentName;
if(strlen($this->torrentDisplayName) > 50)
{
$this->torrentDisplayName = substr($this->torrentDisplayName,0,50)."...";
}
 
}
}
 
}
 
function cleanLine($stringIn,$tags='')
{
if(empty($tags))
return trim(str_replace(array("&nbsp;","&nbsp")," ",strip_tags($stringIn)));
else
return trim(str_replace(array("&nbsp;","&nbsp")," ",strip_tags($stringIn,$tags)));
}
 
//----------------------------------------------------------------
// Function to build output for the table.
function BuildOutput($bg)
{
$output = "<tr>\n";
$output .= " <td width=16 bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\"><img src=\"images/download_owner.gif\" width=\"16\" height=\"16\" title=\"".$this->torrentName."\" border=0></a></td>\n";
$output .= " <td bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\" title=\"".$this->torrentName."\">".$this->torrentDisplayName."</a></td>\n";
$output .= " <td bgcolor=\"".$bg."\">". $this->CatName ."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=right>".$this->torrentSize."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Seeds."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Peers."</td>\n";
$output .= "</tr>\n";
 
return $output;
 
}
}
 
?>
/web/kaklik's_web/torrentflux/searchEngines/TorrentPortalEngine.php
0,0 → 1,458
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
/*
v 1.01 - change in parsing routine
v 1.02 - Mar 19, 06 - another change in the parsing. and updated paging
*/
 
class SearchEngine extends SearchEngineBase
{
function SearchEngine($cfg)
{
$this->mainURL = "torrentportal.com";
$this->altURL = "tp.searching.com";
$this->mainTitle = "TorrentPortal";
$this->engineName = "TorrentPortal";
 
$this->author = "kboy";
$this->version = "1.02";
$this->updateURL = "http://www.torrentflux.com/forum/index.php?topic=875.0.html";
 
$this->Initialize($cfg);
}
 
//----------------------------------------------------------------
// Function to Get Main Categories
function populateMainCategories()
{
$this->mainCatalog["0"] = "(all types)";
$this->mainCatalog["1"] = "Games";
$this->mainCatalog["2"] = "Movies";
$this->mainCatalog["3"] = "TV";
$this->mainCatalog["4"] = "Videos";
$this->mainCatalog["5"] = "Apps";
$this->mainCatalog["6"] = "Anime";
$this->mainCatalog["7"] = "Audio";
$this->mainCatalog["8"] = "Comics";
$this->mainCatalog["9"] = "Unsorted";
$this->mainCatalog["10"] = "Porn";
}
 
//----------------------------------------------------------------
// Function to Make the Request (overriding base)
function makeRequest($request)
{
return parent::makeRequest($request, false);
}
 
//----------------------------------------------------------------
// Function to get Latest..
function getLatest()
{
$cat = getRequestVar('subGenre');
$count = getRequestVar('count');
 
if (empty($cat)) $cat = getRequestVar('cat');
 
if(empty($cat) && empty($this->pg))
{
$request = "/new-torrents.php";
}
else
{
$request = "/torrents.php";
}
 
if(!empty($cat))
{
if(strpos($request,"?"))
{
$request .= "&cat=".$cat;
}
else
{
$request .= "?cat=".$cat;
}
}
 
if(!empty($count))
{
if(strpos($request,"?"))
{
$request .= "&count=".$count;
}
else
{
$request .= "?count=".$count;
}
}
 
if (!empty($this->pg))
{
if(strpos($request,"?"))
{
$request .= "&page=" . $this->pg;
}
else
{
$request .= "?page=" . $this->pg;
}
}
 
if ($this->makeRequest($request))
{
return $this->parseResponse();
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Function to perform Search.
function performSearch($searchTerm)
{
 
$searchTerm = str_replace(" ", "+", $searchTerm);
$request = "/torrents-search.php?search=".$searchTerm;
 
if(!empty($cat))
{
$request .= "&cat=".$cat;
}
 
$count = getRequestVar('count');
if(!empty($count))
{
$request .= "&count=".$count;
}
 
$onlyname = getRequestVar('onlyname');
if (empty($onlyname)) $onlyname = "no";
$request .= "&onlyname=".$onlyname;
 
$incldead = getRequestVar('incldead');
if (empty($incldead)) $incldead = "0";
$request .= "&incldead=".$incldead;
 
 
$request .= "&submit=";
 
if (!empty($this->pg))
{
$request .= "&page=" . $this->pg;
}
 
if ($this->makeRequest($request,true))
{
return $this->parseResponse();
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Override the base to show custom table header.
// Function to setup the table header
function tableHeader()
{
$output = "<table width=\"100%\" cellpadding=3 cellspacing=0 border=0>";
 
$output .= "<br>\n";
$output .= "<tr bgcolor=\"".$this->cfg["table_header_bg"]."\">";
$output .= " <td>&nbsp;</td>";
$output .= " <td><strong>Torrent Name</strong> &nbsp;(";
 
$tmpURI = str_replace(array("?hideSeedless=yes","&hideSeedless=yes","?hideSeedless=no","&hideSeedless=no"),"",$_SERVER["REQUEST_URI"]);
 
// Check to see if Question mark is there.
if (strpos($tmpURI,'?'))
{
$tmpURI .= "&";
}
else
{
$tmpURI .= "?";
}
 
if($this->hideSeedless == "yes")
{
$output .= "<a href=\"". $tmpURI . "hideSeedless=no\">Show Seedless</a>";
}
else
{
$output .= "<a href=\"". $tmpURI . "hideSeedless=yes\">Hide Seedless</a>";
}
 
$output .= ")</td>";
$output .= " <td><strong>Category</strong></td>";
$output .= " <td align=center><strong>&nbsp;&nbsp;Size</strong></td>";
$output .= " <td><strong>Seeds</strong></td>";
$output .= " <td><strong>Peers</strong></td>";
$output .= " <td><strong>Health</strong></td>";
$output .= "</tr>\n";
 
return $output;
}
 
//----------------------------------------------------------------
// Function to parse the response.
function parseResponse()
{
$output = $this->tableHeader();
 
$thing = $this->htmlPage;
 
// We got a response so display it.
// Chop the front end off.
while (is_integer(strpos($thing,">Health")))
{
$thing = substr($thing,strpos($thing,">Health"));
$thing = substr($thing,strpos($thing,"<tr"));
$tmpList = substr($thing,0,strpos($thing,"</table>"));
 
// ok so now we have the listing.
$tmpListArr = split("<tr>",$tmpList);
 
$bg = $this->cfg["bgLight"];
 
foreach($tmpListArr as $key =>$value)
{
$buildLine = true;
if (strpos($value,"/download/"))
{
$ts = new tPort($value);
 
// Determine if we should build this output
if (is_int(array_search($ts->MainCategory,$this->catFilter)))
{
$buildLine = false;
}
 
if ($this->hideSeedless == "yes")
{
if($ts->Seeds == "N/A" || $ts->Seeds == "0")
{
$buildLine = false;
}
}
 
if (!empty($ts->torrentFile) && $buildLine) {
 
$output .= trim($ts->BuildOutput($bg, $this->searchURL()));
 
// ok switch colors.
if ($bg == $this->cfg["bgLight"])
{
$bg = $this->cfg["bgDark"];
}
else
{
$bg = $this->cfg["bgLight"];
}
}
 
}
}
// set thing to end of this table.
$thing = substr($thing,strpos($thing,"</table>"));
}
 
$output .= "</table>";
 
// is there paging at the bottom?
/*
<p align="center"><b>1&nbsp;-&nbsp;25</b> | <a href="?search=test&amp;count=87&amp;page=1"><b>26&nbsp;-&nbsp;50</b></a> | <a href="?search=test&amp;count=87&amp;page=2"><b>51&nbsp;-&nbsp;75</b></a> | <a href="?search=test&amp;count=87&amp;page=3"><b>76&nbsp;-&nbsp;87</b></a><br /><b>&lt;&lt;&nbsp;Prev</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="?search=test&amp;count=87&amp;page=1"><b>Next&nbsp;&gt;&gt;</b></a></p>
*/
if (strpos($thing, "page=") != false)
{
// Yes, then lets grab it and display it! ;)
$thing = substr($thing,strpos($thing,"<p align=\"center\">")+strlen("<p align=\"center\">"));
$pages = substr($thing,0,strpos($thing,"</p>"));
//$output .= $pages;
 
if(strpos($this->curRequest,"LATEST"))
{
if(strpos($pages,"cat="))
{
$pages = str_replace("page=","pg=",str_replace("?",$this->searchURL()."&LATEST=1&",$pages));
}
else
{
$pages = str_replace("?page=",$this->searchURL()."&LATEST=1&pg=",$pages);
}
}
else
{
if(strpos($pages,"\"?"))
{
$pages = str_replace("?",$this->searchURL()."&",$pages);
}
 
if(strpos($pages,"?search="))
{
$pages = str_replace("?search=",$this->searchURL()."&searchterm=",$pages);
}
if(strpos($pages,"search="))
{
$pages = str_replace("search=","searchterm=",$pages);
}
}
 
if(strpos($pages,"torrents.php?"))
{
$pages = str_replace("torrents.php?",$this->searchURL()."&",$pages);
}
 
if(strpos($pages,"torrents-search.php?"))
{
$pages = str_replace("torrents-search.php?",$this->searchURL()."&",$pages);
}
 
$pages = str_replace("page=","pg=",$pages);
 
$output .= "<div align=center>".$pages."</div>";
}
 
return $output;
}
}
 
// This is a worker class that takes in a row in a table and parses it.
class tPort
{
var $torrentName = "";
var $torrentDisplayName = "";
var $torrentFile = "";
var $torrentSize = "";
var $torrentStatus = "";
var $MainId = "";
var $MainCategory = "";
var $fileCount = "";
var $Seeds = "";
var $Peers = "";
var $Data = "";
 
var $torrentRating = "";
 
function tPort( $htmlLine )
{
if (strlen($htmlLine) > 0)
{
 
$this->Data = $htmlLine;
 
// Cleanup any bugs in the HTML
$htmlLine = eregi_replace("</td>\n</td>",'</td>',$htmlLine);
 
// Chunck up the row into columns.
$tmpListArr = split("<td ",$htmlLine);
 
if(count($tmpListArr) > 8)
{
$tmpStr = substr($tmpListArr["1"],strpos($tmpListArr["1"],"href=\"")+strlen("href=\"")); // Download Link
$this->torrentFile = "http://www.torrentportal.com".substr($tmpStr,0,strpos($tmpStr,"\""));
 
$this->MainCategory = $this->cleanLine("<td ".$tmpListArr["3"]."</td>"); // MainCategory
 
$tmpStr = substr($tmpListArr["2"],strpos($tmpListArr["2"],"cat=")+strlen("cat=")); // Main Id
$this->MainId = substr($tmpStr,0,strpos($tmpStr,"\""));
 
$this->torrentName = $this->cleanLine("<td ".$tmpListArr["4"]."</td>"); // TorrentName
$this->torrentRating = $this->cleanLine("<td ".$tmpListArr["5"]."</td>"); // Rating
 
$this->torrentSize = $this->cleanLine("<td ".$tmpListArr["6"]."</td>"); // Size of File
$this->Seeds = $this->cleanLine("<td ".$tmpListArr["7"]."</td>"); // Seeds
$this->Peers = $this->cleanLine("<td ".$tmpListArr["8"]."</td>"); // Leech
 
$tmpStr = substr($tmpListArr["9"],strpos($tmpListArr["9"],"Health ")+strlen("Health ")); // Health
$tmpStr = substr($tmpStr,0,strpos($tmpStr,"\""));
$tmpArr = split("/",$tmpStr);
if ($tmpArr["1"] > 0 )
{
$this->torrentStatus = ($tmpArr["0"] / $tmpArr["1"]) * 100 . "%";
}
else
{
$this->torrentStatus = "0%";
}
 
if ($this->Peers == '')
{
$this->Peers = "N/A";
if (empty($this->Seeds)) $this->Seeds = "N/A";
}
if ($this->Seeds == '') $this->Seeds = "N/A";
 
$this->torrentDisplayName = $this->torrentName;
if(strlen($this->torrentDisplayName) > 50)
{
$this->torrentDisplayName = substr($this->torrentDisplayName,0,50)."...";
}
 
}
}
 
}
 
function cleanLine($stringIn,$tags='')
{
if(empty($tags))
return trim(str_replace(array("&nbsp;","&nbsp")," ",strip_tags($stringIn)));
else
return trim(str_replace(array("&nbsp;","&nbsp")," ",strip_tags($stringIn,$tags)));
}
 
//----------------------------------------------------------------
// Function to build output for the table.
function BuildOutput($bg, $searchURL = '')
{
$output = "<tr>\n";
$output .= " <td width=16 bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\"><img src=\"images/download_owner.gif\" width=\"16\" height=\"16\" title=\"".$this->torrentName."\" border=0></a></td>\n";
$output .= " <td bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\" title=\"".$this->torrentName."\">".$this->torrentDisplayName."</a></td>\n";
 
if (strlen($this->MainCategory) > 1){
$genre = "<a href=\"".$searchURL."&mainGenre=".$this->MainId."\">".$this->MainCategory."</a>";
}else{
$genre = "";
}
 
$output .= " <td bgcolor=\"".$bg."\">". $genre ."</td>\n";
 
$output .= " <td bgcolor=\"".$bg."\" align=right>".$this->torrentSize."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Seeds."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Peers."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->torrentStatus."</td>\n";
$output .= "</tr>\n";
 
return $output;
 
}
}
 
?>
/web/kaklik's_web/torrentflux/searchEngines/TorrentSpyEngine.php
0,0 → 1,539
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
/*
v 1.01 - Changed Main Categories. (removed TV, changed Movies to Video)
v 1.02 - Mar 19, 06 - Updated pageing.
*/
 
class SearchEngine extends SearchEngineBase
{
 
function SearchEngine($cfg)
{
$this->mainURL = "torrentspy.com";
$this->altURL = "ts.searching.com";
$this->mainTitle = "TorrentSpy";
$this->engineName = "TorrentSpy";
 
$this->author = "kboy";
$this->version = "1.02";
$this->updateURL = "http://www.torrentflux.com/forum/index.php/topic,874.0.html";
$this->Initialize($cfg);
}
 
function populateMainCategories()
{
 
$this->mainCatalog["11"] = "Adult";
$this->mainCatalog["6"] = "Anime";
$this->mainCatalog["1"] = "Applications";
$this->mainCatalog["2"] = "Games";
$this->mainCatalog["13"] = "Handheld";
$this->mainCatalog["7"] = "Hentai";
$this->mainCatalog["8"] = "Linux";
$this->mainCatalog["9"] = "Macintosh";
$this->mainCatalog["10"] = "Misc";
$this->mainCatalog["3"] = "Music";
$this->mainCatalog["14"] = "Non-English";
$this->mainCatalog["12"] = "Unsorted/Other";
$this->mainCatalog["4"] = "Videos";
 
}
 
//----------------------------------------------------------------
// Function to Get Sub Categories
function getSubCategories($mainGenre)
{
$output = array();
 
if (strpos($mainGenre,'/'))
{
$request = '/directory/' . $mainGenre;
}
else
{
$request = '/directory.asp?mode=main&id=' . $mainGenre;
}
 
$mainGenreName = $this->GetMainCatName($mainGenre);
 
if ($this->makeRequest($request))
{
$thing = $this->htmlPage;
 
while (is_integer(strpos($thing,"href=\"/directory/")))
{
 
$thing = substr($thing,strpos($thing,"href=\"/directory/")+strlen("href=\"/directory/"));
$tmpStr = str_replace(array("%2f","+")," ",substr($thing,0,strpos($thing,"\"")));
$tmpStr = str_replace("%2d","-",$tmpStr);
$subid = $tmpStr;
$thing = substr($thing,strpos($thing,">")+strlen(">"));
$subname = trim(substr($thing,0,strpos($thing,"<")));
 
if($subname != $mainGenreName)
{
$output[$subid] = $subname;
}
 
}
}
 
return $output;
}
 
//----------------------------------------------------------------
// Function to Make the Request (overriding base)
function makeRequest($request)
{
if (strpos($request,"search.asp"))
{
return parent::makeRequest($request, true);
}
else
{
return parent::makeRequest($request, false);
}
}
 
//----------------------------------------------------------------
// Function to get Latest..
function getLatest()
{
$request = '/latest.asp';
 
// Added mode to support yesterday request.
if (array_key_exists("mode",$_REQUEST))
{
$request .='?mode='.$_REQUEST["mode"];
if (array_key_exists("id",$_REQUEST))
{
$request .= '&id=' . $_REQUEST["id"];
}
if (!empty($this->pg))
{
$request .= '&pg=' . $this->pg;
}
}
elseif (array_key_exists("subGenre",$_REQUEST))
{
if (strpos($_REQUEST["subGenre"],"/")>0)
{
$request ='/directory.asp?mode=sub&id=' . substr($_REQUEST["subGenre"],0,strpos($_REQUEST["subGenre"],"/"));
}
else
{
$request ='/directory.asp?mode=sub&id=' . $_REQUEST["subGenre"];
}
 
if (!empty($this->pg))
{
$request .= '&pg=' . $this->pg;
}
}
elseif (!empty($this->pg))
{
$request .= '?pg=' . $this->pg;
}
 
if ($this->makeRequest($request))
{
return $this->parseResponse();
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Function to perform Search.
function performSearch($searchTerm)
{
if (array_key_exists("directory",$_REQUEST))
{
$request = "/directory/" . str_replace("%2F","/",urlencode($_REQUEST["directory"]));
if (!empty($this->pg))
{
$request .= "?pg=" . $this->pg;
}
}
elseif (array_key_exists("getMain",$_REQUEST))
{
$request = '/directory';
}
elseif (array_key_exists("mainGenre",$_REQUEST))
{
if (strpos($_REQUEST["mainGenre"],'/'))
{
$request .= '/' . $_REQUEST["mainGenre"];
}
else
{
if (!empty($this->pg))
{
$request = '/directory.asp?mode=main&id=' . $_REQUEST["mainGenre"] . '&pg=' . $this->pg;
}
else
{
$request = '/directory.asp?mode=main&id=' . $_REQUEST["mainGenre"];
}
}
}
elseif (array_key_exists("subGenre",$_REQUEST))
{
if (strpos($_REQUEST["subGenre"],'/'))
{
$request = "/directory/" . $_REQUEST["subGenre"];
}
else
{
if ($_REQUEST["subGenre"] != "")
{
if (!empty($this->pg))
{
$request = '/directory.asp?mode=sub&id=' . $_REQUEST["subGenre"] . '&pg=' . $this->pg;
}
else
{
$request = '/directory.asp?mode=sub&id=' . $_REQUEST["subGenre"];
}
}
}
}
else
{
$searchTerm = str_replace(" ", "+", $searchTerm);
 
if ( $this->pg != '' && array_key_exists("db",$_REQUEST))
{
$request = '/search.asp?query=' . $searchTerm . '&pg=' . $this->pg . '&db=' . $_REQUEST["db"] . '&submit.x=24&submit.y=10';
}
else
{
$request = '/search.asp?query=' . $searchTerm . '&submit.x=24&submit.y=10';
}
}
 
if ($this->makeRequest($request))
{
return $this->parseResponse();
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Function to parse the response.
function parseResponse()
{
$output = $this->tableHeader();
 
$thing = $this->htmlPage;
 
if (strpos($thing, "experiencing high load") > 0)
{
$output .= "<b>We're experiencing high load at this time. Please use the directory until further notice.</b>";
}else{
// We got a response so display it.
// Chop the front end off.
while (is_integer(strpos($thing,">Health<")))
{
$thing = substr($thing,strpos($thing,">Health<"));
$thing = substr($thing,strpos($thing,"<tr"));
$tmpList = substr($thing,0,strpos($thing,"</table>"));
// ok so now we have the listing.
$tmpListArr = split("</tr>",$tmpList);
 
$langFile = _FILE;
 
$bg = $this->cfg["bgLight"];
 
foreach($tmpListArr as $key =>$value)
{
$buildLine = true;
if (strpos($value,"/torrent/"))
{
$ts = new tSpy($value);
 
// Determine if we should build this output
if (is_int(array_search($ts->MainId,$this->catFilter)))
{
$buildLine = false;
}
 
if ($this->hideSeedless == "yes")
{
if($ts->Seeds == "N/A" || $ts->Seeds == "0")
{
$buildLine = false;
}
}
 
if (!empty($ts->torrentFile) && $buildLine) {
 
$output .= trim($ts->BuildOutput($bg,$langFile,$this->searchURL()));
 
// ok switch colors.
if ($bg == $this->cfg["bgLight"])
{
$bg = $this->cfg["bgDark"];
}
else
{
$bg = $this->cfg["bgLight"];
}
}
 
}
}
// set thing to end of this table.
$thing = substr($thing,strpos($thing,"</table>"));
}
}
 
$output .= "</table>";
 
// is there paging at the bottom?
if (strpos($thing, "<p class=\"pagenav\">Pages (") !== false)
{
// Yes, then lets grab it and display it! ;)
$thing = substr($thing,strpos($thing,"<p class=\"pagenav\">Pages (")+strlen("<p class=\"pagenav\">"));
$pages = substr($thing,0,strpos($thing,"</p>"));
$page1 = substr($pages,0,strpos($pages,"<img"));
$page2 = substr($pages,strlen($page1));
$page2 = substr($page2,strpos($page2,'>')+1);
$pages = $page1.$page2;
 
if (strpos($pages,"directory"))
{
$pages = str_replace("?","&",$pages);
$pages = str_replace("/directory/", $this->searchURL()."&directory=", $pages);
}
elseif (strpos($pages, "search.asp?"))
{
$pages = str_replace("search.asp?", $this->searchURL()."&", $pages);
}
elseif (strpos($pages, "/search/"))
{
$pages = str_replace("&amp;","&",$pages);
$pages = str_replace("?","&",$pages);
$pages = str_replace("/search/", $this->searchURL()."&searchterm=", $pages);
}
elseif (strpos($pages,"latest.asp?"))
{
$pages = str_replace("latest.asp?mode=", $this->searchURL()."&LATEST=1&mode=", $pages);
if (!array_key_exists("mode",$_REQUEST))
{
$pages .= "<br><a href=\"".$this->searchURL()."&LATEST=1&mode=yesterday\" title=\"Yesterday's Latest\">Yesterday's Latest</a>";
}
elseif (! $_REQUEST["mode"] == "yesterday")
{
$pages .= "<br><a href=\"".$this->searchURL()."&LATEST=1&mode=yesterday\" title=\"Yesterday's Latest\">Yesterday's Latest</a>";
}
else
{
$pages .= "<br><b>Yesterday's Latest</b>";
}
}
 
$output .= "<br><div align=center>".$pages."</div><br>";
}
elseif(array_key_exists("LATEST",$_REQUEST))
{
$pages = '';
if (!array_key_exists("mode",$_REQUEST))
{
$pages .= "<br><a href=\"".$this->searchURL()."&LATEST=1&mode=yesterday\" title=\"Yesterday's Latest\">Yesterday's Latest</a>";
}
elseif (! $_REQUEST["mode"] == "yesterday")
{
$pages .= "<br><a href=\"".$this->searchURL()."&LATEST=1&mode=yesterday\" title=\"Yesterday's Latest\">Yesterday's Latest</a>";
}
else
{
$pages .= "<br><b>Yesterday's Latest</b>";
}
 
$output .= "<br><div align=center>".$pages."</div><br>";
}
 
return $output;
}
}
 
// This is a worker class that takes in a row in a table and parses it.
class tSpy
{
var $torrentName = "";
var $torrentDisplayName = "";
var $torrentFile = "";
var $torrentStatus = "";
var $MainId = "";
var $MainCategory = "";
var $SubId = "";
var $SubCategory = "";
var $torrentSize = "";
var $fileCount = "";
var $Seeds = "";
var $Peers = "";
var $Data = "";
 
function tSpy( $htmlLine )
{
if (strlen($htmlLine) > 0)
{
 
$this->Data = $htmlLine;
 
// Chunck up the row into columns.
$tmpListArr = split("</td>",$htmlLine);
 
if(count($tmpListArr) > 5)
{
$tmpListArr["0"]; // Torrent Name, Download Link, Status
 
$this->torrentDisplayName = $this->cleanLine($tmpListArr["0"]); // TorrentName
 
$tmpStr = substr($tmpListArr["0"],strpos($tmpListArr["0"],"/torrent/")+strlen("/torrent/")); // Download Link
$this->torrentFile = "http://www.torrentspy.com/download.asp?id=" . substr($tmpStr,0,strpos($tmpStr,"/"));
 
$tmpStatus = substr($tmpStr,strpos($tmpStr,"title=\"")+strlen("title=\""));
$tmpStatus = substr($tmpStatus,0,strpos($tmpStatus,">"));
 
if (strpos($tmpStatus,"password"))
{
$this->torrentStatus = "P";
}elseif (strpos($tmpStatus,"register"))
{
$this->torrentStatus = "R";
}
 
$tmpStr = substr($tmpStr,strpos($tmpStr,">")+strlen(">"));
 
if(strpos($tmpStr,"/torrent/") > 0)
{
$tmpStr = substr($tmpStr,strpos($tmpStr,"/torrent/")+strlen("/torrent/"));
}
 
$tmpStr = substr($tmpStr,strpos($tmpStr,"title=\"")+strlen("title=\""));
$this->torrentName = substr($tmpStr,0,strpos($tmpStr,"\""));
 
$tmpStr = $tmpListArr["1"]; // Categories
if(strpos($tmpStr,"mode=")){
$tmpStr = substr($tmpStr,strpos($tmpStr,"mode=main&id=")+strlen("mode=main&id="));
$this->MainId = substr($tmpStr,0,strpos($tmpStr,"\""));
}else{
$tmpStr = substr($tmpStr,strpos($tmpStr,"/directory/")+strlen("/directory/"));
$this->MainId = substr($tmpStr,0,strpos($tmpStr,"/"));
}
$tmpStr = substr($tmpStr,strpos($tmpStr,"title=\"")+strlen("title=\""));
$this->MainCategory = substr($tmpStr,0,strpos($tmpStr,"\""));
 
if(strpos($tmpStr,"mode=")){
$tmpStr = substr($tmpStr,strpos($tmpStr,"mode=sub&id=")+strlen("mode=sub&id="));
$this->SubId = substr($tmpStr,0,strpos($tmpStr,"\""));
}else{
$tmpStr = substr($tmpStr,strpos($tmpStr,"/directory/")+strlen("/directory/"));
$this->SubId = substr($tmpStr,0,strpos($tmpStr,"/"));
}
$tmpStr = substr($tmpStr,strpos($tmpStr,"title=\"")+strlen("title=\""));
$this->SubCategory = substr($tmpStr,0,strpos($tmpStr,"\""));
 
$this->torrentSize = $this->cleanLine($tmpListArr["2"]); // Size of File
$this->fileCount = $this->cleanLine($tmpListArr["3"]); // File Count
$this->Seeds = $this->cleanLine($tmpListArr["4"]); // Seeds
$this->Peers = $this->cleanLine($tmpListArr["5"]); // Peers
//$tmpListArr["6"] = $this->cleanLine($tmpListArr["6"]); // Health
 
if ($this->Peers == '')
{
$this->Peers = "N/A";
if (empty($this->Seeds)) $this->Seeds = "N/A";
}
if ($this->Seeds == '') $this->Seeds = "N/A";
 
if(strlen($this->torrentDisplayName) > 50)
{
$this->torrentDisplayName = substr($this->torrentDisplayName,0,50)."...";
}
 
}
}
 
}
 
function cleanLine($stringIn,$tags='')
{
if(empty($tags))
return trim(str_replace(array("&nbsp;","&nbsp")," ",strip_tags($stringIn)));
else
return trim(str_replace(array("&nbsp;","&nbsp")," ",strip_tags($stringIn,$tags)));
}
 
//----------------------------------------------------------------
// Function to build output for the table.
function BuildOutput($bg,$langFILE, $searchURL = '')
{
$output = "<tr>\n";
$output .= " <td width=16 bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\"><img src=\"images/download_owner.gif\" width=\"16\" height=\"16\" title=\"".$this->torrentName." - ".$this->fileCount." ".$langFILE."\" border=0></a></td>\n";
$output .= " <td bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\" title=\"".$this->torrentName."\">".$this->torrentDisplayName."</a>";
switch ($this->torrentStatus)
{
case "R":
$output .= " <span title=Registration_Needed><b>R</b></span>";
break;
case "P":
$output .= " <span title=Password_Needed><b>P</b></span>";
break;
}
$output .= "</td>\n";
 
if (strlen($this->MainCategory) > 1){
if (strlen($this->SubCategory) > 1){
$mainGenre = "<a href=\"".$searchURL."&mainGenre=".$this->MainId."\">".$this->MainCategory."</a>";
$subGenre = "<a href=\"".$searchURL."&subGenre=".$this->SubId."\">".$this->SubCategory."</a>";
$genre = $mainGenre."-".$subGenre;
}else{
$genre = "<a href=\"".$searchURL."&mainGenre=".$this->MainId."\">".$this->MainCategory."</a>";
}
}else{
$genre = "<a href=\"".$searchURL."&subGenre=".$this->SubId."\">".$this->SubCategory."</a>";
}
 
$output .= " <td bgcolor=\"".$bg."\">". $genre ."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=right>".$this->torrentSize."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Seeds."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Peers."</td>\n";
$output .= "</tr>\n";
 
return $output;
 
}
}
 
?>
/web/kaklik's_web/torrentflux/searchEngines/isoHuntEngine.php
0,0 → 1,383
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
 
class SearchEngine extends SearchEngineBase
{
 
function SearchEngine($cfg)
{
$this->mainURL = "isohunt.com";
$this->altURL = "isohunt.com";
$this->mainTitle = "isoHunt";
$this->engineName = "isoHunt";
 
$this->author = "kboy";
$this->version = "1.00";
$this->updateURL = "http://www.torrentflux.com/forum/index.php/topic,878.0.html";
 
$this->Initialize($cfg);
 
}
 
//----------------------------------------------------------------
// Function to Make the Request (overriding base)
function makeRequest($request)
{
return parent::makeRequest($request, true);
}
 
//----------------------------------------------------------------
// Function to get Latest..
function getLatest()
{
$request = "/latest.php?mode=bt";
 
if (!empty($this->pg))
{
$request .= "&pg=" . $this->pg;
}
 
if ($this->makeRequest($request))
{
return $this->parseResponse(true);
}
else
{
return $this->msg;
}
}
 
//----------------------------------------------------------------
// Function to perform Search.
function performSearch($searchTerm)
{
// This is what isohunt is looking for in a request.
// http://isohunt.com/torrents.php?ihq=test&ext=&op=and
 
// create the request string.
$searchTerm = str_replace(" ", "+", $searchTerm);
$request = "/torrents.php?ihq=".$searchTerm;
$request .= "&ext=&op=and";
 
if (!empty($this->pg))
{
$request .= "&ihs1=18&iho1=d&iht=-1&ihp=" . $this->pg;
}
 
$request .= "&submit=Torrents";
 
// make the request if successful call the parse routine.
if ($this->makeRequest($request))
{
return $this->parseResponse(false);
}
else
{
return $this->msg;
}
 
}
 
//----------------------------------------------------------------
// Function to parse the response.
function parseResponse($latest = true)
{
$output = $this->tableHeader();
 
$thing = $this->htmlPage;
 
// Strip out those Nasty Iframes.
$thing = eregi_replace("<table[[:space:]]width=[[:punct:]]100%[[:punct:]][[:space:]]cellspacing=[[:punct:]]0[[:punct:]][[:space:]]cellpadding=[[:punct:]]0[[:punct:]][[:space:]]border=[[:punct:]]0[[:punct:]]><tr><td[[:space:]]width=[[:punct:]]10[[:punct:]]></td><td[[:space:]]style=[[:punct:]]border[[:punct:]]3px[[:space:]]solid[[:space:]]#003366[[:punct:]]><iframe[[:space:]]frameborder=[[:punct:]]0[[:punct:]][[:space:]]width=[[:punct:]]100%[[:punct:]][[:space:]]id=[[:punct:]]([a-zA-Z0-9])*[[:punct:]]></iframe></td></tr></table>",'',$thing);
 
// We got a response so display it.
// Chop the front end off.
while (is_integer(strpos($thing,"<table")))
{
$thing = substr($thing,strpos($thing,"<table"));
$thing = substr($thing,strpos($thing,"</tr>"));
$tmpList = substr($thing,0,strpos($thing,"</table>"));
 
// ok so now we have the listing.
$tmpListArr = split("</tr>",$tmpList);
 
$bg = $this->cfg["bgLight"];
 
foreach($tmpListArr as $key =>$value)
{
//echo $value;
$buildLine = true;
if (strpos($value,"id="))
{
$ts = new isoHunt($value,$latest);
 
// Determine if we should build this output
if (is_int(array_search($ts->CatName,$this->catFilter)))
{
$buildLine = false;
}
 
if ($this->hideSeedless == "yes")
{
if($ts->Seeds == "N/A" || $ts->Seeds == "0")
{
$buildLine = false;
}
}
 
if (!empty($ts->torrentFile) && $buildLine) {
 
$output .= trim($ts->BuildOutput($bg));
 
// ok switch colors.
if ($bg == $this->cfg["bgLight"])
{
$bg = $this->cfg["bgDark"];
}
else
{
$bg = $this->cfg["bgLight"];
}
}
 
}
}
 
// set thing to end of this table.
$thing = substr($thing,strpos($thing,"</table>"));
}
 
$output .= "</table>";
 
// is there paging at the bottom?
if (strpos($this->htmlPage, "<table class='pager'>") != false)
{
// Yes, then lets grab it and display it! ;)
 
$thing = substr($this->htmlPage,strpos($this->htmlPage,"<table class='pager'>")+strlen("<table class='pager'>"));
$pages = substr($thing,0,strpos($thing,"</table>"));
 
$pages = str_replace("&nbsp; ",'',strip_tags($pages,"<a><b>"));
 
$tmpPageArr = split("</a>",$pages);
array_pop($tmpPageArr);
 
$pagesout = '';
foreach($tmpPageArr as $key => $value)
{
$value .= "</a> &nbsp;";
$tmpVal = substr($value,strpos($value,"/torrents.php"),strpos($value,"\>")-1);
$pgNum = substr($tmpVal,strpos($tmpVal,"ihp=")+strlen("ihp="));
$pagesout .= str_replace($tmpVal,"XXXURLXXX".$pgNum,$value);
}
if(strpos($this->curRequest,"LATEST"))
{
$pages = str_replace("XXXURLXXX",$this->searchURL()."&LATEST=1&pg=",$pagesout);
}
else
{
$pages = str_replace("XXXURLXXX",$this->searchURL()."&searchterm=".$_REQUEST["searchterm"]."&pg=",$pagesout);
}
$pages = strip_tags($pages,"<a><b>");
$output .= "<div align=center>".$pages."</div>";
}
 
return $output;
}
}
 
// This is a worker class that takes in a row in a table and parses it.
class isoHunt
{
var $torrentName = "";
var $torrentDisplayName = "";
var $torrentFile = "";
var $torrentSize = "";
var $torrentStatus = "";
var $CatId = "";
var $CatName = "";
var $fileCount = "";
var $Seeds = "";
var $Peers = "";
var $Data = "";
 
var $dateAdded = "";
var $dwnldCount = "";
 
function isoHunt( $htmlLine , $latest = true)
{
if (strlen($htmlLine) > 0)
{
 
$this->Data = $htmlLine;
 
// Fix messed up end td's once in a while.
$htmlLine = eregi_replace("<(.)*1ff8(.)*/td>",'</td>',$htmlLine);
 
// Chunck up the row into columns.
$tmpListArr = split("</td>",$htmlLine);
array_pop($tmpListArr);
 
//Age Type Torrent Names MB F S L D
if(count($tmpListArr) > 6)
{
if ($latest)
{
// Latest Request //
if(strpos($tmpListArr["3"],"[DL]"))
{
 
//$tmpListArr["1"] = $this->cleanLine($tmpListArr["1"]); // Age
$this->CatName = $this->cleanLine($tmpListArr["2"]); // Type
 
$tmpStr = $tmpListArr["3"]; // TorrentName and Download Link
// move to the [DL] area. and remove [REL] line
$tmpStr = substr($tmpStr,strpos($tmpStr,"[DL]")+strlen("[DL]"), strpos($tmpStr,"[REL]"));
$tmpStr = substr($tmpStr,strpos($tmpStr,"href=\"")+strlen("href=\"")); // Download Link
$this->torrentFile = "http://isohunt.com".substr($tmpStr,0,strpos($tmpStr,"\""));
$tmpStr = substr($tmpStr,strpos($tmpStr,"title=\"")+strlen("title=\""));
$tmpStr = substr($tmpStr,0,strpos($tmpStr,"\""));
$tmpStr = substr($tmpStr,strpos($tmpStr,'\''));
$this->torrentName = str_replace("'",'',$tmpStr);
 
$this->torrentSize = $this->cleanLine($tmpListArr["4"]); // MB
$this->fileCount = $this->cleanLine($tmpListArr["5"]); // Files
$this->Seeds = $this->cleanLine($tmpListArr["6"]); // Seeds
$this->Peers = $this->cleanLine($tmpListArr["7"]); // Peers / Leechers
$this->dwnldCount = $this->cleanLine($tmpListArr["8"]); // Download Count
}
else
{
$this->CatName = $this->cleanLine($tmpListArr["1"]); // Type
 
$tmpStr = $tmpListArr["0"]; // TorrentName and Download Link
$tmpStr = substr($tmpStr,strpos($tmpStr,"id="));
$this->torrentFile = "http://isohunt.com/download.php?mode=bt&amp;".substr($tmpStr,0,strpos($tmpStr,"'"));
 
$this->torrentName = $this->cleanLine($tmpListArr["2"]);
 
$this->torrentSize = $this->cleanLine($tmpListArr["3"]); // MB
$this->fileCount = $this->cleanLine($tmpListArr["4"]); // Files
$this->Seeds = $this->cleanLine($tmpListArr["5"]); // Seeds
$this->Peers = $this->cleanLine($tmpListArr["6"]); // Peers / Leechers
$this->dwnldCount = $this->cleanLine($tmpListArr["7"]); // Download Count
}
}
else
{
// Search Request //
 
if(strpos($tmpListArr["2"],"[DL]"))
{
$this->CatName = $this->cleanLine($tmpListArr["0"]); // Type
 
//$tmpListArr["1"] = $this->cleanLine($tmpListArr["1"]); // Age
 
$tmpStr = $tmpListArr["2"]; // TorrentName and Download Link
// move to the [DL] area. and remove [REL] line
$tmpStr = substr($tmpStr,strpos($tmpStr,"[DL]")+strlen("[DL]"), strpos($tmpStr,"[REL]"));
$tmpStr = substr($tmpStr,strpos($tmpStr,"href=\"")+strlen("href=\"")); // Download Link
$this->torrentFile = "http://isohunt.com".substr($tmpStr,0,strpos($tmpStr,"\""));
$tmpStr = substr($tmpStr,strpos($tmpStr,"title=\"")+strlen("title=\""));
$tmpStr = substr($tmpStr,0,strpos($tmpStr,"\""));
$tmpStr = substr($tmpStr,strpos($tmpStr,'\''));
$this->torrentName = str_replace(array("'","Download .torrent here: "),'',$tmpStr);
 
}
else
{
$tmpStr = $tmpListArr["0"]; // Download ID and Type
$this->CatName = $this->cleanLine($tmpStr); // Download ID and Type
$tmpStr = substr($tmpStr,strpos($tmpStr,"&id=")+strlen("&id="));
 
$this->torrentFile = "http://isohunt.com/download.php?mode=bt&amp;id=".substr($tmpStr,0,strpos($tmpStr,",")-1);
 
//$tmpListArr["1"] = $this->cleanLine($tmpListArr["1"]); // Age
 
$this->torrentName = $this->cleanLine($tmpListArr["2"]);
 
}
 
$this->torrentSize = $this->cleanLine($tmpListArr["3"]); // MB
$this->fileCount = $this->cleanLine($tmpListArr["4"]); // Files
$this->Seeds = $this->cleanLine($tmpListArr["5"]); // Seeds
$this->Peers = $this->cleanLine($tmpListArr["6"]); // Peers / Leechers
$this->dwnldCount = $this->cleanLine($tmpListArr["7"]); // Download Count
 
$this->torrentDisplayName = $this->torrentName;
 
}
 
if ($this->Peers == '')
{
$this->Peers = "N/A";
if (empty($this->Seeds)) $this->Seeds = "N/A";
}
 
if ($this->Seeds == '') $this->Seeds = "N/A";
 
$this->torrentDisplayName = str_replace(".torrent",'',$this->torrentName);
if(strlen($this->torrentDisplayName) > 50)
{
$this->torrentDisplayName = substr($this->torrentDisplayName,0,50)."...";
}
 
}
}
}
 
function cleanLine($stringIn,$tags='')
{
if(empty($tags))
return trim(str_replace(array("&nbsp;","&nbsp")," ",strip_tags($stringIn)));
else
return trim(str_replace(array("&nbsp;","&nbsp")," ",strip_tags($stringIn,$tags)));
}
 
function dumpArray($arrIn)
{
foreach($arrIn as $key => $value)
{
echo "\nkey(".$key.")"."value(".$value.")";
}
}
//----------------------------------------------------------------
// Function to build output for the table.
function BuildOutput($bg)
{
$output = "<tr>\n";
$output .= " <td width=16 bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\"><img src=\"images/download_owner.gif\" width=\"16\" height=\"16\" title=\"".$this->torrentName."\" border=0></a></td>\n";
$output .= " <td bgcolor=\"".$bg."\"><a href=\"index.php?url_upload=".$this->torrentFile."\" title=\"".$this->torrentName."\">".$this->torrentDisplayName."</a></td>\n";
$output .= " <td bgcolor=\"".$bg."\">". $this->CatName ."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=right>".$this->torrentSize."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Seeds."</td>\n";
$output .= " <td bgcolor=\"".$bg."\" align=center>".$this->Peers."</td>\n";
$output .= "</tr>\n";
 
return $output;
 
}
}
 
?>
/web/kaklik's_web/torrentflux/setpriority.php
0,0 → 1,97
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
function getFile($var)
{
if ($var < 65535)
return true;
else
return false;
}
 
//*********************************************************
// setPriority()
function setPriority($torrent)
{
global $cfg;
 
// we will use this to determine if we should create a prio file.
// if the user passes all 1's then they want the whole thing.
// so we don't need to create a prio file.
// if there is a -1 in the array then they are requesting
// to skip a file. so we will need to create the prio file.
 
$okToCreate = false;
 
if(!empty($torrent))
{
 
$alias = getAliasName($torrent);
$fileName = $cfg["torrent_file_path"].$alias.".prio";
 
$result = array();
 
$files = array_filter($_REQUEST['files'],"getFile");
 
// if there are files to get then process and create a prio file.
if (count($files) > 0)
{
for($i=0;$i<getRequestVar('count');$i++)
{
if(in_array($i,$files))
{
array_push($result,1);
}
else
{
$okToCreate = true;
array_push($result,-1);
}
}
$alias = getAliasName($torrent);
 
if ($okToCreate)
{
$fp = fopen($fileName, "w");
fwrite($fp,getRequestVar('filecount').",");
fwrite($fp,implode($result,','));
fclose($fp);
}
else
{
// No files to skip so must be wanting them all.
// So we will remove the prio file.
@unlink($fileName);
}
}
else
{
// No files selected so must be wanting them all.
// So we will remove the prio file.
@unlink($fileName);
}
}
}
 
?>
/web/kaklik's_web/torrentflux/settingsfunctions.php
0,0 → 1,190
<?php
 
/*************************************************************
* TorrentFlux PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
//*************************************************************
// This file contains methods used by both the login.php and the
// main application
//*************************************************************
function getRequestVar($varName)
{
if (array_key_exists($varName,$_REQUEST))
{
return trim($_REQUEST[$varName]);
}
else
{
return '';
}
}
 
 
//*********************************************************
// AuditAction
function AuditAction($action, $file="")
{
global $_SERVER, $cfg, $db;
 
$host_resolved = gethostbyaddr($cfg['ip']);
$create_time = time();
 
$rec = array(
'user_id' => $cfg['user'],
'file' => $file,
'action' => $action,
'ip' => $cfg['ip'],
'ip_resolved' => $host_resolved,
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'time' => $create_time
);
 
$sTable = 'tf_log';
$sql = $db->GetInsertSql($sTable, $rec);
 
// add record to the log
$result = $db->Execute($sql);
showError($db,$sql);
}
 
//*********************************************************
function loadSettings()
{
global $cfg, $db;
 
// pull the config params out of the db
$sql = "SELECT tf_key, tf_value FROM tf_settings";
$recordset = $db->Execute($sql);
showError($db, $sql);
 
while(list($key, $value) = $recordset->FetchRow())
{
$tmpValue = '';
if(strpos($key,"Filter")>0)
{
$tmpValue = unserialize($value);
}
elseif($key == 'searchEngineLinks')
{
$tmpValue = unserialize($value);
}
if(is_array($tmpValue))
{
$value = $tmpValue;
}
$cfg[$key] = $value;
}
}
 
//*********************************************************
function insertSetting($key,$value)
{
global $cfg, $db;
 
$update_value = $value;
if (is_array($value))
{
$update_value = serialize($value);
}
 
$sql = "INSERT INTO tf_settings VALUES ('".$key."', '".$update_value."')";
 
if ( $sql != "" )
{
$result = $db->Execute($sql);
showError($db,$sql);
// update the Config.
$cfg[$key] = $value;
}
}
 
//*********************************************************
function updateSetting($key,$value)
{
global $cfg, $db;
$update_value = $value;
if (is_array($value))
{
$update_value = serialize($value);
}
 
$sql = "UPDATE tf_settings SET tf_value = '".$update_value."' WHERE tf_key = '".$key."'";
 
if ( $sql != "" )
{
$result = $db->Execute($sql);
showError($db,$sql);
// update the Config.
$cfg[$key] = $value;
}
}
 
//*********************************************************
function saveSettings($settings)
{
global $cfg, $db;
 
foreach ($settings as $key => $value)
{
if (array_key_exists($key, $cfg))
{
if(is_array($cfg[$key]) || is_array($value))
{
if(serialize($cfg[$key]) != serialize($value))
{
updateSetting($key, $value);
}
 
}elseif ($cfg[$key] != $value)
{
updateSetting($key, $value);
}
else
{
// Nothing has Changed..
}
}else{
insertSetting($key,$value);
}
}
}
 
//*********************************************************
function isFile($file)
{
$rtnValue = False;
 
if (is_file($file))
{
$rtnValue = True;
}
else
{
if ($file == trim(shell_exec("ls ".$file)))
{
$rtnValue = True;
}
}
return $rtnValue;
}
 
?>
/web/kaklik's_web/torrentflux/startpop.php
0,0 → 1,257
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
require_once("metaInfo.php");
 
$torrent = getRequestVar('torrent');
$displayName = $torrent;
 
if(strlen($displayName) >= 55)
{
$displayName = substr($displayName, 0, 52)."...";
}
 
?>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 
<html>
<head>
<title><?php echo _RUNTORRENT ?> - <?php echo $displayName ?></title>
<LINK REL="StyleSheet" HREF="themes/<?php echo $cfg["theme"] ?>/style.css" TYPE="text/css" />
<META HTTP-EQUIV="Pragma" CONTENT="no-cache; charset=<?php echo _CHARSET ?>">
 
<script language="JavaScript">
function StartTorrent()
{
 
if (ValidateValues())
{
document.theForm.submit();
}
}
 
function ValidateValues()
{
 
var rtnValue = true;
var msg = "";
if (isNumber(document.theForm.rate.value) == false)
{
msg = msg + "* Max Upload Rate must be a valid number.\n";
document.theForm.rate.focus();
}
if (isNumber(document.theForm.drate.value) == false)
{
msg = msg + "* Max Download Rate must be a valid number.\n";
document.theForm.drate.focus();
}
if (isNumber(document.theForm.maxuploads.value) == false)
{
msg = msg + "* Max # Uploads must be a valid number.\n";
document.theForm.maxuploads.focus();
}
if ((isNumber(document.theForm.minport.value) == false) || (isNumber(document.theForm.maxport.value) == false))
{
msg = msg + "* Port Range must have valid numbers.\n";
document.theForm.minport.focus();
}
if (isNumber(document.theForm.rerequest.value) == false)
{
msg = msg + "* Rerequest Interval must be a valid number.\n";
document.theForm.rerequest.focus();
}
if (document.theForm.rerequest.value < 10)
{
msg = msg + "* Rerequest Interval must be 10 or greater.\n";
document.theForm.rerequest.focus();
}
if (isNumber(document.theForm.sharekill.value) == false)
{
msg = msg + "* Keep seeding until Sharing % must be a valid number.\n";
document.theForm.sharekill.focus();
}
if ((document.theForm.maxport.value > 65535) || (document.theForm.minport.value > 65535))
{
msg = msg + "* Port can not be higher than 65535.\n";
document.theForm.minport.focus();
}
if ((document.theForm.maxport.value < 0) || (document.theForm.minport.value < 0))
{
msg = msg + "* Can not have a negative number for port value.\n";
document.theForm.minport.focus();
}
if (document.theForm.maxport.value < document.theForm.minport.value)
{
msg = msg + "* Port Range is not valid.\n";
document.theForm.minport.focus();
}
 
if (msg != "")
{
rtnValue = false;
alert("Please check the following:\n\n" + msg);
}
 
return rtnValue;
}
 
function CheckShareState()
{
 
var obj = document.getElementById('sharekiller');
if (document.theForm.runtime.value == "True")
{
obj.style.visibility = "hidden";
}
else
{
obj.style.visibility = "visible";
}
}
 
function isNumber(sText)
{
var ValidChars = "0123456789";
var IsNumber = true;
var Char;
 
for (i = 0; i < sText.length && IsNumber == true; i++)
{
Char = sText.charAt(i);
if (ValidChars.indexOf(Char) == -1)
{
IsNumber = false;
}
}
 
return IsNumber;
}
</script>
 
</head>
 
<body bgcolor="<?php echo $cfg["body_data_bg"]; ?>">
 
<div align="center">
<strong><?php echo $displayName ?></strong><br>
<table width="98%" border="0" cellpadding="0" cellspacing="0">
<tr><form name="theForm" target="_parent" action="index.php" method="POST">
<input type="hidden" name="closeme" value="true">
<input type="hidden" name="torrent" value="<?php echo $torrent; ?>">
<td>
 
<table width="100%" cellpadding="2" cellspacing="0" border="0">
<tr>
<td align="right">Max Upload Rate:</td>
<td><input type="Text" name="rate" maxlength="4" size="4" value="<?php echo $cfg["max_upload_rate"]; ?>"> kB/s</td>
<td align="right">Max # Uploads:</td>
<td><input type="Text" name="maxuploads" maxlength="2" size="2" value="<?php echo $cfg["max_uploads"]; ?>"></td>
</tr>
<tr>
<td align="right" valign="top">Max Download Rate:</td>
<td valign="top"><input type="Text" name="drate" maxlength="4" size="4" value="<?php echo $cfg["max_download_rate"]; ?>"> kB/s<font class="tiny"> (0 = max)</font></td>
<td align="Left" colspan="2" valign="top"><input type="Checkbox" name="superseeder" value="1">Super Seeder<font class="tiny"> (dedicated seed only)</font></td>
</tr>
<tr>
<td align="right" valign="top">Rerequest Interval:</td>
<td valign="top"><input type="Text" name="rerequest" maxlength="5" size="5" value="<?php echo $cfg["rerequest_interval"]; ?>"></td>
<td align="Left" colspan="2" valign="top">
<?php
if($cfg["AllowQueing"] == true)
{
if ( IsAdmin() )
{
echo "<input type='Checkbox' name='queue' checked>Add to Queue";
}
else
{
// Force Queuing if not an admin.
echo "<input type='hidden' name='queue' value=1>";
}
}
else
{
echo "&nbsp;";
}
echo "</td>";
?>
 
</tr>
<tr>
<td align="right">Completion:</td>
<td>
<?php
$selected = "";
if ($cfg["torrent_dies_when_done"] == "False")
{
$selected = "selected";
}
?>
 
<select name="runtime" onchange="CheckShareState()">
<option value="True">Die When Done</option>
<option value="False" <?php echo $selected ?>>Keep Seeding</option>
</select>
</td>
<td align="right">Port Range:</td>
<td>
<input type="Text" name="minport" maxlength="5" size="5" value="<?php echo $cfg["minport"]; ?>">
-
<input type="Text" name="maxport" maxlength="5" size="5" value="<?php echo $cfg["maxport"]; ?>">
</td>
</tr>
<tr>
<td colspan="4" align="center"><div ID="sharekiller" align="center" style="visibility:hidden;">Keep seeding until Sharing is: <input type="Text" name="sharekill" maxlength="4" size="4" value="<?php echo $cfg["sharekill"]; ?>">%<font class="tiny"> (0% will keep seeding)</font>&nbsp;</div></td>
</tr>
</table>
<br>
&nbsp;&nbsp;&nbsp;Torrent Meta Data / Priority Selection:
</td>
</tr>
</table>
<div align="left" id="BodyLayer" name="BodyLayer" style="border: thin solid <?php echo $cfg["main_bgcolor"] ?>; background-color: <?php echo $cfg["bgLight"] ?>; position:relative; width:650; height:290; padding-left: 5px; padding-right: 5px; z-index:1; overflow: scroll; visibility: visible">
<?php
showMetaInfo($torrent,false);
?>
</div>
<br>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<input type="button" id="startbtn" name="startbtn" value="<?php echo _RUNTORRENT ?>" onclick="StartTorrent();">&nbsp;&nbsp;
<input type="button" value="Cancel" onclick="window.close()">
</td>
</tr>
</table>
</form>
</div>
<script language="JavaScript">
CheckShareState();
document.getElementById('startbtn').focus();
</script>
</body>
</html>
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#829FB5";
$cfg["table_data_bg"] = "#EEEEEE";
$cfg["table_border_dk"] = "#d6dfe6";
$cfg["table_header_bg"] = "#d6dfe6";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#d6dfe6";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#ececec";
$cfg["bgDark"] = "#e1e1e1";
 
?>
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/black.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/compressed.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/delete_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/delete_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/download.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/download_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/download_owner.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/favicon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/folder.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/green.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/kill.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/locked.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/logout.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/red.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/run_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/seed_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/tar_down.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/user.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/user_group.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/main-icons/yellow.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/BlueFlux/readme.txt
0,0 → 1,51
#######################################################################
# #
# BlueFlux theme for Torrentflux (http://www.torrentflux.com) #
# #
# By: Micke (RaWeN @ torrentflux forums) #
# Contact: ICQ 32133138 HTTP www.riskaka.com #
# #
#######################################################################
 
 
Installation (Optional steps within [])
----------------------------------------
1. Unzip and upload the BlueFlux folder to /*your_torrentflux_directory*/themes/
 
[ 2. BACKUP YOUR CURRENT FILES BEFORE PROCEEDING! ]
[ 3. Replace the icons in /*your_torrentflux_directory/images with the ones in BlueFlux/main-icons/ ]
[ 4. Edit the files below to get the final touches. ]
 
5. Enjoy your new theme =)
 
 
 
Changed files:
--------------
 
# downloaddetails.php
 
Original: <table width="100%" cellpadding="0" cellspacing="0" border="0">
New: <table width="100%" cellpadding="0" cellspacing="0" border="0" class="detailbar">
 
* Also the heights of the to <td> below this line is changed from 13 to 12
 
 
# functions.php
 
Original: <table width="100%" border="0" cellpadding="0" cellspacing="0">
New: <table width="100%" border="0" cellpadding="0" cellspacing="0" class="detailbar">
 
 
 
Changelog (not much but hey, why not!):
---------------------------------------
20051120 - 1.0: First official release
Changed since last time
* More icons
* Added instructions on how to change files
* Added .detailbar class in style.css
.
 
20051118 - 0.1: The all new blueflux theme.
/web/kaklik's_web/torrentflux/themes/BlueFlux/style.css
0,0 → 1,37
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #ffffff; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#A8C4DA; }
.fg { border: 0px outset #E6E6E6; background-color:#EEEEEE; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#EEEEEE; font-size:9pt; font-weight:normal;}
.detailbar {
border-right-width: 1px;
border-right-style: solid;
border-right-color: #000000;
}
/web/kaklik's_web/torrentflux/themes/G4E/favicon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/gentoo.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/gentoo2.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/gentoo2.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/G4E/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/G4E/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#e7e7e7";
$cfg["table_data_bg"] = "#ffffff";
$cfg["table_border_dk"] = "#e0e0e0";
$cfg["table_header_bg"] = "#c8d0d3";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#ffffff";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#ffffff";
$cfg["bgDark"] = "#e0e0e0";
 
 
/web/kaklik's_web/torrentflux/themes/G4E/style.css
0,0 → 1,33
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #ffffff; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
.links {background-image: url(images/gentoo2.png); background-repeat: no-repeat; background-position: right;}
/web/kaklik's_web/torrentflux/themes/chrome/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/chrome/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/images/torrents.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/chrome/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#606060";
$cfg["table_data_bg"] = "#EEEEEE";
$cfg["table_border_dk"] = "#808080";
$cfg["table_header_bg"] = "#c0c0c0";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#DDDDDD";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#ececec";
$cfg["bgDark"] = "#c8c8c8";
 
?>
/web/kaklik's_web/torrentflux/themes/chrome/style.css
0,0 → 1,32
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #000000; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/themes/command/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/command/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/images/torrents.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/command/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#000000";
$cfg["table_data_bg"] = "#000000";
$cfg["table_border_dk"] = "#00FF12";
$cfg["table_header_bg"] = "#4A4A4A";
$cfg["table_admin_border"] = "#6E6E6E";
$cfg["body_data_bg"] = "#000000";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#6E6E6E";
$cfg["bgDark"] = "#4A4A4A";
 
?>
/web/kaklik's_web/torrentflux/themes/command/style.css
0,0 → 1,71
FONT {FONT-FAMILY: Verdana,Helvetica; COLOR: #00FF12; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; COLOR: #00FF12; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; COLOR: #00FF12; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; COLOR: #00FF12; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; COLOR: #00FF12; FONT-SIZE: 12px}
INPUT {
BORDER-TOP-COLOR: #00FF12;
BORDER-LEFT-COLOR: #00FF12;
BORDER-RIGHT-COLOR: #00FF12;
BORDER-BOTTOM-COLOR: #00FF12;
BORDER-TOP-WIDTH: 1px;
BORDER-LEFT-WIDTH: 1px;
BORDER-RIGHT-WIDTH: 1px;
BORDER-BOTTOM-WIDTH: 1px;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana,Helvetica;
background-color: #6E6E6E;
COLOR: #00FF12;
}
TEXTAREA {
BORDER-TOP-COLOR: #00FF12;
BORDER-LEFT-COLOR: #00FF12;
BORDER-RIGHT-COLOR: #00FF12;
BORDER-BOTTOM-COLOR: #00FF12;
BORDER-TOP-WIDTH: 2px;
BORDER-LEFT-WIDTH: 2px;
FONT-SIZE: 12px;
BORDER-BOTTOM-WIDTH: 1px;
FONT-FAMILY: Verdana,Helvetica;
BORDER-RIGHT-WIDTH: 2px;
background-color: #6E6E6E;
COLOR: #00FF12;
}
SELECT {
BORDER-TOP-COLOR: #00FF12;
BORDER-LEFT-COLOR: #00FF12;
BORDER-RIGHT-COLOR: #00FF12;
BORDER-BOTTOM-COLOR: #00FF12;
BORDER-TOP-WIDTH: 1px;
BORDER-LEFT-WIDTH: 1px;
FONT-SIZE: 12px;
BORDER-BOTTOM-WIDTH: 1px;
FONT-FAMILY: Verdana,Helvetica;
BORDER-RIGHT-WIDTH: 1px;
background-color: #6E6E6E;
COLOR: #00FF12;
}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #00FF12; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #A3FFA9; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #00FF12; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #A3FFA9; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #00FF12; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #ffffff; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/themes/glass/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/glass/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glass/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#606E7C";
$cfg["table_data_bg"] = "#E5F4FB";
$cfg["table_border_dk"] = "#B3C6D0";
$cfg["table_header_bg"] = "#B3C6D0";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#E1F5FF";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#A5E1FE";
$cfg["bgDark"] = "#83D5FD";
 
?>
/web/kaklik's_web/torrentflux/themes/glass/style.css
0,0 → 1,32
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #5A646D; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #5A646D; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #5A646D; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/themes/glyphic/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/glyphic/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/glyphic/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#606060";
$cfg["table_data_bg"] = "#EEEEEE";
$cfg["table_border_dk"] = "#808080";
$cfg["table_header_bg"] = "#c0c0c0";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#DDDDDD";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#ececec";
$cfg["bgDark"] = "#c8c8c8";
 
?>
/web/kaklik's_web/torrentflux/themes/glyphic/style.css
0,0 → 1,33
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #ffffff; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
 
/web/kaklik's_web/torrentflux/themes/hornet/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/hornet/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/images/torrents.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/hornet/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#888777";
$cfg["table_data_bg"] = "#FCF8D8";
$cfg["table_border_dk"] = "#919100";
$cfg["table_header_bg"] = "#b5b56a";
$cfg["table_admin_border"] = "#ffffff";
$cfg["body_data_bg"] = "#e4e4c9";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#ececec";
$cfg["bgDark"] = "#c8c8c8";
 
?>
/web/kaklik's_web/torrentflux/themes/hornet/style.css
0,0 → 1,27
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #ffffff; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
/web/kaklik's_web/torrentflux/themes/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/mape/images/Thumbs.db
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/mape/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mape/index.php
0,0 → 1,14
<?PHP
 
$cfg["main_bgcolor"] = "#D9D8D8";
$cfg["table_data_bg"] = "#F6F6F6";
$cfg["table_border_dk"] = "#EFEFEF";
$cfg["table_header_bg"] = "#EFEFEF";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#EFEFEF";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#EAEAEA";
$cfg["bgDark"] = "#E2E2E2";
 
?>
/web/kaklik's_web/torrentflux/themes/mape/style.css
0,0 → 1,198
TD {
FONT-FAMILY: Verdana,Helvetica;
FONT-SIZE: 12px;
border: 0px;
}
 
P {
FONT-FAMILY: Verdana,Helvetica;
}
 
DIV {
FONT-FAMILY: Verdana,Helvetica;
FONT-SIZE: 12px;
}
 
INPUT {
BORDER:1px solid #999;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana,Helvetica;
}
 
TEXTAREA {
BORDER:1px solid #333;
FONT-SIZE: 12px;
BORDER-BOTTOM-WIDTH: 1px;
FONT-FAMILY: Verdana,Helvetica;
BORDER-RIGHT-WIDTH: 1px
}
 
SELECT {
FONT-SIZE: 12px;
BORDER-BOTTOM-WIDTH: 1px;
FONT-FAMILY: Verdana,Helvetica;
BORDER-RIGHT-WIDTH: 1px
}
 
FORM {
FONT-FAMILY: Verdana,Helvetica;
FONT-SIZE: 12px
}
 
A:link {
BACKGROUND: none;
COLOR: #363636;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: underline
}
 
A:active {
BACKGROUND: none;
COLOR: #363636;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: underline
}
 
A:visited {
BACKGROUND: none;
COLOR: #363636;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: underline
}
 
A:hover {
BACKGROUND: none;
COLOR: #888;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: underline
}
 
.titleblack {
BACKGROUND: none;
COLOR: #000000;
FONT-SIZE: 14px;
FONT-WEIGHT: bold;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: none
}
 
.content {
BACKGROUND: none;
COLOR: #000000;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Helvetica
}
 
.block-title {
BACKGROUND: none;
COLOR: #FFFFFF;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Helvetica
}
 
.storytitle {
BACKGROUND: none;
COLOR: #363636;
FONT-SIZE: 12px;
FONT-WEIGHT: bold;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: none
}
 
.storycat {
BACKGROUND: none;
COLOR: #363636;
FONT-SIZE: 12px;
FONT-WEIGHT: bold;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: underline
}
 
.boxtitle {
BACKGROUND: none;
COLOR: #363636;
FONT-SIZE: 12px;
FONT-WEIGHT: bold;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: none
}
 
.boxcontent {
BACKGROUND: none;
COLOR: #000000;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Helvetica
}
 
.option {
BACKGROUND: none;
COLOR: #000000;
FONT-SIZE: 12px;
FONT-WEIGHT: bold;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: none
}
 
.tiny {
COLOR: #000000;
FONT-SIZE: 9px;
FONT-WEIGHT: normal;
FONT-FAMILY: Verdana, Helvetica;
}
 
.tinywhite {
COLOR: #333;
FONT-SIZE: 10px;
FONT-WEIGHT: bold;
TEXT-DECORATION: none;
}
.tinywhite {
COLOR: #333;
FONT-SIZE: 10px;
FONT-WEIGHT: bold;
TEXT-DECORATION: none;
}
.tinyunderline {
BACKGROUND: none;
COLOR: #000000;
FONT-SIZE: 9px;
FONT-WEIGHT: normal;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: underline
}
 
.title {
FONT-FAMILY: Verdana,Helvetica;
FONT-WEIGHT: bold;
COLOR: #666;
FONT-SIZE: 12px
}
 
.adminlink {
BACKGROUND: none;
COLOR: #5A646D;
FONT-SIZE: 12px;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: underline
}
 
.tinypercent {
BACKGROUND: none;
COLOR: #5A646D;
FONT-SIZE: 9px;
FONT-WEIGHT: normal;
FONT-FAMILY: Verdana, Helvetica;
TEXT-DECORATION: none
}
 
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
 
 
/web/kaklik's_web/torrentflux/themes/matrix/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/matrix/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#606060";
$cfg["table_data_bg"] = "#EEEEEE";
$cfg["table_border_dk"] = "#808080";
$cfg["table_header_bg"] = "#c0c0c0";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#DDDDDD";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#ececec";
$cfg["bgDark"] = "#c8c8c8";
 
?>
/web/kaklik's_web/torrentflux/themes/matrix/style.css
0,0 → 1,32
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #ffffff; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/matrix_chinese/index.php
0,0 → 1,14
<?PHP
 
$cfg["main_bgcolor"] = "#606060";
$cfg["table_data_bg"] = "#EEEEEE";
$cfg["table_border_dk"] = "#808080";
$cfg["table_header_bg"] = "#c0c0c0";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#DDDDDD";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#ececec";
$cfg["bgDark"] = "#c8c8c8";
 
?>
/web/kaklik's_web/torrentflux/themes/matrix_chinese/style.css
0,0 → 1,27
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #ffffff; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
/web/kaklik's_web/torrentflux/themes/midnight/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/midnight/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/midnight/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#000000";
$cfg["table_data_bg"] = "#000000";
$cfg["table_border_dk"] = "#0802FF";
$cfg["table_header_bg"] = "#0602AA";
$cfg["table_admin_border"] = "#0802FF";
$cfg["body_data_bg"] = "#000000";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#3547BA";
$cfg["bgDark"] = "#011BB6";
 
?>
/web/kaklik's_web/torrentflux/themes/midnight/style.css
0,0 → 1,32
FONT {FONT-FAMILY: Verdana,Helvetica; COLOR: #02CCFF; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; COLOR: #02CCFF; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; COLOR: #02CCFF; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; COLOR: #02CCFF; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; COLOR: #02CCFF; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #02CCFF; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #FFFFFF; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/themes/minimal/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/minimal/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/minimal/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#000000";
$cfg["table_data_bg"] = "#eaeaea";
$cfg["table_border_dk"] = "#b4b4b4";
$cfg["table_header_bg"] = "#b4b4b4";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#b4b4b4";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#eaeaea";
$cfg["bgDark"] = "#d8d8d8";
 
?>
/web/kaklik's_web/torrentflux/themes/minimal/style.css
0,0 → 1,32
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 10px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 10px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 10px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 10px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 10px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 10px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 10px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 10px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 10px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: normal; COLOR: #000000; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/themes/mint/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/mint/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/images/torrents.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/mint/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#2f5e5e";
$cfg["table_data_bg"] = "#e2f1f1";
$cfg["table_border_dk"] = "#366d6d";
$cfg["table_header_bg"] = "#63b1b1";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#c7e2e2";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#e2f1f1";
$cfg["bgDark"] = "#a0cfcf";
 
?>
/web/kaklik's_web/torrentflux/themes/mint/style.css
0,0 → 1,32
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #ffffff; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/themes/rust/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/rust/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/rust/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#69583D";
$cfg["table_data_bg"] = "#FFF1BA";
$cfg["table_border_dk"] = "#724D33";
$cfg["table_header_bg"] = "#E9A876";
$cfg["table_admin_border"] = "#724D33";
$cfg["body_data_bg"] = "#BB753E";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#FFFFCF";
$cfg["bgDark"] = "#FFDEA7";
 
?>
/web/kaklik's_web/torrentflux/themes/rust/style.css
0,0 → 1,32
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #724D33; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #724D33; FONT-WEIGHT: bold; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/themes/slate/images/admin.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/bar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/directory.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/history.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/home.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/index.html
0,0 → 1,0
<html></html>
/web/kaklik's_web/torrentflux/themes/slate/images/messages_off.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/messages_on.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/noglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/profile.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/proglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/images/progressbar.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/web/kaklik's_web/torrentflux/themes/slate/index.php
0,0 → 1,14
<?php
 
$cfg["main_bgcolor"] = "#606E7C";
$cfg["table_data_bg"] = "#ECEFF1";
$cfg["table_border_dk"] = "#98ADC2";
$cfg["table_header_bg"] = "#98ADC2";
$cfg["table_admin_border"] = "#FFFFFF";
$cfg["body_data_bg"] = "#ECEFF1";
 
// Directory alternating colors for dir.php
$cfg["bgLight"] = "#E4E7E9";
$cfg["bgDark"] = "#D8DCDE";
 
?>
/web/kaklik's_web/torrentflux/themes/slate/style.css
0,0 → 1,32
FONT {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
TD {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
BODY {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
P {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
DIV {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
INPUT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
TEXTAREA {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
SELECT {BORDER-TOP-COLOR: #000000; BORDER-LEFT-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 1px; FONT-FAMILY: Verdana,Helvetica; BORDER-RIGHT-WIDTH: 1px}
FORM {FONT-FAMILY: Verdana,Helvetica; FONT-SIZE: 12px}
A:link {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:active {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:visited {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
A:hover {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.titleblack {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 14px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.content {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.block-title {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.storytitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.storycat {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.boxtitle {BACKGROUND: none; COLOR: #363636; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.boxcontent {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica}
.option {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tiny {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinywhite {BACKGROUND: none; COLOR: #ffffff; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.tinyunderline {BACKGROUND: none; COLOR: #000000; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.title {FONT-FAMILY: Verdana,Helvetica; FONT-WEIGHT: bold; COLOR: #FFFFFF; FONT-SIZE: 12px}
.adminlink {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: underline}
.tinypercent {BACKGROUND: none; COLOR: #FFFFFF; FONT-SIZE: 9px; FONT-WEIGHT: normal; FONT-FAMILY: Verdana, Helvetica; TEXT-DECORATION: none}
.bg { border: 0px outset #E6E6E6; background-color:#606060; }
.fg { border: 0px outset #E6E6E6; background-color:#ffffff; }
.overCaption {font-family:arial; color:#ffffff; font-size:9pt; font-weight:bold;}
.overClose {font-family:arial; background:#E6E6E6; color:#000000; font-size:9pt; font-weight:bold;}
.overBody {font-family:arial; background:#ffffff; font-size:9pt; font-weight:normal;}
/web/kaklik's_web/torrentflux/tooltip.js
0,0 → 1,464
/* This notice must be untouched at all times.
 
wz_tooltip.js v. 3.31
 
The latest version is available at
http://www.walterzorn.com
or http://www.devira.com
or http://www.walterzorn.de
 
Copyright (c) 2002-2004 Walter Zorn. All rights reserved.
Created 1. 12. 2002 by Walter Zorn (Web: http://www.walterzorn.com )
Last modified: 22. 6. 2005
 
Cross-browser tooltips working even in Opera 5 and 6,
as well as in NN 4, Gecko-Browsers, IE4+, Opera 7 and Konqueror.
No onmouseouts required.
Appearance of tooltips can be individually configured
via commands within the onmouseovers.
 
LICENSE: LGPL
 
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License (LGPL) as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
 
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
For more details on the GNU Lesser General Public License,
see http://www.gnu.org/copyleft/lesser.html
*/
 
 
 
//////////////// GLOBAL TOOPTIP CONFIGURATION /////////////////////
 
var ttBgColor = "#FFFFE7";
var ttBgImg = ""; //images/help.gif"; // path to background image;
var ttBorderColor = "#000000";
var ttBorderWidth = 1;
var ttDelay = 250; // time span until tooltip shows up [milliseconds]
var ttFontColor = "#000000";
var ttFontFace = "verdana,arial,helvetica,sans-serif";
var ttFontSize = "12px";
var ttFontWeight = "normal"; // alternative is "bold";
var ttOffsetX = 12; // horizontal offset of left-top corner from mousepointer
var ttOffsetY = 15; // vertical offset "
var ttOpacity = 100; // opacity of tooltip in percent (must be integer between 0 and 100)
var ttPadding = 3; // spacing between border and content
var ttShadowColor = "#808080";
var ttShadowWidth = 3;
var ttTemp = 0; // time span after which the tooltip disappears; 0 (zero) means "infinite timespan"
var ttTextAlign = "left";
var ttTitleColor = "#ffffff"; // color of caption text
var ttWidth = 350;
//////////////////// END OF TOOLTIP CONFIG ////////////////////////
 
 
 
////////////// TAGS WITH TOOLTIP FUNCTIONALITY ////////////////////
// List may be extended or shortened:
var tt_tags = new Array("a","area","b","big","caption","center","code","dd","div","dl","dt","em","h1","h2","h3","h4","h5","h6","i","img","input","li","map","ol","p","pre","s","small","span","strike","strong","sub","sup","table","td","th","tr","tt","u","var","ul","layer");
/////////////////////////////////////////////////////////////////////
 
 
 
///////// DON'T CHANGE ANYTHING BELOW THIS LINE /////////////////////
var tt_obj, // current tooltip
tt_ifrm, // iframe to cover windowed controls in IE
tt_objW = 0, tt_objH = 0, // width and height of tt_obj
tt_objX = 0, tt_objY = 0,
tt_offX = 0, tt_offY = 0,
xlim = 0, ylim = 0, // right and bottom borders of visible client area
tt_sup = false, // true if T_ABOVE cmd
tt_sticky = false, // tt_obj sticky?
tt_wait = false,
tt_act = false, // tooltip visibility flag
tt_sub = false, // true while tooltip below mousepointer
tt_u = "undefined",
tt_mf, // stores previous mousemove evthandler
// Opera: disable href when hovering <a>
tt_tag = null; // stores hovered dom node, href and previous statusbar txt
 
 
var tt_db = (document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body? document.body : null,
tt_n = navigator.userAgent.toLowerCase(),
tt_nv = navigator.appVersion;
// Browser flags
var tt_op = !!(window.opera && document.getElementById),
tt_op6 = tt_op && !document.defaultView,
tt_op7 = tt_op && !tt_op6,
tt_ie = tt_n.indexOf("msie") != -1 && document.all && tt_db && !tt_op,
tt_ie6 = tt_ie && parseFloat(tt_nv.substring(tt_nv.indexOf("MSIE")+5)) >= 5.5;
tt_n4 = (document.layers && typeof document.classes != tt_u),
tt_n6 = (!tt_op && document.defaultView && typeof document.defaultView.getComputedStyle != tt_u),
tt_w3c = !tt_ie && !tt_n6 && !tt_op && document.getElementById;
 
function tt_Int(t_x)
{
var t_y;
return isNaN(t_y = parseInt(t_x))? 0 : t_y;
}
function wzReplace(t_x, t_y)
{
var t_ret = "",
t_str = this,
t_xI;
while((t_xI = t_str.indexOf(t_x)) != -1)
{
t_ret += t_str.substring(0, t_xI) + t_y;
t_str = t_str.substring(t_xI + t_x.length);
}
return t_ret+t_str;
}
String.prototype.wzReplace = wzReplace;
function tt_N4Tags(tagtyp, t_d, t_y)
{
t_d = t_d || document;
t_y = t_y || new Array();
var t_x = (tagtyp=="a")? t_d.links : t_d.layers;
for(var z = t_x.length; z--;) t_y[t_y.length] = t_x[z];
for(z = t_d.layers.length; z--;) t_y = tt_N4Tags(tagtyp, t_d.layers[z].document, t_y);
return t_y;
}
function tt_Htm(tt, t_id, txt)
{
var t_bgc = (typeof tt.T_BGCOLOR != tt_u)? tt.T_BGCOLOR : ttBgColor,
t_bgimg = (typeof tt.T_BGIMG != tt_u)? tt.T_BGIMG : ttBgImg,
t_bc = (typeof tt.T_BORDERCOLOR != tt_u)? tt.T_BORDERCOLOR : ttBorderColor,
t_bw = (typeof tt.T_BORDERWIDTH != tt_u)? tt.T_BORDERWIDTH : ttBorderWidth,
t_ff = (typeof tt.T_FONTFACE != tt_u)? tt.T_FONTFACE : ttFontFace,
t_fc = (typeof tt.T_FONTCOLOR != tt_u)? tt.T_FONTCOLOR : ttFontColor,
t_fsz = (typeof tt.T_FONTSIZE != tt_u)? tt.T_FONTSIZE : ttFontSize,
t_fwght = (typeof tt.T_FONTWEIGHT != tt_u)? tt.T_FONTWEIGHT : ttFontWeight,
t_opa = (typeof tt.T_OPACITY != tt_u)? tt.T_OPACITY : ttOpacity,
t_padd = (typeof tt.T_PADDING != tt_u)? tt.T_PADDING : ttPadding,
t_shc = (typeof tt.T_SHADOWCOLOR != tt_u)? tt.T_SHADOWCOLOR : (ttShadowColor || 0),
t_shw = (typeof tt.T_SHADOWWIDTH != tt_u)? tt.T_SHADOWWIDTH : (ttShadowWidth || 0),
t_algn = (typeof tt.T_TEXTALIGN != tt_u)? tt.T_TEXTALIGN : ttTextAlign,
t_tit = (typeof tt.T_TITLE != tt_u)? tt.T_TITLE : "",
t_titc = (typeof tt.T_TITLECOLOR != tt_u)? tt.T_TITLECOLOR : ttTitleColor,
t_w = (typeof tt.T_WIDTH != tt_u)? tt.T_WIDTH : ttWidth;
if (t_shc || t_shw)
{
t_shc = t_shc || "#cccccc";
t_shw = t_shw || 5;
}
if (tt_n4 && (t_fsz == "10px" || t_fsz == "11px")) t_fsz = "12px";
 
var t_optx = (tt_n4? '' : tt_n6? ('-moz-opacity:'+(t_opa/100.0)) : tt_ie? ('filter:Alpha(opacity='+t_opa+')') : ('opacity:'+(t_opa/100.0))) + ';';
var t_y = '<div id="'+t_id+'" style="position:absolute;z-index:1010;';
t_y += 'left:0px;top:0px;width:'+(t_w+t_shw)+'px;visibility:'+(tt_n4? 'hide' : 'hidden')+';'+t_optx+'">' +
'<table border="0" cellpadding="0" cellspacing="0"'+(t_bc? (' bgcolor="'+t_bc+'"') : '')+' width="'+t_w+'">';
if (t_tit)
{
t_y += '<tr><td style="padding-left:3px;padding-right:3px;" align="'+t_algn+'"><font color="'+t_titc+'" face="'+t_ff+'" ' +
'style="color:'+t_titc+';font-family:'+t_ff+';font-size:'+t_fsz+';"><b>' +
(tt_n4? '&nbsp;' : '')+t_tit+'<\/b><\/font><\/td><\/tr>';
}
t_y += '<tr><td><table border="0" cellpadding="'+t_padd+'" cellspacing="'+t_bw+'" width="100%">' +
// added padding-left:30px;
'<tr><td'+(t_bgc? (' bgcolor="'+t_bgc+'"') : '')+(t_bgimg? ' background="'+t_bgimg+'"' : '')+' style="padding-left:15px;text-align:'+t_algn+';';
// if (tt_n6) t_y += 'padding:'+t_padd+'px;';
t_y += '" align="'+t_algn+'"><font color="'+t_fc+'" face="'+t_ff+'"' +
' style="color:'+t_fc+';font-family:'+t_ff+';font-size:'+t_fsz+';font-weight:'+t_fwght+';">';
if (t_fwght == 'bold') t_y += '<b>';
t_y += txt;
if (t_fwght == 'bold') t_y += '<\/b>';
t_y += '<\/font><\/td><\/tr><\/table><\/td><\/tr><\/table>';
if (t_shw)
{
var t_spct = Math.round(t_shw*1.3);
if (tt_n4)
{
t_y += '<layer bgcolor="'+t_shc+'" left="'+t_w+'" top="'+t_spct+'" width="'+t_shw+'" height="0"><\/layer>' +
'<layer bgcolor="'+t_shc+'" left="'+t_spct+'" align="bottom" width="'+(t_w-t_spct)+'" height="'+t_shw+'"><\/layer>';
}
else
{
t_optx = tt_n6? '-moz-opacity:0.85;' : tt_ie? 'filter:Alpha(opacity=85);' : 'opacity:0.85;';
t_y += '<div id="'+t_id+'R" style="position:absolute;background:'+t_shc+';left:'+t_w+'px;top:'+t_spct+'px;width:'+t_shw+'px;height:1px;overflow:hidden;'+t_optx+'"><\/div>' +
'<div style="position:relative;background:'+t_shc+';left:'+t_spct+'px;top:0px;width:'+(t_w-t_spct)+'px;height:'+t_shw+'px;overflow:hidden;'+t_optx+'"><\/div>';
}
}
return(t_y+'<\/div>' +
(tt_ie ? '<iframe id="TTiEiFrM" src="javascript:false" scrolling="no" frameborder="0" style="filter:Alpha(opacity=0);position:absolute;top:0px;left:0px;display:none;"><\/iframe>' : ''));
}
function tt_EvX(t_e)
{
var t_y = tt_Int(t_e.pageX || t_e.clientX || 0) +
tt_Int(tt_ie? tt_db.scrollLeft : 0) +
tt_offX;
if (t_y > xlim) t_y = xlim;
var t_scr = tt_Int(window.pageXOffset || (tt_db? tt_db.scrollLeft : 0) || 0);
if (t_y < t_scr) t_y = t_scr;
return t_y;
}
function tt_EvY(t_e)
{
var t_y = tt_Int(t_e.pageY || t_e.clientY || 0) +
tt_Int(tt_ie? tt_db.scrollTop : 0);
if (tt_sup) t_y -= (tt_objH + tt_offY - 15);
else if (t_y > ylim || !tt_sub && t_y > ylim-24)
{
t_y -= (tt_objH + 5);
tt_sub = false;
}
else
{
t_y += tt_offY;
tt_sub = true;
}
return t_y;
}
function tt_ReleasMov()
{
if (document.onmousemove == tt_Move)
{
if (!tt_mf && document.releaseEvents) document.releaseEvents(Event.MOUSEMOVE);
document.onmousemove = tt_mf;
}
}
function tt_ShowIfrm(t_x)
{
if (!tt_ie6 || !tt_obj) return;
tt_ifrm = document.getElementById("TTiEiFrM");
//tt_obj.style.display = t_x? "block" : "none";
if (t_x)
{
tt_ifrm.style.width = tt_objW+'px';
tt_ifrm.style.height = tt_objH+'px';
tt_ifrm.style.zIndex = tt_obj.style.zIndex - 1;
tt_ifrm.style.display = "block";
}
else tt_ifrm.style.display = "none";
}
function tt_GetDiv(t_id)
{
return(
tt_n4? (document.layers[t_id] || null)
: tt_ie? (document.all[t_id] || null)
: (document.getElementById(t_id) || null)
);
}
function tt_GetDivW()
{
return tt_Int(
tt_n4? tt_obj.clip.width
: (tt_obj.style.pixelWidth || tt_obj.offsetWidth)
);
}
function tt_GetDivH()
{
return tt_Int(
tt_n4? tt_obj.clip.height
: (tt_obj.style.pixelHeight || tt_obj.offsetHeight)
);
}
 
// Compat with DragDrop Lib: Ensure that z-index of tooltip is lifted beyond toplevel dragdrop element
function tt_SetDivZ()
{
var t_i = tt_obj.style || tt_obj;
if (window.dd && dd.z)
t_i.zIndex = Math.max(dd.z+1, t_i.zIndex);
}
function tt_SetDivPos(t_x, t_y)
{
var t_i = tt_obj.style || tt_obj;
var t_px = (tt_op6 || tt_n4)? '' : 'px';
t_i.left = (tt_objX = t_x) + t_px;
t_i.top = (tt_objY = t_y) + t_px;
if (tt_ifrm)
{
tt_ifrm.style.left = t_i.left;
tt_ifrm.style.top = t_i.top;
}
}
function tt_ShowDiv(t_x)
{
if (tt_n4) tt_obj.visibility = t_x? 'show' : 'hide';
else tt_obj.style.visibility = t_x? 'visible' : 'hidden';
tt_act = t_x;
tt_ShowIfrm(t_x);
}
function tt_OpDeHref(t_e)
{
if (t_e && t_e.target.hasAttribute("href"))
{
tt_tag = t_e.target;
tt_tag.t_href = tt_tag.getAttribute("href");
tt_tag.removeAttribute("href");
tt_tag.style.cursor = "hand";
tt_tag.onmousedown = tt_OpReHref;
tt_tag.stats = window.status;
window.status = tt_tag.t_href;
}
}
function tt_OpReHref()
{
if (tt_tag)
{
tt_tag.setAttribute("href", tt_tag.t_href);
window.status = tt_tag.stats;
tt_tag = null;
}
}
function tt_Show(t_e, t_id, t_sup, t_delay, t_fix, t_left, t_offx, t_offy, t_static, t_sticky, t_temp)
{
if (tt_obj) tt_Hide();
tt_mf = document.onmousemove || null;
if (window.dd && (window.DRAG && tt_mf == DRAG || window.RESIZE && tt_mf == RESIZE)) return;
var t_uf = document.onmouseup || null, t_sh, t_h;
if (tt_mf && t_uf) t_uf(t_e);
 
tt_obj = tt_GetDiv(t_id);
if (tt_obj)
{
t_e = t_e || window.event;
tt_sub = !(tt_sup = t_sup);
tt_sticky = t_sticky;
tt_objW = tt_GetDivW();
tt_objH = tt_GetDivH();
tt_offX = t_left? -(tt_objW+t_offx) : t_offx;
tt_offY = t_offy;
if (tt_op7) tt_OpDeHref(t_e);
if (tt_n4)
{
if (tt_obj.document.layers.length)
{
t_sh = tt_obj.document.layers[0];
t_sh.clip.height = tt_objH - Math.round(t_sh.clip.width*1.3);
}
}
else
{
t_sh = tt_GetDiv(t_id+'R');
if (t_sh)
{
t_h = tt_objH - tt_Int(t_sh.style.pixelTop || t_sh.style.top || 0);
if (typeof t_sh.style.pixelHeight != tt_u) t_sh.style.pixelHeight = t_h;
else t_sh.style.height = t_h+'px';
}
}
 
xlim = tt_Int((tt_db && tt_db.clientWidth)? tt_db.clientWidth : window.innerWidth) +
tt_Int(window.pageXOffset || (tt_db? tt_db.scrollLeft : 0) || 0) -
tt_objW -
(tt_n4? 21 : 0);
ylim = tt_Int(window.innerHeight || tt_db.clientHeight) +
tt_Int(window.pageYOffset || (tt_db? tt_db.scrollTop : 0) || 0) -
tt_objH - tt_offY;
 
tt_SetDivZ();
if (t_fix) tt_SetDivPos(tt_Int((t_fix = t_fix.split(','))[0]), tt_Int(t_fix[1]));
else tt_SetDivPos(tt_EvX(t_e), tt_EvY(t_e));
 
var t_txt = 'tt_ShowDiv(\'true\');';
if (t_sticky) t_txt += '{'+
'tt_ReleasMov();'+
'window.tt_upFunc = document.onmouseup || null;'+
'if (document.captureEvents) document.captureEvents(Event.MOUSEUP);'+
'document.onmouseup = new Function("window.setTimeout(\'tt_Hide();\', 10);");'+
'}';
else if (t_static) t_txt += 'tt_ReleasMov();';
if (t_temp > 0) t_txt += 'window.tt_rtm = window.setTimeout(\'tt_sticky = false; tt_Hide();\','+t_temp+');';
window.tt_rdl = window.setTimeout(t_txt, t_delay);
 
if (!t_fix)
{
if (document.captureEvents) document.captureEvents(Event.MOUSEMOVE);
document.onmousemove = tt_Move;
}
}
}
var tt_area = false;
function tt_Move(t_ev)
{
if (!tt_obj) return;
if (tt_n6 || tt_w3c)
{
if (tt_wait) return;
tt_wait = true;
setTimeout('tt_wait = false;', 5);
}
var t_e = t_ev || window.event;
tt_SetDivPos(tt_EvX(t_e), tt_EvY(t_e));
if (tt_op6)
{
if (tt_area && t_e.target.tagName != 'AREA') tt_Hide();
else if (t_e.target.tagName == 'AREA') tt_area = true;
}
}
function tt_Hide()
{
if (window.tt_obj)
{
if (window.tt_rdl) window.clearTimeout(tt_rdl);
if (!tt_sticky || !tt_act)
{
if (window.tt_rtm) window.clearTimeout(tt_rtm);
tt_ShowDiv(false);
tt_SetDivPos(-tt_objW, -tt_objH);
tt_obj = null;
if (typeof window.tt_upFunc != tt_u) document.onmouseup = window.tt_upFunc;
}
tt_sticky = false;
if (tt_op6 && tt_area) tt_area = false;
tt_ReleasMov();
if (tt_op7) tt_OpReHref();
}
}
function tt_Init()
{
if (!(tt_op || tt_n4 || tt_n6 || tt_ie || tt_w3c)) return;
 
var htm = tt_n4? '<div style="position:absolute;"><\/div>' : '',
tags,
t_tj,
over,
esc = 'return escape(';
var i = tt_tags.length; while(i--)
{
tags = tt_ie? (document.all.tags(tt_tags[i]) || 1)
: document.getElementsByTagName? (document.getElementsByTagName(tt_tags[i]) || 1)
: (!tt_n4 && tt_tags[i]=="a")? document.links
: 1;
if (tt_n4 && (tt_tags[i] == "a" || tt_tags[i] == "layer")) tags = tt_N4Tags(tt_tags[i]);
var j = tags.length; while(j--)
{
if (typeof (t_tj = tags[j]).onmouseover == "function" && t_tj.onmouseover.toString().indexOf(esc) != -1 && !tt_n6 || tt_n6 && (over = t_tj.getAttribute("onmouseover")) && over.indexOf(esc) != -1)
{
if (over) t_tj.onmouseover = new Function(over);
var txt = unescape(t_tj.onmouseover());
htm += tt_Htm(
t_tj,
"tOoLtIp"+i+""+j,
txt.wzReplace("& ","&")
);
 
t_tj.onmouseover = new Function('e',
'tt_Show(e,'+
'"tOoLtIp' +i+''+j+ '",'+
(typeof t_tj.T_ABOVE != tt_u)+','+
((typeof t_tj.T_DELAY != tt_u)? t_tj.T_DELAY : ttDelay)+','+
((typeof t_tj.T_FIX != tt_u)? '"'+t_tj.T_FIX+'"' : '""')+','+
(typeof t_tj.T_LEFT != tt_u)+','+
((typeof t_tj.T_OFFSETX != tt_u)? t_tj.T_OFFSETX : ttOffsetX)+','+
((typeof t_tj.T_OFFSETY != tt_u)? t_tj.T_OFFSETY : ttOffsetY)+','+
(typeof t_tj.T_STATIC != tt_u)+','+
(typeof t_tj.T_STICKY != tt_u)+','+
((typeof t_tj.T_TEMP != tt_u)? t_tj.T_TEMP : ttTemp)+
');'
);
t_tj.onmouseout = tt_Hide;
if (t_tj.alt) t_tj.alt = "";
if (t_tj.title) t_tj.title = "";
}
}
}
document.write(htm);
}
/web/kaklik's_web/torrentflux/torrentSearch.php
0,0 → 1,196
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
include_once("searchEngines/SearchEngineBase.php");
 
// Go get the if this is a search request. go get the data and produce output.
 
$hideSeedless = getRequestVar('hideSeedless');
if(!empty($hideSeedless))
{
$_SESSION['hideSeedless'] = $hideSeedless;
}
 
if (!isset($_SESSION['hideSeedless']))
{
$_SESSION['hideSeedless'] = 'no';
}
 
$hideSeedless = $_SESSION['hideSeedless'];
 
$pg = getRequestVar('pg');
 
$searchEngine = getRequestVar('searchEngine');
if (empty($searchEngine)) $searchEngine = $cfg["searchEngine"];
 
$searchterm = getRequestVar('searchterm');
if(empty($searchterm))
$searchterm = getRequestVar('query');
 
$searchterm = str_replace(" ", "+",$searchterm);
 
// Check to see if there was a searchterm.
// if not set the get latest flag.
if (strlen($searchterm) == 0)
{
if (! array_key_exists("LATEST",$_REQUEST))
{
$_REQUEST["LATEST"] = "1";
}
}
 
DisplayHead("TorrentSearch "._SEARCH);
 
echo "<style>.tinyRow {font-size:2px;height:2px;}</style>";
 
// Display the search box
echo "<a name=\"top\"></a><div align=\"center\">";
echo "<table border=1 cellspacing=0 width=\"760\" cellpadding=5><tr>";
echo "<td bgcolor=\"".$cfg["table_header_bg"]."\">";
echo "<form id=\"searchForm\" name=\"searchForm\" action=\"torrentSearch.php\" method=\"get\">";
echo _SEARCH." Torrents:<br>";
echo "<input type=\"text\" name=\"searchterm\" value=\"".str_replace("+", " ",$searchterm)."\" size=30 maxlength=50>&nbsp;";
echo buildSearchEngineDDL($searchEngine);
echo "&nbsp;<input type=\"Submit\" value=\""._SEARCH."\">&nbsp;&nbsp;";
echo "\n<script language=\"JavaScript\">\n";
echo " function getLatest()\n";
echo " {\n";
echo " var selectedItem = document.searchForm.searchEngine.selectedIndex;\n";
echo " document.searchForm.searchterm.value = '';\n";
echo " document.location.href = 'torrentSearch.php?searchEngine='+document.searchForm.searchEngine.options[selectedItem].value+'&LATEST=1';\n";
echo " return true;\n";
echo " }\n";
echo "</script>\n";
 
echo "&nbsp;&nbsp;<a href=\"#\" onclick=\"javascript:getLatest()\");\"><img src=\"images/properties.png\" width=18 height=13 title=\"Show Latest Torrents\" align=\"absmiddle\" border=0>Show Latest Torrents</a>";
 
echo "</form>";
echo "* Click on Torrent Links to add them to the Torrent Download List";
echo "</td>";
 
echo "</td><td bgcolor=\"".$cfg["table_header_bg"]."\" align=right valign=top>Visit: &nbsp; &nbsp;".buildSearchEngineLinks($searchEngine). "</td></tr>";
 
if (is_file('searchEngines/'.$searchEngine.'Engine.php'))
{
include_once('searchEngines/'.$searchEngine.'Engine.php');
$sEngine = new SearchEngine(serialize($cfg));
if ($sEngine->initialized)
{
echo "<div align=center valign=top>";
 
$mainStart = true;
 
$catLinks = '';
$tmpCatLinks = '';
$tmpLen = 0;
foreach ($sEngine->getMainCategories() as $mainId => $mainName)
{
if (strlen($tmpCatLinks) >= 500 && $mainStart == false)
{
$catLinks .= $tmpCatLinks . "<br>";
$tmpCatLinks = '';
$mainStart = true;
}
if ($mainStart == false) $tmpCatLinks .= " | ";
$tmpCatLinks .= "<a href=\"torrentSearch.php?searchEngine=".$searchEngine."&mainGenre=".$mainId."\">".$mainName."</a>";
$mainStart = false;
}
 
echo $catLinks . $tmpCatLinks;
 
if ($mainStart == false)
{
echo "<br><br>";
}
echo "</div>";
echo "</td></tr>";
 
$mainGenre = getRequestVar('mainGenre');
 
if (!empty($mainGenre) && !array_key_exists("subGenre",$_REQUEST))
{
 
$subCats = $sEngine->getSubCategories($mainGenre);
if (count($subCats) > 0)
{
echo "<tr bgcolor=\"".$cfg["table_header_bg"]."\">";
echo "<td colspan=6><form method=get id=\"subLatest\" name=\"subLatest\" action=torrentSearch.php?>";
echo "<input type=hidden name=\"searchEngine\" value=\"".$searchEngine."\">";
 
$mainGenreName = $sEngine->GetMainCatName($mainGenre);
 
echo "Category: <b>".$mainGenreName."</a></b> -> ";
echo "<select name=subGenre>";
 
foreach ($subCats as $subId => $subName)
{
echo "<option value=".$subId.">".$subName."</option>\n";
}
echo "</select> ";
echo "<input type=submit value='Show Latest'>";
echo "</form>\n";
}
else
{
echo "</td></tr></table></div>";
// Set the Sub to equal the main for groups that don't have subs.
$_REQUEST["subGenre"] = $mainGenre;
echo $sEngine->getLatest();
}
}
else
{
echo "</td></tr></table></div>";
 
if (array_key_exists("LATEST",$_REQUEST) && $_REQUEST["LATEST"] == "1")
{
echo $sEngine->getLatest();
}
else
{
echo $sEngine->performSearch($searchterm);
}
}
}
else
{
// there was an error connecting
echo "</td></tr>";
echo "<tr><td><br><br><div align=center><strong>".$sEngine->msg."</strong></div><br><br></td></tr>";
echo "</table></div>";
}
}
else
{
// there was an error connecting
echo "</td></tr>";
echo "<tr><td><br><br><div align=center><strong>Search Engine not installed.</strong></div><br><br></td></tr>";
echo "</table></div>";
}
 
DisplayFoot();
 
?>
/web/kaklik's_web/torrentflux/viewnfo.php
0,0 → 1,53
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
// contributed by NovaKing -- thanks duder!
 
include_once("config.php");
include_once("functions.php");
 
DisplayHead("View NFO");
 
$file = $_GET["path"];
$folder = htmlspecialchars( substr( $file, 0, strrpos( $file, "/" ) ) );
 
if( ( $output = @file_get_contents( $cfg["path"] . $file ) ) === false )
$output = "Error opening NFO File.";
?>
<div align="center" style="width: 740px;">
<a href="<?php echo "viewnfo.php?path=$file&dos=1"; ?>">DOS Format</a> :-:
<a href="<?php echo "viewnfo.php?path=$file&win=1"; ?>">WIN Format</a> :-:
<a href="dir.php?dir=<?=$folder;?>">Back</a>
</div>
<pre style="font-size: 10pt; font-family: 'Courier New', monospace;">
<?php
if( ( empty( $_GET["dos"] ) && empty( $_GET["win"] ) ) || !empty( $_GET["dos"] ) )
echo htmlentities( $output, ENT_COMPAT, "cp866" );
else
echo htmlentities( $output );
?>
</pre>
<?php
DisplayFoot();
?>
/web/kaklik's_web/torrentflux/who.php
0,0 → 1,63
<?php
 
/*************************************************************
* TorrentFlux - PHP Torrent Manager
* www.torrentflux.com
**************************************************************/
/*
This file is part of TorrentFlux.
 
TorrentFlux is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
TorrentFlux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with TorrentFlux; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
include_once("config.php");
include_once("functions.php");
 
 
$result = shell_exec("w");
$result2 = shell_exec("free -mo");
 
 
DisplayHead(_SERVERSTATS);
echo "<table width=\"740\" border=0 cellpadding=0 cellspacing=0><tr><td>";
echo displayDriveSpaceBar(getDriveSpace($cfg["path"]));
echo "</td></tr></table>";
?>
 
<br>
 
<div align="left" id="BodyLayer" name="BodyLayer" style="border: thin solid <?php echo $cfg["main_bgcolor"] ?>; position:relative; width:740; height:500; padding-left: 5px; padding-right: 5px; z-index:1; overflow: scroll; visibility: visible">
 
<?php
 
echo "<pre>";
echo $result;
echo "<br><hr><br>";
echo $result2;
echo "</pre>";
 
if (IsAdmin())
{
echo "<br><hr><br>";
echo "<pre>";
RunningProcessInfo();
echo "</pre>";
}
 
echo "</div>";
 
DisplayFoot();
 
?>