/**
  * Add missing fields to existing database table
  *
  * @param string $schema String name of schema to use to get fields
  * @param string $verbose_output string used to log added fields
  * 
  * @return bool true if fields added successfully, false otherwise
  */
 public static function addMissingModelFieldsToDb($schema, $plugin_name = null, $verbose_output = null)
 {
     if (!DinklyDataConfig::setActiveConnection($schema)) {
         return false;
     }
     //If no DB exists, create one
     try {
         $db = DinklyDataConnector::fetchDB();
     } catch (PDOException $e) {
         if ($e->getCode() == 1049) {
             self::createDb($schema, DinklyDataConfig::getDBCreds());
             $db = DinklyDataConnector::fetchDB();
         }
     }
     $model_names = DinklyBuilder::getAllModels($schema);
     //Gather up yaml configs for each model
     $model_yaml = $table_names = array();
     foreach ($model_names as $model) {
         $model_yaml[$model] = self::parseModelYaml($schema, $model, $plugin_name, false);
         $table_names[$model] = $model_yaml[$model]['table_name'];
     }
     //Create index for matching tables and columns within the yaml config
     $yaml_fields = array();
     foreach ($model_yaml as $y) {
         $yaml_fields[$y['table_name']] = array();
         foreach ($y['registry'] as $field_name) {
             $name = null;
             if (is_array($field_name)) {
                 $name = key($field_name);
             } else {
                 $name = $field_name;
             }
             $yaml_fields[$y['table_name']][] = $name;
         }
     }
     //Create a very similar index, for matching tables and columns within the existing database
     $db_table_fields = array();
     foreach ($table_names as $table_name) {
         $query = "show columns from " . $table_name;
         $results = $db->query($query)->fetchAll();
         $db_table_fields[$table_name] = array();
         foreach ($results as $k => $v) {
             $db_table_fields[$table_name][] = $v['Field'];
         }
     }
     //Find any fields that are in the yaml, but are not in the database currently
     $fields_to_add = array();
     foreach ($yaml_fields as $table_name => $yaml_field_list) {
         foreach ($yaml_field_list as $field_name) {
             if (!in_array($field_name, $db_table_fields[$table_name])) {
                 if (!isset($fields_to_add[$table_name])) {
                     $fields_to_add[$table_name] = array();
                 }
                 $fields_to_add[$table_name][] = $field_name;
             }
         }
     }
     //For each field missing from the database, but present in the yaml, run an alter query
     foreach ($fields_to_add as $table => $field_list) {
         foreach ($field_list as $field) {
             $registry = $model_yaml[Dinkly::convertToCamelCase($table, true)]['registry'];
             foreach ($registry as $field_config) {
                 $sql = null;
                 if (is_array($field_config)) {
                     if (key($field_config) == $field) {
                         $sql = self::genTableAlterQuery($db, $table, $field_config);
                     }
                 } else {
                     if ($field == $field_config) {
                         $sql = self::genTableAlterQuery($db, $table, $field_config);
                     }
                 }
                 if ($sql) {
                     if ($verbose_output) {
                         echo "Adding field " . $field . " to " . $table . "...\n";
                     }
                     $db->exec($sql);
                 }
             }
         }
     }
 }