/**
  * Execute command by sending data to server, receive initial reply
  * @throws null|OrientDBException
  * @throws OrientDBException
  * @return mixed
  */
 public function execute()
 {
     $this->socket->debug = $this->debug;
     $this->socket->send($this->requestBytes);
     if (is_null($this->parent->protocolVersion)) {
         $this->debugCommand('protocol_version');
         $serverProtocolVersion = $this->readShort();
         $this->parent->setProtocolVersion($serverProtocolVersion);
     }
     if ($this->opType == self::DB_CLOSE) {
         // No incoming bytes
         return null;
     }
     $this->debugCommand('request_status');
     $this->requestStatus = $this->readByte();
     $this->debugCommand('TransactionID');
     $requestTransactionID = $this->readInt();
     if ($requestTransactionID !== $this->currentTransactionID) {
         throw new OrientDBException('Transaction ID mismatch');
     }
     if ($this->requestStatus === chr(OrientDBCommandAbstract::STATUS_SUCCESS)) {
         $data = $this->parseResponse();
         if ($this->opType === self::DB_OPEN) {
             $this->parent->setSessionIDDB($this->sessionID);
         } elseif ($this->opType === self::CONNECT) {
             $this->parent->setSessionIDServer($this->sessionID);
         }
         return $data;
     } elseif ($this->requestStatus === chr(OrientDBCommandAbstract::STATUS_ERROR)) {
         $exception = null;
         while ($this->readByte() === chr(OrientDBCommandAbstract::STATUS_ERROR)) {
             $this->debugCommand('exception_javaclass');
             $javaException = $this->readString();
             $this->debugCommand('exception_message');
             $javaExceptionDescr = $this->readString();
             $exception = new OrientDBException($javaException . ': ' . $javaExceptionDescr, 0, is_null($exception) ? null : $exception);
         }
         throw $exception;
     } else {
         throw new OrientDBException('Unknown error');
     }
 }