table_common_member_archive.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: table_common_member_archive.php 29613 2012-04-23 04:19:05Z zhangguosheng $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class table_common_member_archive extends table_common_member
  12. {
  13. public function __construct() {
  14. parent::__construct();
  15. $this->_table = 'common_member_archive';
  16. $this->_pk = 'uid';
  17. }
  18. public function fetch($id){
  19. $data = array();
  20. if(isset($this->membersplit) && ($id = dintval($id)) && ($data = DB::fetch_first('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field($this->_pk, $id)))) {
  21. $data['_inarchive'] = true;
  22. }
  23. return $data;
  24. }
  25. public function fetch_by_username($username) {
  26. $user = array();
  27. if(isset($this->membersplit) && $username && ($user = DB::fetch_first('SELECT * FROM %t WHERE username=%s', array($this->_table, $username)))) {
  28. $user['_inarchive'] = true;
  29. }
  30. return $user;
  31. }
  32. public function fetch_uid_by_username($username) {
  33. $uid = 0;
  34. if(isset($this->membersplit) && $username) {
  35. $uid = DB::result_first('SELECT uid FROM %t WHERE username=%s', array($this->_table, $username));
  36. }
  37. return $uid;
  38. }
  39. public function count() {
  40. return isset($this->membersplit) ? DB::result_first('SELECT COUNT(*) FROM %t', array($this->_table)) : 0;
  41. }
  42. public function fetch_by_email($email) {
  43. $user = array();
  44. if(isset($this->membersplit) && $email && ($user = DB::fetch_first('SELECT * FROM %t WHERE email=%s', array($this->_table, $email)))) {
  45. $user['_inarchive'] = true;
  46. }
  47. return $user;
  48. }
  49. public function count_by_email($email) {
  50. $count = 0;
  51. if(isset($this->membersplit) && $email) {
  52. $count = DB::result_first('SELECT COUNT(*) FROM %t WHERE email=%s', array($this->_table, $email));
  53. }
  54. return $count;
  55. }
  56. public function fetch_all($ids) {
  57. $data = array();
  58. if(isset($this->membersplit) && ($ids = dintval($ids, true))) {
  59. $query = DB::query('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field($this->_pk, $ids));
  60. while($value = DB::fetch($query)) {
  61. $value['_inarchive'] = true;
  62. $data[$value[$this->_pk]] = $value;
  63. }
  64. }
  65. return $data;
  66. }
  67. public function move_to_master($uid){
  68. if(isset($this->membersplit) && ($uid = intval($uid)) && ($member = $this->fetch($uid))) {
  69. unset($member['_inarchive']);
  70. DB::insert('common_member',$member);
  71. C::t('common_member_count')->insert(C::t('common_member_count_archive')->fetch($uid));
  72. C::t('common_member_status')->insert(C::t('common_member_status_archive')->fetch($uid));
  73. C::t('common_member_profile')->insert(C::t('common_member_profile_archive')->fetch($uid));
  74. C::t('common_member_field_home')->insert(C::t('common_member_field_home_archive')->fetch($uid));
  75. C::t('common_member_field_forum')->insert(C::t('common_member_field_forum_archive')->fetch($uid));
  76. $this->delete($uid);
  77. C::t('common_member_count_archive')->delete($uid);
  78. C::t('common_member_status_archive')->delete($uid);
  79. C::t('common_member_profile_archive')->delete($uid);
  80. C::t('common_member_field_home_archive')->delete($uid);
  81. C::t('common_member_field_forum_archive')->delete($uid);
  82. }
  83. }
  84. public function delete($val, $unbuffered = false) {
  85. return isset($this->membersplit) && ($val = dintval($val, true)) && DB::delete($this->_table, DB::field($this->_pk, $val), null, $unbuffered);
  86. }
  87. public function check_table() {
  88. if(DB::fetch_first("SHOW TABLES LIKE '".DB::table('common_member_archive')."'")){
  89. return false;
  90. } else {
  91. $mastertables = array('common_member', 'common_member_count', 'common_member_status', 'common_member_profile', 'common_member_field_home', 'common_member_field_forum');
  92. foreach($mastertables as $tablename) {
  93. $createtable = DB::fetch_first('SHOW CREATE TABLE '.DB::table($tablename));
  94. DB::query(str_replace(DB::table($tablename), DB::table("{$tablename}_archive"), $createtable['Create Table']));
  95. }
  96. return true;
  97. }
  98. }
  99. public function rebuild_table($step) {
  100. $mastertables = array('common_member', 'common_member_count', 'common_member_status', 'common_member_profile', 'common_member_field_home', 'common_member_field_forum');
  101. if(!isset($mastertables[$step])) {
  102. return false;
  103. }
  104. $updates = array();
  105. $mastertable = DB::table($mastertables[$step]);
  106. $archivetable = DB::table($mastertables[$step].'_archive');
  107. $mastercols = DB::fetch_all('SHOW COLUMNS FROM '.$mastertable, null, 'Field');
  108. $archivecols = DB::fetch_all('SHOW COLUMNS FROM '.$archivetable, null, 'Field');
  109. foreach(array_diff(array_keys($archivecols), array_keys($mastercols)) as $field) {
  110. $updates[] = "DROP `$field`";
  111. }
  112. $createtable = DB::fetch_first('SHOW CREATE TABLE '.$mastertable);
  113. $mastercols = $this->getcolumn($createtable['Create Table']);
  114. $archivecreatetable = DB::fetch_first('SHOW CREATE TABLE '.$archivetable);
  115. $oldcols = $this->getcolumn($archivecreatetable['Create Table']);
  116. $indexmastercols =array_keys($mastercols);
  117. foreach ($mastercols as $key => $value) {
  118. if($key == 'PRIMARY') {
  119. if($value != $oldcols[$key]) {
  120. if(!empty($oldcols[$key])) {
  121. $usql = "RENAME TABLE ".$archivetable." TO ".$archivetable.'_bak';
  122. if(!DB::query($usql, 'SILENT')) {
  123. return $mastertable;
  124. }
  125. }
  126. $updates[] = "ADD PRIMARY KEY $value";
  127. }
  128. } elseif ($key == 'KEY') {
  129. foreach ($value as $subkey => $subvalue) {
  130. if(!empty($oldcols['KEY'][$subkey])) {
  131. if($subvalue != $oldcols['KEY'][$subkey]) {
  132. $updates[] = "DROP INDEX `$subkey`";
  133. $updates[] = "ADD INDEX `$subkey` $subvalue";
  134. }
  135. } else {
  136. $updates[] = "ADD INDEX `$subkey` $subvalue";
  137. }
  138. }
  139. } elseif ($key == 'UNIQUE') {
  140. foreach ($value as $subkey => $subvalue) {
  141. if(!empty($oldcols['UNIQUE'][$subkey])) {
  142. if($subvalue != $oldcols['UNIQUE'][$subkey]) {
  143. $updates[] = "DROP INDEX `$subkey`";
  144. $updates[] = "ADD UNIQUE INDEX `$subkey` $subvalue";
  145. }
  146. } else {
  147. $usql = "ALTER TABLE ".$archivetable." DROP INDEX `$subkey`";
  148. DB::query($usql, 'SILENT');
  149. $updates[] = "ADD UNIQUE INDEX `$subkey` $subvalue";
  150. }
  151. }
  152. } else {
  153. if(!empty($oldcols[$key])) {
  154. if(strtolower($value) != strtolower($oldcols[$key])) {
  155. $updates[] = "CHANGE `$key` `$key` $value";
  156. }
  157. } else {
  158. $i = array_search($key, $indexmastercols);
  159. $fieldposition = $i > 0 ? 'AFTER '.$indexmastercols[$i-1] : 'FIRST';
  160. $updates[] = "ADD `$key` $value $fieldposition";
  161. }
  162. }
  163. }
  164. $ret = true;
  165. if(!empty($updates)) {
  166. if(!DB::query("ALTER TABLE ".$archivetable." ".implode(', ', $updates), 'SILENT')) {
  167. $ret = $mastertable;
  168. } else {
  169. }
  170. }
  171. return $ret;
  172. }
  173. private function getcolumn($creatsql) {
  174. $creatsql = preg_replace("/ COMMENT '.*?'/i", '', $creatsql);
  175. $matchs = array();
  176. preg_match("/\((.+)\)\s*(ENGINE|TYPE)\s*\=/is", $creatsql, $matchs);
  177. $cols = explode("\n", $matchs[1]);
  178. $newcols = array();
  179. foreach ($cols as $value) {
  180. $value = trim($value);
  181. if(empty($value)) continue;
  182. $value = $this->remakesql($value);
  183. if(substr($value, -1) == ',') $value = substr($value, 0, -1);
  184. $vs = explode(' ', $value);
  185. $cname = $vs[0];
  186. if($cname == 'KEY' || $cname == 'INDEX' || $cname == 'UNIQUE') {
  187. $name_length = strlen($cname);
  188. if($cname == 'UNIQUE') $name_length = $name_length + 4;
  189. $subvalue = trim(substr($value, $name_length));
  190. $subvs = explode(' ', $subvalue);
  191. $subcname = $subvs[0];
  192. $newcols[$cname][$subcname] = trim(substr($value, ($name_length+2+strlen($subcname))));
  193. } elseif($cname == 'PRIMARY') {
  194. $newcols[$cname] = trim(substr($value, 11));
  195. } else {
  196. $newcols[$cname] = trim(substr($value, strlen($cname)));
  197. }
  198. }
  199. return $newcols;
  200. }
  201. private function remakesql($value) {
  202. $value = trim(preg_replace("/\s+/", ' ', $value));
  203. $value = str_replace(array('`',', ', ' ,', '( ' ,' )', 'mediumtext'), array('', ',', ',','(',')','text'), $value);
  204. return $value;
  205. }
  206. }
  207. ?>