public static function generateModel($module, $table)
 {
     if (!file_exists(APP_MODULES_PATH . '/' . $module)) {
         trigger_error("Module {$module} not found under " . APP_MODULES_PATH);
     }
     if (!is_writable(APP_MODULES_PATH . '/' . $module)) {
         trigger_error("Unable to write into module folder [" . APP_MODULES_PATH . '/' . $module . "]");
     }
     if (!file_exists(APP_MODULES_PATH . '/' . $module . '/Model')) {
         mkdir(APP_MODULES_PATH . '/' . $module . '/Model');
     }
     $modelCode = "<?php\n";
     $maxNameLength = 0;
     $priKey = array();
     $myModel = new MySQLManager_ObjectsModel();
     $columns = $myModel->listTableColumns($table);
     if (sizeof($columns) == 0) {
         trigger_error("No table {$table} found or the table has no column. No code generated.");
     }
     foreach ($columns as $column) {
         if (strlen($column['COLUMN_NAME']) > $maxNameLength) {
             $maxNameLength = strlen($column['COLUMN_NAME']);
         }
         if ($column['COLUMN_KEY'] == 'PRI') {
             $priKey[] = array('name' => $column['COLUMN_NAME'], 'type' => self::getPhpType($column['DATA_TYPE']), 'extra' => $column['EXTRA'], 'desc' => $column['COLUMN_COMMENT']);
         }
     }
     if (sizeof($priKey) == 0) {
         trigger_error("There's no primary key defined for table {$table}. No code generated.");
     }
     $introCode = self::generateIntro($module, $table);
     $readCode = self::generateReadCode($module, $table, $columns, $maxNameLength, $priKey);
     $getNextCode = self::generateGetNextCode($module, $table, $columns, $maxNameLength, $priKey);
     $constructCode = self::generateConstructCode($module, $table, $columns, $maxNameLength, $priKey);
     $listCode = self::generateListCode($module, $table, $columns, $maxNameLength, $priKey);
     $createCode = self::generateCreateCode($module, $table, $columns, $maxNameLength, $priKey);
     $updateCode = self::generateUpdateCode($module, $table, $columns, $maxNameLength, $priKey);
     $deleteCode = self::generateDeleteCode($module, $table, $columns, $maxNameLength, $priKey);
     $functionCode = self::generateFunctionCode($module, $table, $columns, $maxNameLength, $priKey);
     $modelCode .= $introCode;
     $modelCode .= "class " . $module . "_" . $table . "ModelGen extends Pokelio_MySql_Connector{ \n";
     $modelCode .= $constructCode;
     $modelCode .= $readCode;
     $modelCode .= $listCode;
     $modelCode .= $getNextCode;
     $modelCode .= $createCode;
     $modelCode .= $updateCode;
     $modelCode .= $deleteCode;
     $modelCode .= $functionCode;
     $modelCode .= "} \n\n";
     //Write ModelGen file
     Pokelio_File::writeFile(APP_MODULES_PATH . '/' . $module . '/Model/' . $table . 'ModelGen.php', $modelCode);
     //Write Model wrapper file
     self::generateWrapper($module, $table);
     //Write Entity file
     self::generateEntityClass($module, $table, $columns, $maxNameLength);
 }
 public static function listTables()
 {
     $om = new MySQLManager_ObjectsModel();
     return $om->books();
 }