PageRenderTime 42ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/core/general/Models.php

http://oraculum-php.googlecode.com/
PHP | 552 lines | 527 code | 20 blank | 5 comment | 53 complexity | 819dbc4463af011c079e99651c456517 MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. class Oraculum_Models
  3. {
  4. private $_dsn=NULL;
  5. private $_dsntype=2;
  6. private $_user=NULL;
  7. private $_pass=NULL;
  8. private $_host=NULL;
  9. private $_driver=NULL;
  10. private $_database=NULL;
  11. private $_driveroptions=array();
  12. private $_model=NULL;
  13. public static $connection=NULL;
  14. public function __construct($model=NULL) {
  15. if(!defined('MODEL_DIR')):
  16. define('MODEL_DIR', 'models');
  17. endif;
  18. Oraculum::Load('DBO');
  19. Oraculum::Load('ActiveRecord');
  20. return (!is_null($model))?$this->LoadModel($model):$this;
  21. }
  22. public function LoadModel($model=NULL) {
  23. if(!is_null($model)):
  24. $model=strtolower($model);
  25. $modelfile=MODEL_DIR.'/'.$model.'.php';
  26. if(file_exists($modelfile)):
  27. include($modelfile);
  28. else:
  29. throw new Exception('[Erro CGM17] Modelo nao encontrado ('.$modelfile.') ');
  30. endif;
  31. if($this->_dsntype==2):
  32. $dsn=preg_split('[://|:|@|/]', $this->_dsn);
  33. $this->_driver=strtolower($dsn[0]);
  34. $this->_user=$dsn[1];
  35. $this->_pass=$dsn[2];
  36. $this->_host=$dsn[3];
  37. $this->_database=$dsn[4];
  38. $this->_driveroptions=isset($dsn[5])?$dsn[5]:NULL;
  39. $this->_dsn=$this->_driver.':host='.$this->_host.';dbname='.$this->_database;
  40. endif;
  41. $this->_model=$model;
  42. endif;
  43. if((!isset(self::$connection))||(!is_null(self::$connection))):
  44. $this->PDO();
  45. endif;
  46. return $this;
  47. }
  48. public static function CloseModel() {
  49. self::$connection = NULL;
  50. }
  51. public function SaveModel($table='all', $debug=TRUE) {
  52. $table=strtolower($table);
  53. if($table=='all'):
  54. $tables=self::$connection->query('SHOW TABLES')->fetchAll();
  55. foreach($tables as $table):
  56. $dtodir=MODEL_DIR.'/dto/';
  57. $daodir=MODEL_DIR.'/dao/';
  58. if(!file_exists($dtodir)):
  59. if(is_writable(MODEL_DIR)):
  60. mkdir($dtodir);
  61. else:
  62. throw new Exception('[Erro CGM53] Sem permissao para criar diretorio DTO');
  63. endif;
  64. endif;
  65. if(!file_exists($daodir)):
  66. if(is_writable(MODEL_DIR)):
  67. mkdir($daodir);
  68. else:
  69. throw new Exception('[Erro CGM61] Sem permissao para criar diretorio DAO');
  70. endif;
  71. endif;
  72. $modelfile=$dtodir.$table[0].'.php';
  73. if(is_writable($dtodir)):
  74. $model=$this->GenerateDTO($table[0], FALSE);
  75. $mf=fopen($modelfile, 'w');
  76. fwrite($mf, $model);
  77. fclose($mf);
  78. else:
  79. throw new Exception('[Erro CGM71] O arquivo nao pode ser gravado ('.$modelfile.')');
  80. endif;
  81. $modelfile=$daodir.$table[0].'.php';
  82. if(is_writable($daodir)):
  83. $model=$this->GenerateDAO($table[0], FALSE);
  84. $mf=fopen($modelfile, 'w');
  85. fwrite($mf, $model);
  86. fclose($mf);
  87. else:
  88. throw new Exception('[Erro CGM81] O arquivo nao pode ser gravado ('.$modelfile.')');
  89. endif;
  90. endforeach;
  91. endif;
  92. if($debug):
  93. echo 'Classes geradas com sucesso!<br />';
  94. echo 'Para carregar as classes geradas em alguma &aacute;rea do site utilize o seguinte c&oacute;digo:<br />';
  95. echo '<pre>';
  96. highlight_string("<?php\n\tOraculum::Load('Models');\n\t\$db=new Oraculum_Models('".$this->_model."');\n\t\$db->LoadModelClass();");
  97. echo '</pre>';
  98. endif;
  99. }
  100. public function LoadModelClass($model='all', $type='AR', $key='id') {
  101. if(!is_null($model)):
  102. if($model=='all'):
  103. if($type=='DO'):
  104. foreach(glob(MODEL_DIR.'/dto/*.php') as $filename):
  105. include_once($filename);
  106. endforeach;
  107. foreach(glob(MODEL_DIR.'/dao/*.php') as $filename):
  108. include_once($filename);
  109. endforeach;
  110. else:
  111. foreach(glob(MODEL_DIR.'/ar/*.php') as $filename):
  112. include_once($filename);
  113. endforeach;
  114. endif;
  115. else:
  116. $model=strtolower($model);
  117. if($type=='DO'):
  118. $modelfile=MODEL_DIR.'/dto/'.$model.'.php';
  119. if(file_exists($modelfile)):
  120. include($modelfile);
  121. else:
  122. throw new Exception('[Erro CGM93] Modelo nao encontrado ('.$modelfile.') ');
  123. endif;
  124. $modelfile=MODEL_DIR.'/dao/'.$model.'.php';
  125. if(file_exists($modelfile)):
  126. include($modelfile);
  127. else:
  128. throw new Exception('[Erro CGM93] Modelo nao encontrado ('.$modelfile.') ');
  129. endif;
  130. else:
  131. $modelfile=MODEL_DIR.'/ar/'.$model.'.php';
  132. if(file_exists($modelfile)):
  133. include_once($modelfile);
  134. else:
  135. if(!$this->LoadDynamicModelClass($model, $key)):
  136. throw new Exception('[Erro CGM93] Modelo nao encontrado ('.$modelfile.') ');
  137. endif;
  138. endif;
  139. endif;
  140. endif;
  141. endif;
  142. return $this;
  143. }
  144. public function LoadDynamicModelClass($model=NULL, $key='id') {
  145. if(!is_null($model)):
  146. $class=ucwords($model);
  147. if (!class_exists($class)):
  148. $eval='class '.$class.' extends ActiveRecord{';
  149. $eval.=' public function __construct(){';
  150. $eval.=' parent::__construct(get_class($this))';
  151. $eval.=' ->setKey(array(\''.$key.'\'));';
  152. $eval.=' }';
  153. $eval.='}';
  154. eval($eval);
  155. endif;
  156. return true;
  157. else:
  158. throw new Exception('[Erro CGM160] Modelo nao informado ('.$model.') ');
  159. endif;
  160. return $this;
  161. }
  162. public function PDO()
  163. {
  164. if(extension_loaded('pdo')):
  165. if(in_array($this->_driver, PDO::getAvailableDrivers())):
  166. try {
  167. self::$connection=new PDO($this->_dsn, $this->_user, (!$this->_pass?'':$this->_pass), $this->_driveroptions);
  168. self::$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  169. } catch (PDOException $e) {
  170. throw new Exception('PDO Connection Error: '.$e->getMessage());
  171. }
  172. return self::$connection;
  173. else:
  174. throw new Exception('[Error CGM54] Nao ha driver disponivel para \''.$this->_driver.'\'');
  175. endif;
  176. else:
  177. throw new Exception('[Error CGM57] Extensao PDO nao carregada');
  178. endif;
  179. }
  180. public function GenerateClass($table='all', $create=TRUE) {
  181. $table=strtolower($table);
  182. if($table=='all'):
  183. $tables=self::$connection->query('SHOW TABLES')->fetchAll();
  184. foreach ($tables as $table):
  185. $this->GenerateDTO($table[0], $create);
  186. $this->GenerateDAO($table[0], $create);
  187. endforeach;
  188. else:
  189. try {
  190. $desc=self::$connection->query('DESC '.$table)->fetchAll();
  191. $classedto=ucwords($table).'DTO';
  192. $class=' class '.$classedto.' extends DBO'."\n";
  193. $class.=" {\n";
  194. $contador=0;
  195. foreach($desc as $d):
  196. $campo[$contador]=$d['Field'];
  197. $tipo[$contador]=$d['Type'];
  198. $null[$contador]=$d['Null'];
  199. $key[$contador]=$d['Key'];
  200. $default[$contador]=$d['Default'];
  201. $extra[$contador]=$d['Extra'];
  202. if(is_null($default[$contador])):
  203. $default[$contador]='NULL';
  204. else:
  205. $default[$contador]="'".$default[$contador]."'";
  206. endif;
  207. if (strpos($tipo[$contador], 'int')===false):
  208. $tiposql[$contador]="%s";
  209. else:
  210. $tiposql[$contador]="%u";
  211. endif;
  212. $contador++;
  213. endforeach;
  214. for($c=0; $c<$contador; $c++):
  215. $class.=" public \$".$campo[$c]."=".$default[$c].";\n";
  216. endfor;
  217. $class.="\n public function ".$classedto."(){}\n";
  218. for ($c=0; $c<$contador; $c++):
  219. $name=ucwords($campo[$c]);
  220. if($key[$c]!=''):
  221. $class.="\n // ".$name." (".$key[$c]." ".$tipo[$c].")\n";
  222. else:
  223. $class.="\n // ".$name." (".$tipo[$c].")\n";
  224. endif;
  225. $class.=" public function get".$name."()\n";
  226. $class.=" {\n";
  227. $class.=" return \$this->".$campo[$c].";\n";
  228. $class.=" }\n";
  229. $class.=" public function set".$name."($".$campo[$c].")\n";
  230. $class.=" {\n";
  231. $class.=" \$this->".$campo[$c]."=\$".$campo[$c].";\n";
  232. $class.=" }\n";
  233. endfor;
  234. $class.=" }\n";
  235. if($create):
  236. eval($class);
  237. else:
  238. return "<?php \n".$class;
  239. endif;
  240. } catch (PDOException $e) {
  241. throw new Exception('PDO Connection Error: '.$e->getMessage());
  242. }
  243. endif;
  244. }
  245. public function GenerateDTO ($table='all', $create=TRUE) {
  246. $table=strtolower($table);
  247. if($table=='all'):
  248. $tables=self::$connection->query('SHOW TABLES')->fetchAll();
  249. foreach($tables as $table):
  250. $this->GenerateDTO($table[0], $create);
  251. endforeach;
  252. else:
  253. try {
  254. $desc=self::$connection->query('DESC '.$table)->fetchAll();
  255. $classedto=ucwords($table).'DTO';
  256. $class=" class ".$classedto."\n";
  257. $class.=" {\n";
  258. $contador=0;
  259. foreach($desc as $d):
  260. $campo[$contador]=$d['Field'];
  261. $tipo[$contador]=$d['Type'];
  262. $null[$contador]=$d['Null'];
  263. $key[$contador]=$d['Key'];
  264. $default[$contador]=$d['Default'];
  265. $extra[$contador]=$d['Extra'];
  266. if(is_null($default[$contador])):
  267. $default[$contador]='NULL';
  268. else:
  269. $default[$contador]="'".$default[$contador]."'";
  270. endif;
  271. if(strpos($tipo[$contador], 'int')===false):
  272. $tiposql[$contador]="%s";
  273. else:
  274. $tiposql[$contador]="%u";
  275. endif;
  276. $contador++;
  277. endforeach;
  278. for($c=0; $c<$contador; $c++):
  279. $class.=" private \$".$campo[$c]."=".$default[$c].";\n";
  280. endfor;
  281. $class.="\n public function ".$classedto."(){}\n";
  282. for($c=0; $c<$contador; $c++):
  283. $name=ucwords($campo[$c]);
  284. if($key[$c]!=''):
  285. $class.="\n // ".$name." (".$key[$c]." ".$tipo[$c].")\n";
  286. else:
  287. $class.="\n // ".$name." (".$tipo[$c].")\n";
  288. endif;
  289. $class.=" public function get".$name."()\n";
  290. $class.=" {\n";
  291. $class.=" return \$this->".$campo[$c].";\n";
  292. $class.=" }\n";
  293. $class.=" public function set".$name."($".$campo[$c].")\n";
  294. $class.=" {\n";
  295. $class.=" \$this->".$campo[$c]."=\$".$campo[$c].";\n";
  296. $class.=" }\n";
  297. endfor;
  298. $class.=" }\n";
  299. if($create):
  300. eval($class);
  301. else:
  302. return "<?php \n".$class;
  303. endif;
  304. } catch (PDOException $e) {
  305. throw new Exception('PDO Connection Error: '.$e->getMessage());
  306. }
  307. endif;
  308. }
  309. public function GenerateDAO($table='all', $create=TRUE) {
  310. $table=strtolower($table);
  311. if($table=='all'):
  312. $tables=self::$connection->query('SHOW TABLES')->fetchAll();
  313. foreach($tables as $table):
  314. $this->GenerateDAO($table[0], $create);
  315. endforeach;
  316. else:
  317. try {
  318. $desc=self::$connection->query('DESC '.$table)->fetchAll();
  319. $classedao=ucwords($table).'DAO';
  320. $classedto=ucwords($table).'DTO';
  321. $classdao=" class ".$classedao." extends DBO\n";
  322. $classdao.=" {\n\n";
  323. //foreach ($desc as $d) {
  324. $contador=sizeof($desc);
  325. if($contador>0):
  326. $classdao.=" // Select All\n";
  327. $classdao.=" public function getAll(\$limit=10)\n";
  328. $classdao.=" {\n";
  329. $classdao.=" \$objDto=new ".$classedto."();\n";
  330. $classdao.=" \$return=array();\n";
  331. $classdao.=" if(floor(\$limit)!=0)\n";
  332. $classdao.=" {\n";
  333. $classdao.=" \$sqllimit=\"LIMIT \".floor(\$limit);\n";
  334. $classdao.=" }\n";
  335. $classdao.=" else\n";
  336. $classdao.=" {\n";
  337. $classdao.=" \$sqllimit=\"\";\n";
  338. $classdao.=" }\n";
  339. $classdao.=" \$sql=\"SELECT * FROM ".$table." \".\$sqllimit;\n";
  340. $classdao.=" \$resultado=\$this->execSQL(\$sql);\n";
  341. $classdao.=" \$dados=\$this->dados(\$resultado);\n";
  342. $classdao.=" foreach(\$dados as \$d) {\n";
  343. //$classdao.=" while(\$dados=\$this->dados(\$resultado))\n";
  344. //$classdao.=" {\n";
  345. foreach ($desc as $d):
  346. $name=ucwords($d[0]);
  347. //$classdao.="var_dump(\$dados);";
  348. $classdao.=" \$objDto->set".$name."(stripslashes(\$d['".$d[0]."']));\n";
  349. //$classdao.=" \$objDto->set".$name."(stripslashes(\$dados['".$d[0]."']));\n";
  350. endforeach;
  351. $classdao.=" \$return[]=clone \$objDto;\n";
  352. $classdao.=" }\n";
  353. $classdao.=" return \$return;\n";
  354. $classdao.=" }\n\n";
  355. $classdao.=" // Select by Id\n";
  356. $classdao.=" public function getById(\$id)\n";
  357. $classdao.=" {\n";
  358. $classdao.=" \$objDto=new ".$classedto."();\n";
  359. $classdao.=" \$sql=sprintf('SELECT * FROM ".$table." WHERE codigo=\"%u\"',\$this->secsql(\$id));\n";
  360. $classdao.=" \$resultado=\$this->execSQL(\$sql);\n";
  361. $classdao.=" if(\$this->linhas(\$resultado)==1)\n";
  362. $classdao.=" {\n";
  363. $classdao.=" \$dados=\$this->dados(\$resultado);\n";
  364. $classdao.=" foreach(\$dados as \$d) {\n";
  365. foreach($desc as $d):
  366. $name=ucwords($d[0]);
  367. $classdao.=" \$objDto->set".$name."(stripslashes(\$d['".$d[0]."']));\n";
  368. endforeach;
  369. $classdao.=" \$return=clone \$objDto;\n";
  370. $classdao.=" }\n";
  371. $classdao.=" }\n";
  372. $classdao.=" else\n";
  373. $classdao.=" {\n";
  374. $classdao.=" \$return=NULL;\n";
  375. $classdao.=" }\n";
  376. $classdao.=" return \$return;\n";
  377. $classdao.=" }\n\n";
  378. $classdao.=" // Insert\n";
  379. $classdao.=" public function insert(".$classedto." \$objDto)\n";
  380. $classdao.=" {\n";
  381. $classdao.=" \$sql=sprintf('INSERT INTO ".$table." (";
  382. $c=0;
  383. foreach($desc as $d):
  384. $classdao.=$d[0];
  385. if ($c<$contador-1):
  386. $classdao.=",";
  387. endif;
  388. $c++;
  389. endforeach;
  390. $classdao.=") VALUES (";
  391. $c=0;
  392. foreach($desc as $d):
  393. if(strpos($d[1], 'int')===false):
  394. $classdao.="\"%s\"";
  395. else:
  396. $classdao.="\"%u\"";
  397. endif;
  398. if($c<$contador-1):
  399. $classdao.=",";
  400. endif;
  401. $c++;
  402. endforeach;
  403. $classdao.=")',\n";
  404. $c=0;
  405. foreach($desc as $d):
  406. $name=ucwords($d[0]);
  407. $classdao.=" \$this->secsql(\$objDto->get".$name."())";
  408. if($c<$contador-1):
  409. $classdao.=",\n";
  410. endif;
  411. $c++;
  412. endforeach;
  413. $classdao.=" );\n";
  414. $classdao.=" \$this->execSQL(\$sql);\n";
  415. $classdao.=" \$objDto->setCodigo(mysql_insert_id());\n";
  416. $classdao.=" return \$objDto;\n";
  417. $classdao.=" }\n\n";
  418. $classdao.=" // Update\n";
  419. $classdao.=" public function update(".$classedto." \$objDto)\n";
  420. $classdao.=" {\n";
  421. $classdao.=" if(!\$objDto->getCodigo())\n";
  422. $classdao.=" throw new Exception('Valor da chave primaria invalido');\n";
  423. $classdao.=" \$sql=sprintf('UPDATE ".$table." SET ";
  424. $c=0;
  425. foreach($desc as $d):
  426. if(strpos($d[1], 'int')===false):
  427. $classdao.=$d[0]."=\"%s\"";
  428. else:
  429. $classdao.=$d[0]."=\"%u\"";
  430. endif;
  431. if($c<$contador-1):
  432. $classdao.=", ";
  433. endif;
  434. $c++;
  435. endforeach;
  436. $classdao.=" WHERE codigo=\"%u\"',\n";
  437. $c=0;
  438. foreach($desc as $d):
  439. $name=ucwords($d[0]);
  440. $classdao.=" \$this->secsql(\$objDto->get".$name."())";
  441. if($c<$contador-1):
  442. $classdao.=",\n";
  443. endif;
  444. $c++;
  445. endforeach;
  446. $classdao.=" );\n";
  447. $classdao.=" \$this->execSQL(\$sql);\n";
  448. $classdao.=" }\n\n";
  449. $classdao.=" // Delete\n";
  450. $classdao.=" public function delete(".$classedto." \$objDto)\n";
  451. $classdao.=" {\n";
  452. $classdao.=" if(\$objDto->getCodigo()==NULL)\n";
  453. $classdao.=" throw new Exception('Valor da chave primaria invalido.');\n";
  454. $classdao.=" \$sql=sprintf('DELETE FROM ".$table." WHERE codigo=\"%u\"',\$this->secsql(\$objDto->getCodigo()));\n";
  455. $classdao.=" \$this->execSQL(\$sql);\n";
  456. $classdao.=" }\n\n";
  457. $classdao.=" // Save\n";
  458. $classdao.=" public function save(".$classedto." &\$objDto)\n";
  459. $classdao.=" {\n";
  460. $classdao.=" if(\$objDto->getCodigo()!== null)\n";
  461. $classdao.=" {\n";
  462. $classdao.=" \$this->update(\$objDto);\n";
  463. $classdao.=" }\n";
  464. $classdao.=" else\n";
  465. $classdao.=" {\n";
  466. $classdao.=" \$this->insert(\$objDto);\n";
  467. $classdao.=" }\n";
  468. $classdao.=" }\n\n";
  469. $classdao.=" // SecSQL\n";
  470. $classdao.=" public function secsql(\$string)\n";
  471. $classdao.=" {\n";
  472. $classdao.=" \$string=mysql_real_escape_string(\$string);\n";
  473. $classdao.=" return \$string;\n";
  474. $classdao.=" }\n";
  475. $classdao.=" }\n";
  476. if($create):
  477. eval($classdao);
  478. else:
  479. return "<?php \n".$classdao;
  480. endif;
  481. endif;
  482. } catch (PDOException $e) {
  483. throw new Exception('PDO Connection Error: '.$e->getMessage());
  484. }
  485. endif;
  486. }
  487. public function GenerateAR($table='all', $create=TRUE) {
  488. if($table=='all'):
  489. $tables=self::$connection->query('SHOW TABLES')->fetchAll();
  490. foreach($tables as $table):
  491. $this->GenerateAR($table[0], $create);
  492. endforeach;
  493. else:
  494. $table=strtolower($table);
  495. $classear=ucwords($table);
  496. $class="class ".$classear." extends ActiveRecord{\n";
  497. $class.="\tpublic function __construct(){\n";
  498. $class.="\t\tparent::__construct(get_class(\$this));\n";
  499. $class.="\t}\n";
  500. $class.="}\n";
  501. if($create):
  502. eval($class);
  503. else:
  504. return "<?php \n".$class;
  505. endif;
  506. endif;
  507. }
  508. public function LoadTable($table=NULL) {
  509. if(is_null($table)):
  510. throw new Exception ('[Erro CGM66] Tabela nao informada');
  511. else:
  512. return $this->LoadDynamicModelClass($table);
  513. endif;
  514. }
  515. public function setDsn($dsn=NULL) {
  516. if(is_null($dsn)):
  517. throw new Exception ('[Erro CGM414] DSN nao informado');
  518. else:
  519. $this->_dsn=$dsn;
  520. $dsn=preg_split('[://|:|@|/]', $this->_dsn);
  521. $this->_driver=strtolower($dsn[0]);
  522. $this->_user=$dsn[1];
  523. $this->_pass=$dsn[2];
  524. $this->_host=$dsn[3];
  525. $this->_database=$dsn[4];
  526. $this->_driveroptions=isset($dsn[5])?$dsn[5]:NULL;
  527. endif;
  528. }
  529. public function getModelName() {
  530. return $this->_model;
  531. }
  532. }