PageRenderTime 158ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/src/aCloud/system/core/ACloudSysCoreSqlbuilder.php

https://github.com/cuijinquan/nextwind
PHP | 106 lines | 95 code | 11 blank | 0 comment | 16 complexity | 7369c475a51e21ace50fb28a756755da MD5 | raw file
  1. <?php
  2. ! defined ( 'ACLOUD_PATH' ) && exit ( 'Forbidden' );
  3. class ACloudSysCoreSqlbuilder {
  4. public function buildSelectSql($config, $request) {
  5. if (! ACloudSysCoreS::isArray ( $config ) || ! ACloudSysCoreS::isArray ( $request ))
  6. return '';
  7. $arguments = $this->buildArguments ( $request, $config ['argument'], $config ['argument_type'] );
  8. $fields = $this->buildFields ( $request, $config ['fields'] );
  9. return $this->replaceSql ( $config ['template'], $arguments, $fields );
  10. }
  11. public function buildArguments($request, $arguments, $argumentTypes) {
  12. if (! $arguments)
  13. return array ();
  14. list ( $arguments, $argumentTypes, $result ) = array (explode ( ',', $arguments ), $this->buildArgumentTypes ( $argumentTypes ), array () );
  15. foreach ( $arguments as $argument ) {
  16. $argument = strtolower ( $argument );
  17. $argumentType = isset ( $argumentTypes [$argument] ) ? $argumentTypes [$argument] : 'int';
  18. $argumentValue = $this->getRequestArgumentValue ( $argument, $request );
  19. $result [$argument] = is_null ( $argumentValue ) ? null : $this->filterArgument ( $argument, $argumentType, $argumentValue );
  20. }
  21. return $result;
  22. }
  23. public function buildArgumentTypes($argumentTypes) {
  24. list ( $result, $argumentTypes, $allowedTypes ) = array (array (), trim ( $argumentTypes ), $this->getAllowedTypes () );
  25. if (! $argumentTypes)
  26. return $result;
  27. $argumentTypes = explode ( ',', $argumentTypes );
  28. foreach ( $argumentTypes as $argumentType ) {
  29. list ( $argument, $type ) = explode ( '|', $argumentType );
  30. $type = strtolower ( $type );
  31. ! in_array ( $type, $allowedTypes ) && $type = 'int';
  32. $result [$argument] = $type;
  33. }
  34. return $result;
  35. }
  36. public function getAllowedTypes() {
  37. return array ('int', 'array', 'string' );
  38. }
  39. public function getRequestArgumentValue($param, $request) {
  40. $charset = ACloudSysCoreCommon::getGlobal ( 'g_charset' );
  41. return isset ( $request [$param] ) ? ACloudSysCoreCommon::convert ( $request [$param], $charset, 'UTF-8' ) : null;
  42. }
  43. public function filterArgument($argument, $argumentType, $value) {
  44. if ($argumentType == 'array')
  45. return explode ( ',', $value );
  46. return $argumentType == 'int' ? intval ( $value ) : ACloudSysCoreS::sqlEscape ( $value );
  47. }
  48. public function buildFields($request, $fields) {
  49. $requestFields = $this->getRequestArgumentValue ( 'fields', $request );
  50. $fields = $fields ? explode ( ',', $fields ) : array ();
  51. if (! ACloudSysCoreS::isArray ( $fields ))
  52. return '*';
  53. if (is_null ( $requestFields ))
  54. return $this->formatFields ( $fields );
  55. $requestFields = explode ( ',', $requestFields );
  56. $intersect = (! ACloudSysCoreS::isArray ( $requestFields )) ? $fields : array_intersect ( $fields, $requestFields );
  57. ! ACloudSysCoreS::isArray ( $intersect ) && $intersect = $fields;
  58. return $this->formatFields ( $intersect );
  59. }
  60. public function formatFields($fields) {
  61. $result = array ();
  62. if (! ACloudSysCoreS::isArray ( $fields ))
  63. return '*';
  64. foreach ( $fields as $field ) {
  65. list ( $tableAlias, $fieldName ) = strpos ( $field, '.' ) === false ? array ('', $field ) : explode ( '.', $field );
  66. $result [] = ($tableAlias ? $tableAlias . '.' : '') . ACloudSysCoreS::sqlMetadata ( $fieldName );
  67. }
  68. return implode ( ',', $result );
  69. }
  70. public function replaceSql($sqlTemplate, $argumentValues, $fields) {
  71. $sqlTemplate = preg_replace ( '/\{\{(\w+?)\}\}/', '[[$1]]', $sqlTemplate );
  72. preg_match_all ( '/\{(\w+)\}/', $sqlTemplate, $matches );
  73. if (! ACloudSysCoreS::isArray ( $matches ))
  74. return '';
  75. $seg = $this->getRandString ( 4 );
  76. $sql = preg_replace ( '/\{(\w+)\}/', $seg . '{${1}}' . $seg, $sqlTemplate );
  77. foreach ( $matches [0] as $k => $v ) {
  78. $value = ($v != '{fields}') ? (is_array ( $argumentValues [$matches [1] [$k]] ) ? ACloudSysCoreS::sqlImplode ( $argumentValues [$matches [1] [$k]] ) : $argumentValues [$matches [1] [$k]]) : $fields;
  79. $sql = str_replace ( $seg . $v . $seg, $value, $sql );
  80. }
  81. $sql = preg_replace ( '/\[\[(\w+?)\]\]/', '{{$1}}', $sql );
  82. return $sql;
  83. }
  84. public function getRandString($length) {
  85. return substr ( md5 ( $this->getRandNum ( $length ) ), mt_rand ( 0, 32 - $length ), $length );
  86. }
  87. public function getRandNum($length) {
  88. mt_srand ( ( double ) microtime () * 1000000 );
  89. $randVal = mt_rand ( 1, 9 );
  90. for($i = 1; $i < $length; $i ++) {
  91. $randVal .= mt_rand ( 0, 9 );
  92. }
  93. return $randVal;
  94. }
  95. }