Beispiel #1
0
 static function load($source, $schema)
 {
     list($driver, $dsn, $dbname, $username, $password) = self::parse_dsn($source);
     Modyllic_Status::$source_name = $dsn;
     $class = self::db_driver($driver);
     $dbh = new PDO($dsn, $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => true));
     call_user_func(array($class, 'load'), $dbh, $dbname, $schema);
 }
Beispiel #2
0
 static function load(array $sources, $schema = null)
 {
     if (!isset($schema)) {
         $schema = new Modyllic_Schema();
     }
     Modyllic_Status::$source_count += count($sources);
     foreach ($sources as $source) {
         // Strip trailing slashes from directory names
         if (substr($source, -1) == "/") {
             $source = substr($source, 0, -1);
         }
         Modyllic_Status::$source_name = $source;
         Modyllic_Status::$source_index++;
         list($source, $loader) = self::determine_loader($source);
         if (isset($loader)) {
             call_user_func(array($loader, 'load'), $source, $schema);
         } else {
             throw new Modyllic_Loader_Exception("Could not load {$source}, file or directory not found");
         }
         Modyllic_Status::status(1, 1);
     }
     $schema->load_sqlmeta();
     return $schema;
 }
Beispiel #3
0
 /**
  * @returns Modyllic_Schema
  */
 static function load(PDO $dbh, $dbname, $schema)
 {
     $dbh->exec("USE information_schema");
     $dbschema = self::selectrow($dbh, "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM SCHEMATA WHERE SCHEMA_NAME=?", array($dbname));
     if (!$dbschema) {
         throw new Exception("Database {$dbname} does not exist");
     }
     $parser = new Modyllic_Parser();
     if ($schema->name_is_default) {
         $schema->set_name($dbschema['SCHEMA_NAME']);
         $schema->charset = $dbschema['DEFAULT_CHARACTER_SET_NAME'];
         $schema->collate = $dbschema['DEFAULT_COLLATION_NAME'];
     }
     $table_sth = self::query($dbh, "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA=? AND TABLE_TYPE='BASE TABLE'", array($dbname));
     $tables = array();
     while ($table_row = $table_sth->fetch(PDO::FETCH_ASSOC)) {
         Modyllic_Status::$source_count++;
         $table = self::selectrow($dbh, "SHOW CREATE TABLE " . Modyllic_SQL::quote_ident($dbname) . "." . Modyllic_SQL::quote_ident($table_row['TABLE_NAME']));
         $tables[$table_row['TABLE_NAME']] = $table['Create Table'];
     }
     $routine_sth = self::query($dbh, "SELECT ROUTINE_TYPE, ROUTINE_NAME FROM ROUTINES WHERE ROUTINE_SCHEMA=?", array($dbname));
     $routines = array();
     while ($routine = $routine_sth->fetch(PDO::FETCH_ASSOC)) {
         Modyllic_Status::$source_count++;
         if ($routine['ROUTINE_TYPE'] == 'PROCEDURE') {
             $proc = self::selectrow($dbh, "SHOW CREATE PROCEDURE " . Modyllic_SQL::quote_ident($dbname) . "." . Modyllic_SQL::quote_ident($routine['ROUTINE_NAME']));
             $routines[$routine['ROUTINE_NAME']] = $proc['Create Procedure'];
         } else {
             if ($routine['ROUTINE_TYPE'] == 'FUNCTION') {
                 $func = self::selectrow($dbh, "SHOW CREATE FUNCTION " . Modyllic_SQL::quote_ident($dbname) . "." . Modyllic_SQL::quote_ident($routine['ROUTINE_NAME']));
                 $routines[$routine['ROUTINE_NAME']] = $func['Create Function'];
             } else {
                 throw new Exception("Unknown routine type " . $routine['ROUTINE_TYPE'] . " for " . $routine['ROUTINE_NAME']);
             }
         }
     }
     foreach ($tables as $table_name => $table_sql) {
         Modyllic_Status::$source_name = "{$dbname}." . $table_name;
         $parser->partial($schema, $table_sql, "{$dbname}.{$table_name}");
         Modyllic_Status::$source_index++;
     }
     ksort($schema->tables);
     foreach ($routines as $routine_name => $routine_sql) {
         Modyllic_Status::$source_name = "{$dbname}.{$routine_name}";
         $parser->partial($schema, $routine_sql, "{$dbname}.{$routine_name}");
         Modyllic_Status::$source_index++;
     }
     ksort($schema->routines);
     if (isset($schema->tables['SQLMETA'])) {
         $table = $schema->tables['SQLMETA'];
         $meta_sth = self::query($dbh, "SELECT kind,which,value FROM " . Modyllic_SQL::quote_ident($dbname) . ".SQLMETA");
         while ($meta = $meta_sth->fetch(PDO::FETCH_ASSOC)) {
             $table->add_row($meta);
         }
     }
     $schema->load_sqlmeta();
     // Look for data to load...
     foreach ($schema->tables as $name => $table) {
         if ($table->static) {
             $data_sth = self::query($dbh, "SELECT * FROM " . Modyllic_SQL::quote_ident($dbname) . "." . Modyllic_SQL::quote_ident($name));
             while ($data_row = $data_sth->fetch(PDO::FETCH_ASSOC)) {
                 $table->add_row($data_row);
             }
         }
     }
 }