PageRenderTime 35ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/class/db/sql/parser/SetParser.php

https://github.com/JeCat/framework
PHP | 144 lines | 93 code | 18 blank | 33 comment | 10 complexity | 89579e9c3ed35d00653aa33d4eecfb8a MD5 | raw file
  1. <?php
  2. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3. // 这个文件是 JeCat PHP框架的一部分,该项目和此文件 均遵循 GNU 自由软件协议
  4. //
  5. // Copyleft 2008-2012 JeCat.cn(http://team.JeCat.cn)
  6. //
  7. //
  8. // JeCat PHP框架 的正式全名是:Jellicle Cat PHP Framework。
  9. // “Jellicle Cat”出自 Andrew Lloyd Webber的音乐剧《猫》(《Prologue:Jellicle Songs for Jellicle Cats》)。
  10. // JeCat 是一个开源项目,它像音乐剧中的猫一样自由,你可以毫无顾忌地使用JCAT PHP框架。JCAT 由中国团队开发维护。
  11. // 正在使用的这个版本是:0.7.1
  12. //
  13. //
  14. //
  15. // 相关的链接:
  16. // [主页] http://www.JeCat.cn
  17. // [源代码] https://github.com/JeCat/framework
  18. // [下载(http)] https://nodeload.github.com/JeCat/framework/zipball/master
  19. // [下载(git)] git clone git://github.com/JeCat/framework.git jecat
  20. // 不很相关:
  21. // [MP3] http://www.google.com/search?q=jellicle+songs+for+jellicle+cats+Andrew+Lloyd+Webber
  22. // [VCD/DVD] http://www.google.com/search?q=CAT+Andrew+Lloyd+Webber+video
  23. //
  24. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  25. /*-- Project Introduce --*/
  26. namespace org\jecat\framework\db\sql\parser ;
  27. use org\jecat\framework\db\sql\SQL;
  28. class SetParser extends AbstractParser
  29. {
  30. public function processToken(&$sToken,ParseState $aParseState)
  31. {
  32. if( $sToken === 'SET' )
  33. {
  34. return ;
  35. }
  36. // 遇到赋值运算符
  37. if( $sToken === '=' )
  38. {
  39. if( count($aParseState->arrTree)<2 ) // ['tmp_parent_tree']
  40. {
  41. throw new SqlParserException($aParseState,'SET 表达式的赋值符号(=)前,缺少有效的字段。') ;
  42. }
  43. // 切换回 set 表达式
  44. $this->restoreParentTree($aParseState) ;
  45. $arrAssignmentToken =& $aParseState->lastTokenInTree() ;
  46. if( empty($arrAssignmentToken['expr_type']) or $arrAssignmentToken['expr_type']!=='assignment' )
  47. {
  48. throw new SqlParserException($aParseState,'SET 表达式的赋值符号(=)前,不是有效的字段。') ;
  49. }
  50. $arrColumnToken = end($arrAssignmentToken['pretree']) ;
  51. if( empty($arrColumnToken['expr_type']) or $arrColumnToken['expr_type']!=='column' )
  52. {
  53. throw new SqlParserException($aParseState,'SET 表达式的赋值符号(=)前,不是有效的字段。') ;
  54. }
  55. $arrAssignmentToken['pretree'][] = '=' ;
  56. // 给赋值语句 按照字段名称 设置键
  57. if( !empty($arrColumnToken['table']) )
  58. {
  59. $sClm = $arrColumnToken['table'].'.'.$arrColumnToken['column'] ;
  60. }
  61. else
  62. {
  63. $sClm = $arrColumnToken['column'] ;
  64. }
  65. array_pop($aParseState->arrTree) ;
  66. $aParseState->arrTree[$sClm] =& $arrAssignmentToken ;
  67. // 切换到 赋值语句的 subtree
  68. $this->switchToSubTree($aParseState,$arrAssignmentToken) ;
  69. }
  70. // 开始下一个赋值表达式
  71. else if( $sToken === ',' )
  72. {
  73. // 切换回 set 表达式
  74. $this->restoreParentTree($aParseState) ;
  75. // 新建一个 赋值表达式
  76. $arrAssignmentToken = array(
  77. 'expr_type' => 'assignment' ,
  78. 'pretree' => array() ,
  79. 'subtree' => array() ,
  80. ) ;
  81. $aParseState->arrTree[] = ',' ;
  82. $aParseState->arrTree[] =& $arrAssignmentToken ;
  83. // 切换到 赋值语句的 pretree
  84. $this->switchToSubTree($aParseState,$arrAssignmentToken,'pretree') ;
  85. }
  86. else
  87. {
  88. $aParseState->arrTree[] = $sToken ;
  89. }
  90. }
  91. public function examineStateChange(&$sToken,ParseState $aParseState)
  92. {
  93. $sPrevToken = prev($aParseState->arrTokenList) ;
  94. if($sPrevToken===false)
  95. {
  96. reset($aParseState->arrTokenList) ;
  97. }
  98. else
  99. {
  100. next($aParseState->arrTokenList) ;
  101. }
  102. return $sPrevToken!=='CHARACTER' and $sToken==='SET' ;
  103. }
  104. public function active(& $sToken,ParseState $aParseState)
  105. {
  106. $aParseState->arrTree[SQL::CLAUSE_SET] = array(
  107. 'expr_type' => 'clause_set' ,
  108. 'pretree' => array('SET') ,
  109. 'subtree' => array() ,
  110. ) ;
  111. $this->switchToSubTree($aParseState,$aParseState->arrTree[SQL::CLAUSE_SET]) ;
  112. // 第一条赋值语句
  113. $arrAssignmentToken = array(
  114. 'expr_type' => 'assignment' ,
  115. 'pretree' => array() ,
  116. 'subtree' => array() ,
  117. ) ;
  118. $aParseState->arrTree[] =& $arrAssignmentToken ;
  119. $this->switchToSubTree($aParseState,$arrAssignmentToken,'pretree') ;
  120. }
  121. public function finish(& $sToken,ParseState $aParseState)
  122. {
  123. $this->restoreParentTree($aParseState) ;
  124. $this->restoreParentTree($aParseState) ;
  125. }
  126. }