function CreateTable($table_name, $table)
 {
     MetabaseDebug($this->database, "Create table: " . $table_name);
     if (!MetabaseCreateTable($this->database, $table_name, $table["FIELDS"])) {
         return MetabaseError($this->database);
     }
     $success = 1;
     $error = "";
     if (isset($table["initialization"])) {
         $instructions = $table["initialization"];
         for (Reset($instructions), $instruction = 0; $success && $instruction < count($instructions); $instruction++, Next($instructions)) {
             switch ($instructions[$instruction]["type"]) {
                 case "insert":
                     $fields = $instructions[$instruction]["FIELDS"];
                     for ($query_fields = $query_values = "", Reset($fields), $field_number = 0; $field_number < count($fields); $field_number++, Next($fields)) {
                         if ($field_number > 0) {
                             $query_fields .= ",";
                             $query_values .= ",";
                         }
                         $field_name = Key($fields);
                         $field = $table["FIELDS"][$field_name];
                         if (strcmp($error = $this->GetField($field, $field_name, 0, $query), "")) {
                             return $error;
                         }
                         $query_fields .= $query;
                         $query_values .= "?";
                     }
                     if ($success = $prepared_query = MetabasePrepareQuery($this->database, "INSERT INTO {$table_name} ({$query_fields}) VALUES ({$query_values})")) {
                         for ($lobs = array(), Reset($fields), $field_number = 0; $field_number < count($fields); $field_number++, Next($fields)) {
                             $field_name = Key($fields);
                             $field = $table["FIELDS"][$field_name];
                             if (strcmp($error = $this->GetField($field, $field_name, 0, $query), "")) {
                                 return $error;
                             }
                             switch ($field["type"]) {
                                 case "integer":
                                     $success = MetabaseQuerySetInteger($this->database, $prepared_query, $field_number + 1, intval($fields[$field_name]));
                                     break;
                                 case "text":
                                     $success = MetabaseQuerySetText($this->database, $prepared_query, $field_number + 1, $fields[$field_name]);
                                     break;
                                 case "clob":
                                     $lob_definition = array("Database" => $this->database, "Error" => "", "Data" => $fields[$field_name]);
                                     $lob = count($lobs);
                                     if (!($success = MetabaseCreateLOB($lob_definition, $lobs[$lob]))) {
                                         $error = $lob_definition["Error"];
                                         break;
                                     }
                                     $success = MetabaseQuerySetCLOB($this->database, $prepared_query, $field_number + 1, $lobs[$lob], $field_name);
                                     break;
                                 case "blob":
                                     $lob_definition = array("Database" => $this->database, "Error" => "", "Data" => $fields[$field_name]);
                                     $lob = count($lobs);
                                     if (!($success = MetabaseCreateLOB($lob_definition, $lobs[$lob]))) {
                                         $error = $lob_definition["Error"];
                                         break;
                                     }
                                     $success = MetabaseQuerySetBLOB($this->database, $prepared_query, $field_number + 1, $lobs[$lob], $field_name);
                                     break;
                                 case "boolean":
                                     $success = MetabaseQuerySetBoolean($this->database, $prepared_query, $field_number + 1, intval($fields[$field_name]));
                                     break;
                                 case "date":
                                     $success = MetabaseQuerySetDate($this->database, $prepared_query, $field_number + 1, $fields[$field_name]);
                                     break;
                                 case "timestamp":
                                     $success = MetabaseQuerySetTimestamp($this->database, $prepared_query, $field_number + 1, $fields[$field_name]);
                                     break;
                                 case "time":
                                     $success = MetabaseQuerySetTime($this->database, $prepared_query, $field_number + 1, $fields[$field_name]);
                                     break;
                                 case "float":
                                     $success = MetabaseQuerySetFloat($this->database, $prepared_query, $field_number + 1, doubleval($fields[$field_name]));
                                     break;
                                 case "decimal":
                                     $success = MetabaseQuerySetDecimal($this->database, $prepared_query, $field_number + 1, $fields[$field_name]);
                                     break;
                                 default:
                                     $error = "type \"" . $field["type"] . "\" is not yet supported";
                                     $success = 0;
                                     break;
                             }
                             if (!$success && $error == "") {
                                 $error = MetabaseError($this->database);
                                 break;
                             }
                         }
                         if ($success && !($success = MetabaseExecuteQuery($this->database, $prepared_query))) {
                             $error = MetabaseError($this->database);
                         }
                         for ($lob = 0; $lob < count($lobs); $lob++) {
                             MetabaseDestroyLOB($lobs[$lob]);
                         }
                         MetabaseFreePreparedQuery($this->database, $prepared_query);
                     } else {
                         $error = MetabaseError($this->database);
                     }
                     break;
             }
         }
     }
     if ($success && isset($table["INDEXES"])) {
         if (!MetabaseSupport($this->database, "Indexes")) {
             return "indexes are not supported";
         }
         $indexes = $table["INDEXES"];
         for ($index = 0, Reset($indexes); $index < count($indexes); Next($indexes), $index++) {
             if (!MetabaseCreateIndex($this->database, $table_name, Key($indexes), $indexes[Key($indexes)])) {
                 $error = MetabaseError($this->database);
                 $success = 0;
                 break;
             }
         }
     }
     if (!$success) {
         if (!MetabaseDropTable($this->database, $table_name)) {
             $error = "could not initialize the table \"{$table_name}\" ({$error}) and then could not drop the table (" . MetabaseError($this->database) . ")";
         }
     }
     return $error;
 }
 function FetchLOBResult($result, $row, $field)
 {
     $lob = count($this->lobs) + 1;
     $this->lobs[$lob] = array("Result" => $result, "Row" => $row, "Field" => $field, "Position" => 0);
     $character_lob = array("Database" => $this->database, "Error" => "", "Type" => "resultlob", "ResultLOB" => $lob);
     if (!MetabaseCreateLOB($character_lob, $clob)) {
         return $this->SetError("Fetch LOB result", $character_lob["Error"]);
     }
     return $clob;
 }
Example #3
0
         }
         fclose($file);
     } else {
         $success = 0;
         $error = "could not reopen the character lob data file";
     }
 }
 if ($success) {
     if (strcmp($value, $character_data)) {
         $pass = 0;
         echo "FAILED!{$eol}";
         $failed++;
         echo "Test {$test}: retrieved character LOB value (\"" . $value . "\") is different from what was stored (\"" . $character_data . "\"){$eol}";
     } else {
         $binary_lob = array("Type" => "outputfile", "Database" => $database, "Result" => $result, "Row" => 0, "Field" => "picture", "Binary" => 1, "Error" => "", "FileName" => $binary_data_file, "BufferLength" => 32);
         if ($success = MetabaseCreateLOB($binary_lob, $blob)) {
             if (MetabaseReadLOB($blob, $data, 0) < 0) {
                 $error = MetabaseLOBError($clob);
                 $success = 0;
             }
             MetabaseDestroyLOB($blob);
             if ($success) {
                 if ($file = fopen($binary_data_file, "rb")) {
                     if (GetType($value = fread($file, filesize($binary_data_file))) != "string") {
                         $success = 0;
                         $error = "could not read from the binary lob data file";
                     }
                     fclose($file);
                 } else {
                     $success = 0;
                     $error = "could not reopen the binary lob data file";