Exemplo n.º 1
0
 public static function build($output_prefix, $db_doc)
 {
     if (strlen($output_prefix) == 0) {
         throw new exception("mssql10::build() sanity failure: output_prefix is blank");
     }
     // build full db creation script
     $build_file = $output_prefix . '_build.sql';
     dbsteward::notice("Building complete file " . $build_file);
     $build_file_fp = fopen($build_file, 'w');
     if ($build_file_fp === FALSE) {
         throw new exception("failed to open full file " . $build_file . ' for output');
     }
     $build_file_ofs = new output_file_segmenter($build_file, 1, $build_file_fp, $build_file);
     if (count(dbsteward::$limit_to_tables) == 0) {
         $build_file_ofs->write("-- full database definition file generated " . date('r') . "\n");
     }
     // error encountered: ALTER DATABASE statement not allowed within multi-statement transaction.
     // so do the assembly configuration before the db structure / data creation transaction
     // see BEGIN TRANSACTION below
     if (isset($db_doc->inlineAssembly)) {
         foreach ($db_doc->inlineAssembly as $assembly) {
             $assembly_file_name = dirname($files[0]) . '/' . $assembly['name'];
             if (!is_readable($assembly_file_name)) {
                 throw new exception("assembly file " . $assembly_file_name . " not readable");
             }
             $assembly_name = substr(basename($assembly_file_name), 0, -4);
             dbsteward::info("Including " . $assembly_name . " assembly inline from " . $assembly_file_name);
             $afh = fopen($assembly_file_name, "rb");
             $assembly_contents = fread($afh, filesize($assembly_file_name));
             fclose($afh);
             $assembly_binary_hex = '0x' . bin2hex($assembly_contents);
             $ddl = "CREATE ASSEMBLY " . $assembly_name . "\n" . "FROM " . $assembly_binary_hex . "\n" . "WITH PERMISSION_SET = SAFE;\n\n";
             $build_file_ofs->write($ddl);
         }
         unset($db_doc->inlineAssembly);
     }
     $build_file_ofs->write("BEGIN TRANSACTION;\n\n");
     dbsteward::info("Calculating table foreign key dependency order..");
     $table_dependency = xml_parser::table_dependency_order($db_doc);
     // database-specific implementation refers to dbsteward::$new_database when looking up roles/values/conflicts etc
     dbsteward::$new_database = $db_doc;
     dbx::set_default_schema($db_doc, 'dbo');
     // language defintions
     if (dbsteward::$create_languages) {
         foreach ($db_doc->language as $language) {
             //@TODO: implement mssql10_language ? no relevant conversion exists see other TODO's stating this
         }
     }
     if (dbsteward::$only_schema_sql || !dbsteward::$only_data_sql) {
         dbsteward::notice("Defining structure");
         mssql10::build_schema($db_doc, $build_file_ofs, $table_dependency);
     }
     if (!dbsteward::$only_schema_sql || dbsteward::$only_data_sql) {
         dbsteward::notice("Defining data inserts");
         mssql10::build_data($db_doc, $build_file_ofs, $table_dependency);
     }
     dbsteward::$new_database = NULL;
     $build_file_ofs->write("COMMIT TRANSACTION;\n\n");
     return $db_doc;
 }