PageRenderTime 40ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/UC_DBClass.php

http://phpdbmanagement.codeplex.com
PHP | 439 lines | 295 code | 85 blank | 59 comment | 18 complexity | a7003f6622c7a5e967c02c41490c6f3d MD5 | raw file
  1. <?php
  2. require_once 'UC_DBBase.php';
  3. require_once '/CodeModel_Classes/PHPCodeProvider.php';
  4. require_once '/PHPFileSystem_Classes/UC_PHPFileSystem.php';
  5. require_once '/PHPFileSystem_Classes/UC_PHPTextStream.php';
  6. require_once '/PHPFileSystem_Classes/UC_PHPIOMode.php';
  7. abstract class UC_DBClass extends UC_DBBase
  8. {
  9. public function __construct(UC_DBServer $Server)
  10. {
  11. parent::__construct($Server);
  12. $result_set = $this->get_Server_()->get_PDO()->query($this->select_statement);
  13. if($result_set)
  14. {
  15. if($result_set->rowCount() == 1)
  16. {
  17. $this->table_row = $result_set->fetch();
  18. }
  19. else
  20. {
  21. throw new Exception();
  22. }
  23. }
  24. else
  25. {
  26. throw new Exception();
  27. }
  28. }
  29. public function Associators_()
  30. {
  31. ;
  32. }
  33. public function Clone_()
  34. {
  35. ;
  36. }
  37. public function CompareTo_()
  38. {
  39. ;
  40. }
  41. public static final function CreateFromTable_(
  42. UC_DBServer $Server, $database_name, $table_name, $create_new = false)
  43. {
  44. /*
  45. * Make sure $database_name and $table_name are strings
  46. */
  47. if(!is_string($database_name))
  48. {
  49. throw new InvalidArgumentException(
  50. 'The database name should be a string.');
  51. }
  52. if(!is_string($table_name))
  53. {
  54. throw new InvalidArgumentException(
  55. 'The table name should be a string.');
  56. }
  57. /*
  58. * Check if the database exists
  59. */
  60. $db_path = new UC_DBObjectPath();
  61. $db_path->set_Server($Server);
  62. $db_path->set_is_Database(true);
  63. $db_path->set_Name($database_name);
  64. if(!UC_Database::Exists_($db_path))
  65. {
  66. throw new InvalidArgumentException(
  67. "The database does not exist : $database_name");
  68. }
  69. /*
  70. * Check if the table exists and if it does
  71. * get its UC_Table object
  72. */
  73. $table_path = new UC_DBObjectPath();
  74. $table_path->set_Server($Server);
  75. $table_path->set_Schema($database_name);
  76. $table_path->set_is_Table(true);
  77. $table_path->set_Table($table_name);
  78. $table_path->set_Name($table_name);
  79. if(UC_Table::Exists_($table_path))
  80. {
  81. $table = UC_Table::Get_($table_path);
  82. }
  83. else
  84. {
  85. throw new InvalidArgumentException(
  86. "Unable to locate table: $table_name");
  87. }
  88. /*
  89. * Get the table primary keys
  90. */
  91. $primary_keys = array();
  92. foreach($table->get_Columns() as $column)
  93. {
  94. if($column->get_InPrimaryKey())
  95. {
  96. $primary_keys[] = $column->get_Name();
  97. }
  98. }
  99. if(count($primary_keys) == 0)
  100. {
  101. throw new UC_DBException(
  102. "The table $table_name needs to have at least one primary key.");
  103. }
  104. /*
  105. * Create the UC_DBClass child class
  106. */
  107. $table_class = new TypeDeclaration(
  108. 'UC_DBClass_' . $database_name . '_' . $table_name);
  109. $table_class->BaseTypes->add(new TypeReference('UC_DBClass'));
  110. /*
  111. * Add getter and setter methods to the class.
  112. */
  113. foreach($table->get_Columns() as $column)
  114. {
  115. /*
  116. * For each table column add a private field to the class
  117. */
  118. $field = new Field($column->get_Name());
  119. $field->Attributes->set_private(true);
  120. $table_class->Members->add($field);
  121. /*
  122. * Add getter method for each column
  123. */
  124. $getter = new Method('get_' . $field->get_name());
  125. $getter->Statements->add(new ExpressionStatement(
  126. new SnippetExpression('return $this->' . $column->get_Name())));
  127. $table_class->Members->add($getter);
  128. /*
  129. * Add setter method only if column is not in primary key
  130. */
  131. if(!$column->get_InPrimaryKey())
  132. {
  133. $setter = new Method('set_' . $field->get_name());
  134. $setter->Parameters->add(
  135. new ParameterDeclarationExpression($column->get_Name()));
  136. $setter->Statements->add(new AssignStatement(
  137. new FieldReferenceExpression(
  138. $column->get_Name(), new ThisReferenceExpression()),
  139. new VariableReferenceExpression($column->get_Name())));
  140. /*
  141. * If the setter is used, the table row values may have changed
  142. */
  143. $set_touched = new MethodReferenceExpression(
  144. 'set_Touched_', new ThisReferenceExpression());
  145. $set_touched_invoke = new MethodInvokeExpression($set_touched);
  146. $set_touched_invoke->Parameters->add(new PrimitiveExpression(true));
  147. $setter->Statements->add(new ExpressionStatement($set_touched_invoke));
  148. $table_class->Members->add($setter);
  149. }
  150. }
  151. /*
  152. * The constructor
  153. * Add parameter for the server.
  154. */
  155. $constructor = new Method('__construct');
  156. $constructor->Parameters->add(new ParameterDeclarationExpression('Server'));
  157. $constructor->Parameters[0]->set_TypeHint(new TypeReference('UC_DBServer'));
  158. /*
  159. * Add parameter to the constructor for each primary key
  160. */
  161. foreach($primary_keys as $primary_key)
  162. {
  163. $constructor->Parameters->add(
  164. new ParameterDeclarationExpression($primary_key));
  165. }
  166. /*
  167. * Construct the Select statement to get the row from the table
  168. */
  169. $query_string = "Select * From $database_name.$table_name Where ";
  170. $first_key = true;
  171. for($i = 0; $i < count($primary_keys); $i++)
  172. {
  173. if($first_key)
  174. {
  175. $first_key = false;
  176. $query_string .= $primary_keys[$i] . " = '" . "\$" .
  177. $constructor->Parameters[$i + 1]->get_Name() . "'";
  178. }
  179. else
  180. {
  181. $query_string .= " And " . $primary_keys[$i] . " = '" . "\$" .
  182. $constructor->Parameters[$i + 1]->get_Name() . "'";
  183. }
  184. }
  185. /*
  186. * Add the Select statement to the constructor
  187. */
  188. $select_statement = new AssignStatement(
  189. new FieldReferenceExpression('select_statement', new ThisReferenceExpression()),
  190. new DoubleQuotedStringExpression($query_string));
  191. $constructor->Statements->add($select_statement);
  192. /*
  193. * Invoke the parent constructor
  194. */
  195. $invoke_parent_statement = new ExpressionStatement(
  196. new MethodInvokeExpression(
  197. new MethodReferenceExpression(
  198. '__construct', new ParentReferenceExpression())));
  199. $invoke_parent_statement->Expression->Parameters->add(
  200. new VariableReferenceExpression('Server'));
  201. $constructor->Statements->add($invoke_parent_statement);
  202. /*
  203. * Assign row values to corresponding properties
  204. */
  205. foreach($table->get_Columns() as $column)
  206. {
  207. $indexer_expr = new ArrayIndexerExpression();
  208. $indexer_expr->TargetObject =
  209. new FieldReferenceExpression('table_row', new ThisReferenceExpression());
  210. $indexer_expr->Indices->add(new PrimitiveExpression($column->get_Name()));
  211. $assign_statement = new AssignStatement(
  212. new FieldReferenceExpression($column->get_Name(), new ThisReferenceExpression()),
  213. $indexer_expr);
  214. $constructor->Statements->add($assign_statement);
  215. }
  216. $table_class->Members->add($constructor);
  217. /*
  218. * The Put_() method updates the table row
  219. */
  220. $put_method = new Method('Put_');
  221. /*
  222. * Construct the Update statement
  223. */
  224. $update_query = "UPDATE $database_name.$table_name ";
  225. $first_column = true;
  226. foreach($table->get_Columns() as $column)
  227. {
  228. if(!$column->get_InPrimaryKey())
  229. {
  230. if($first_column)
  231. {
  232. $first_column = false;
  233. $update_query .= "SET " . $column->get_Name() . " = '"
  234. . "{\$this->get_" . $column->get_Name() . "()}'";
  235. }
  236. else
  237. {
  238. $update_query .= ", " . $column->get_Name() . " = '"
  239. . "{\$this->get_" . $column->get_Name() . "()}'";
  240. }
  241. }
  242. }
  243. $update_query .= " WHERE ";
  244. $first_column = true;
  245. foreach($primary_keys as $primary_key)
  246. {
  247. if($first_column)
  248. {
  249. $first_column = false;
  250. $update_query .= $primary_key .
  251. " = '{\$this->get_" . $primary_key . "()}' ";
  252. }
  253. else
  254. {
  255. $update_query .= " AND " . $primary_key .
  256. " = '{\$this->get_" . $primary_key . "()}' ";
  257. }
  258. }
  259. $put_method->Statements->add(
  260. new AssignStatement(
  261. new FieldReferenceExpression('update_statement', new ThisReferenceExpression()),
  262. new DoubleQuotedStringExpression($update_query)));
  263. $put_method->Statements->add(
  264. new ExpressionStatement(
  265. new MethodInvokeExpression(
  266. new MethodReferenceExpression('Put_', new ParentReferenceExpression()))));
  267. $table_class->Members->add($put_method);
  268. /*
  269. * The Delete_() method
  270. */
  271. $delete_method = new Method('Delete_');
  272. $delete_query = "DELETE FROM $database_name.$table_name WHERE ";
  273. $first_column = true;
  274. foreach($primary_keys as $primary_key)
  275. {
  276. if($first_column)
  277. {
  278. $first_column = false;
  279. $delete_query .= $primary_key .
  280. " = '{\$this->get_" . $primary_key . "()}' ";
  281. }
  282. else
  283. {
  284. $delete_query .= " AND " . $primary_key .
  285. " = '{\$this->get_" . $primary_key . "()}' ";
  286. }
  287. }
  288. $delete_method->Statements->add(
  289. new AssignStatement(
  290. new FieldReferenceExpression('delete_statement', new ThisReferenceExpression()),
  291. new DoubleQuotedStringExpression($delete_query)));
  292. $delete_method->Statements->add(
  293. new ExpressionStatement(new MethodInvokeExpression(
  294. new MethodReferenceExpression('Delete_', new ParentReferenceExpression()))));
  295. $table_class->Members->add($delete_method);
  296. $options = new CodeGeneratorOptions();
  297. $options->set_VerbatimOrder(false);
  298. $writer = new IndentedTextWriter();
  299. $provider = new PHPCodeProvider();
  300. $provider->generateCodeFromType($table_class, $writer, $options);
  301. echo '<pre>' . str_replace('<br />', '', highlight_string($writer->get_String(), true)) . '<pre/>';
  302. $file = UC_PHPFileSystem::create_text_file(dirname(__FILE__) .
  303. '/Database_Classes/UC_DBClass_' .
  304. $database_name . '_' . $table_name . '.php', true);
  305. $file->write_line('<?php');
  306. $file->write_line($writer->get_String());
  307. $file->write_line('?>');
  308. $file->close();
  309. }
  310. public function Delete_()
  311. {
  312. $this->get_Server_()->get_PDO()->exec($this->delete_statement);
  313. }
  314. public function ExecuteMethod_()
  315. {
  316. ;
  317. }
  318. static function Exists_(UC_DBObjectPath $object_path)
  319. {
  320. ;
  321. }
  322. static function Get_(UC_DBObjectPath $object_path)
  323. {
  324. ;
  325. }
  326. static function Instances_()
  327. {
  328. ;
  329. }
  330. public function Put_()
  331. {
  332. if($this->get_Touched_())
  333. {
  334. $this->get_Server_()->get_PDO()->exec($this->update_statement);
  335. }
  336. }
  337. public function References_()
  338. {
  339. ;
  340. }
  341. static function SpawnInstance_()
  342. {
  343. ;
  344. }
  345. protected $database_name;
  346. protected $table_name;
  347. protected $table_row;
  348. protected $primary_keys = array();
  349. protected $select_statement;
  350. protected $update_statement;
  351. protected $delete_statement;
  352. protected $where_clause;
  353. }
  354. ?>