db.lib.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. /**
  3. * This is a draft
  4. *
  5. */
  6. use Doctrine\ORM\Tools\Setup;
  7. use Doctrine\ORM\EntityManager;
  8. use Doctrine\ORM\Configuration;
  9. function save($data)
  10. {
  11. db::instance()->save($data);
  12. }
  13. class db
  14. {
  15. /**
  16. * @return db
  17. */
  18. public static function instance()
  19. {
  20. static $result = null;
  21. if (empty($result)) {
  22. $result = new self();
  23. }
  24. return $result;
  25. }
  26. private static function register_autoload()
  27. {
  28. static $has_run = false;
  29. if ($has_run) {
  30. return true;
  31. }
  32. require_once api_get_path(LIBRARY_PATH) . 'symfony/Doctrine/ORM/Tools/Setup.php';
  33. $directory = api_get_path(LIBRARY_PATH) . 'symfony';
  34. //Doctrine\ORM\Tools\Setup::registerAutoloadDirectory($lib);
  35. if (!class_exists('Doctrine\Common\ClassLoader', false)) {
  36. require_once $directory . '/doctrine/Common/ClassLoader.php';
  37. }
  38. $loader = new Doctrine\Common\ClassLoader('Doctrine', $directory);
  39. $loader->register();
  40. $loader = new Doctrine\Common\ClassLoader('Symfony\Component', $directory);
  41. $loader->register();
  42. $has_run = true;
  43. }
  44. protected $config;
  45. protected $em;
  46. protected function __construct()
  47. {
  48. self::register_autoload();
  49. $connection_parameters = $this->get_connection_parameters();
  50. $this->config = Setup::createYAMLMetadataConfiguration(array(api_get_path(LIBRARY_PATH) . 'symfony/app_obj/metadata'), true);
  51. $this->em = EntityManager::create($connection_parameters, $this->config);
  52. }
  53. public function save($data)
  54. {
  55. $em = $this->em;
  56. $em->persist($data);
  57. }
  58. function test()
  59. {
  60. /* $classLoader = new ClassLoader('Doctrine', api_get_path(LIBRARY_PATH).'symfony');
  61. $classLoader->register(); */
  62. /* $config = new Doctrine\DBAL\Configuration();
  63. $conn = DriverManager::getConnection($connectionParams, $config);
  64. $sql = "SELECT * FROM user";
  65. $stmt = $conn->query($sql); // Simple, but has several drawbacks
  66. */
  67. // $lib = api_get_path(LIBRARY_PATH) . 'symfony';
  68. // Doctrine\ORM\Tools\Setup::registerAutoloadDirectory($lib);
  69. //
  70. // $config = new Configuration;
  71. // $applicationMode = 'development';
  72. //
  73. // if ($applicationMode == "development") {
  74. // $cache = new \Doctrine\Common\Cache\ArrayCache;
  75. // } else {
  76. // $cache = new \Doctrine\Common\Cache\ApcCache;
  77. // }
  78. // $config->setMetadataCacheImpl($cache);
  79. // $driverImpl = $config->newDefaultAnnotationDriver(api_get_path(LIBRARY_PATH) . 'symfony/app_obj/entities');
  80. // $config->setMetadataDriverImpl($driverImpl);
  81. // $config->setQueryCacheImpl($cache);
  82. // $config->setProxyDir(api_get_path(LIBRARY_PATH) . 'proxies');
  83. // $config->setProxyNamespace('App\Proxies');
  84. //
  85. // if ($applicationMode == "development") {
  86. // $config->setAutoGenerateProxyClasses(true);
  87. // } else {
  88. // $config->setAutoGenerateProxyClasses(false);
  89. // }
  90. require_once api_get_path(LIBRARY_PATH) . 'symfony/app_obj/entities/user.php';
  91. $user = new User();
  92. $user->setUsername('salut');
  93. $em->persist($user);
  94. $em->flush();
  95. echo "Created User with ID " . $user->getId() . "\n";
  96. }
  97. /**
  98. *
  99. * @return EntityManager The created EntityManager.
  100. */
  101. public function em()
  102. {
  103. return $this->em;
  104. }
  105. /**
  106. * Pathes?? do we put everything in one place or in several places?
  107. * @return type
  108. */
  109. public function get_model_path()
  110. {
  111. $result = __DIR__ . '/../model';
  112. $result = realpath($result);
  113. return $result;
  114. }
  115. public function is_production()
  116. {
  117. return Chamilo::is_production_server();
  118. }
  119. public function is_dev()
  120. {
  121. return !Chamilo::is_production_server();
  122. }
  123. /**
  124. * Reverse engineering of the model from the database structure.
  125. * Write result to the entity folder
  126. *
  127. * WARNING THIS WILL OVERWRITE EXISTING MODEL.
  128. *
  129. * @return boolean
  130. */
  131. public function generate_model()
  132. {
  133. if (!$this->is_dev()) {
  134. return false;
  135. }
  136. $model_path = $this->get_model_path();
  137. $connection_parameters = $this->get_connection_parameters();
  138. $connection = Doctrine\DBAL\DriverManager::getConnection($connection_parameters);
  139. $platform = $connection->getDatabasePlatform();
  140. $platform->registerDoctrineTypeMapping('enum', 'string');
  141. $platform->registerDoctrineTypeMapping('set', 'string');
  142. $config = Setup::createConfiguration($this->is_dev());
  143. $config->setMetadataDriverImpl(new Doctrine\ORM\Mapping\Driver\DatabaseDriver(new Doctrine\DBAL\Schema\MySqlSchemaManager($connection)));
  144. $em = EntityManager::create($connection, $config);
  145. $cmf = new Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
  146. $cmf->setEntityManager($em);
  147. $metadatas = $cmf->getAllMetadata();
  148. foreach ($metadatas as $metadata) {
  149. echo sprintf('Processing entity "<info>%s</info>"', $metadata->name) . '<br/>';
  150. }
  151. $generator = new EntityGenerator();
  152. $generator->setGenerateAnnotations(false);
  153. $generator->setGenerateStubMethods(true);
  154. $generator->setRegenerateEntityIfExists(true);
  155. $generator->setUpdateEntityIfExists(false);
  156. $generator->setExtension('.class.php');
  157. $generator->setNumSpaces(4);
  158. // Generating Entities
  159. $generator->generate($metadatas, $model_path);
  160. $exporter = new \Doctrine\ORM\Tools\Export\Driver\YamlExporter();
  161. $exporter->setOutputDir($model_path . '/mapping');
  162. $exporter->setMetadata($metadatas);
  163. $exporter->export();
  164. }
  165. public function update_schema($paths, $save_mode)
  166. {
  167. $is_dev = $this->is_dev();
  168. $ext = explode('.', $path);
  169. $ext = end($ext);
  170. if ($ext == 'yml') {
  171. $config = Setup::createYAMLMetadataConfiguration($paths, $is_dev);
  172. } else if ($ext == 'xml') {
  173. $config = Setup::createXMLMetadataConfiguration($paths, $is_dev);
  174. } else if ($ext == 'php') {
  175. $config = Setup::createAnnotationMetadataConfiguration($paths, $is_dev);
  176. } else {
  177. return false;
  178. }
  179. $em = $this->em;
  180. $cmf = new Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
  181. $cmf->setEntityManager($em);
  182. $classes = $cmf->getAllMetadata();
  183. $tool = new Doctrine\ORM\Tools\SchemaTool($em);
  184. return $tool->updateSchema($classes, $save_mode);
  185. }
  186. protected function get_config()
  187. {
  188. return $this->config;
  189. }
  190. protected function get_connection_parameters()
  191. {
  192. global $_configuration;
  193. $result = array(
  194. 'dbname' => $_configuration['main_database'],
  195. 'user' => $_configuration['db_user'],
  196. 'password' => $_configuration['db_password'],
  197. 'host' => $_configuration['db_host'],
  198. 'driver' => 'pdo_mysql',
  199. );
  200. return $result;
  201. }
  202. }