Jeg fortsetter og fortsetter med iTree. Tror grunnen jeg gjør det er fordi det er et noe man kan jobbe med. Det inneholder alt nesten. Jeg bestemte meg iallefall for å ordne litt på kildekoden til php-klient-delen. Dvs lage en egen klasse. Jobbe litt OO. Være litt trendy...og ryddig ikke minst. Det har jeg ikke vært på mange år. Ryddig....har iallefall ikke skrevet OO på ei stund. Det er sikkert 10 år siden. Alt er 10 år siden om dagen så jeg lyver sikkert. 6 år kanskje. Så da må man jo ha en formening om hvorfor jeg skal lage en klasse. 

  1. Ryddig kode
  2. sikkerhet

Det er jo ikke dumt. Poenget er jo at man skal lage et objekt, gjøre en query og få et svar. Ikke skrive en hel masse tilleggsting som kanskje endrer variabler eller mister oversikt over hva man kan gjøre.

Mitt mål med dette er at man skal initiere objektet og så hente data. Det er alt.

Jeg gjorde det. Men fikk et annet problem som jeg ikke helt har funnet ut hva er. Koden fungerer når det er lagt til på nettsiden men jeg kan ikke kjøreskriptet lokalt på terminalen min på arbeids-stasjonen. Merkelige ting dette. Her er klassen iallefall:

 

class itreeClient
{
  //user input
  private $request;
  //string sent to server as a request
  public $data_request;
  //name of the data-tree we want to search.
  private $data_tree;
  public $received_data;
  private $hsocket;
  
  private function writeIData()
  {
	  $CMDIT_DATA_GET = 0x01;
	  $DT_STRING = 0x01;
	  $index = 0;
	  
	  $buf_size = strlen($this->data_request)+1;
	  //pack data into binary/hex-values."C7"=>unsigned char		
	  $data = pack("C7",$CMDIT_DATA_GET, $DT_STRING, BYTE32($buf_size),BYTE24($buf_size),BYTE16($buf_size),BYTE8($buf_size),$index);

	  $n = fwrite($this->hsocket, $data);
	  if(!$n)
	  {
		  echo "First write failed(writeIData). Data: ".$data."...var_dump: ".var_dump($n)."\n";
		  return 0;
	  }
	  else 
	  { echo "writeIData(data_request):".$this->data_request."\n"; 
		  $str = $this->data_request;
		  $n = fwrite($this->hsocket, $str);
		  if(!$n)
		  {
			  echo "Second write failed(writeIData). Data: $this->data_request...var_dump: ".var_dump($n)."\n";
			  return 0;
		  }
	  }
	  return 1;
  }
  private function readIData()
  {
	  $n = fread($this->hsocket, 7);
	  if(!$n)
	  {
		  "Reading of header-data failed...exiting: var_dump: ".var_dump($n)."\n";
		  return NULL;
	  }
	  else
	  {
		  $pd = unpack('C7', $n);//unpack the header-package	
		  //get first value
		  $response_type = $pd[1];
		  //get second value
		  $data_type = $pd[2];
		  //get ulong value-parts
		  $data_index = $pd[7];
		  $buf_size = MAKEULONG($pd[3],$pd[4],$pd[5],$pd[6]);
		  $itree_data = fread($this->hsocket, $buf_size+4);
		  
		  if(!$itree_data)
		  {
			  echo "Second read failed in readIData...buf_size: $buf_size, var_dump(n): ".var_dump($itree_data)." \n";
			  return NULL;
		  }
		  
	  }//for some reason I'm getting 1 byte more than I ask for at the begining of the data-buffer.
	  //remove it for now..
	  return substr_replace($itree_data, NULL, 0, 1);	
  }
  //constructor..setting most important stuff.
  function __construct(){ }
  ////send request for data
  public function itreeSendRq($ip, $port, $searchterm=NULL)
  {
    $this->data_tree = "then";
    $this->request = $searchterm;
    if($this->request === NULL)
    {
	    echo "Error: No point in sending NULL. Exiting script.";
	    return NULL;
    }
    $this->data_request = $this->data_tree."&".$this->request."\0";
    echo $this->data_request;
    $this->hsocket = fsockopen($ip, $port, $errno, $errstr);
    if($this->hsocket === FALSE)
    {
	    echo "Opening socket failed.\n";
	    echo "errno: $errno\n";
	    echo "error_str: $errstr\nExiting with return-value 1";
	    return NULL;
    }	
    if($this->writeIData() === NULL)
    {
	    echo "writeIData returned NULL...exiting";
	    stream_socket_shutdown($this->hsocket, STREAM_SHUT_RDWR);
	    return NULL;
    }
    $this->received_data = $this->readIData();
    if($this->received_data === NULL)
    {
	    echo "readIData returned NULL...exiting";
	    stream_socket_shutdown($this->hsocket, STREAM_SHUT_RDWR);
	    return NULL;
    }
    //echo "Received data:\n".$received_data."\n";
    stream_socket_shutdown($this->hsocket, STREAM_SHUT_RDWR);
  }
  public function GetData()
  {
    return $this->received_data;
  }
};

 

Noen variabler har blitt public, fordi jeg skulle teste og se om det hadde noe med de problemene jeg støtte borti. Det hadde ikke det. De skal være private. Som dere ser så er alle funksjoner bortsett fra GetData private. Dette har med sikkerhet å gjøre. Eneste man skal kunne gjøre med klassen er å hente data. Klassen kopler til serveren. Gjør en request og sender svar tilbake til brukeren.

Heh. Ja idag fant jeg fram gamle kildekoder og ting og tang som jeg tenkte jeg skulle legge fram på nettsida mi. Det ene er et prosjekt jeg startet for meg selv som heter "iTree". Et villt og vakkert data-tre kan man kalle det. Jeg hadde det i bruk når "Norske Søk" var oppe. Forskjellen mellom da og nå, er at jeg leier web-plass på et webhotell. Mange fordeler med dette. Sikkerhet. Slipper å tenke så mye på HW lenger. Og annet.

Nå er det lenge siden jeg harjobbet med programmering, datamaskiner aktivt. Har på en måte ikke hatt noen ideer eller prosjekter å jobbe med. Vært litt stillstand i hodet kan man jo si på en måte.