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;
 }
Exemple #2
0
         echo "OK.{$eol}";
     }
 }
 if ($support_lobs && isset($tests["lobnulls"]) && $success) {
     $test = "lobnulls";
     echo "Testing lob nulls... ";
     flush();
     $pass = 1;
     if (!MetabaseQuery($database, "DELETE FROM files")) {
         $success = 0;
     } else {
         if ($prepared_query = MetabasePrepareQuery($database, "INSERT INTO files (document,picture) VALUES (?,?)")) {
             MetabaseQuerySetNULL($database, $prepared_query, 1, "clob");
             MetabaseQuerySetNULL($database, $prepared_query, 2, "blob");
             $success = MetabaseExecuteQuery($database, $prepared_query);
             MetabaseFreePreparedQuery($database, $prepared_query);
             if (!$success || !($result = MetabaseQuery($database, "SELECT document,picture FROM files"))) {
                 $success = 0;
             } else {
                 if (MetabaseEndOfResult($database, $result)) {
                     $pass = 0;
                     echo "FAILED!{$eol}";
                     $failed++;
                     echo "Test {$test}: the query result seem to have reached the end of result too soon.{$eol}";
                 } else {
                     if (!MetabaseResultIsNull($database, $result, 0, $field = "document") || !MetabaseResultIsNull($database, $result, 0, $field = "picture")) {
                         $pass = 0;
                         echo "FAILED!{$eol}";
                         $failed++;
                         echo "Test {$test}: a query result large object column is not NULL unlike what was expected{$eol}";
                     }