Upgrade.php 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402
  1. <?php
  2. namespace Utils;
  3. use Typecho\Common;
  4. use Typecho\Db;
  5. use Typecho\Exception;
  6. use Widget\Options;
  7. use Widget\Themes\Edit;
  8. use Widget\Upload;
  9. /**
  10. * 升级程序
  11. *
  12. * @category typecho
  13. * @package Upgrade
  14. * @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)
  15. * @license GNU General Public License 2.0
  16. */
  17. class Upgrade
  18. {
  19. /**
  20. * 升级至9.1.7
  21. *
  22. * @access public
  23. * @param Db $db 数据库对象
  24. * @param Options $options 全局信息组件
  25. * @return void
  26. */
  27. public static function v0_3r9_1_7($db, $options)
  28. {
  29. /** 转换评论 */
  30. $i = 1;
  31. while (true) {
  32. $result = $db->query($db->select('coid', 'text')->from('table.comments')
  33. ->order('coid', Db::SORT_ASC)->page($i, 100));
  34. $j = 0;
  35. while ($row = $db->fetchRow($result)) {
  36. $text = nl2br($row['text']);
  37. $db->query($db->update('table.comments')
  38. ->rows(['text' => $text])
  39. ->where('coid = ?', $row['coid']));
  40. $j++;
  41. unset($text);
  42. unset($row);
  43. }
  44. if ($j < 100) {
  45. break;
  46. }
  47. $i++;
  48. unset($result);
  49. }
  50. /** 转换内容 */
  51. $i = 1;
  52. while (true) {
  53. $result = $db->query($db->select('cid', 'text')->from('table.contents')
  54. ->order('cid', Db::SORT_ASC)->page($i, 100));
  55. $j = 0;
  56. while ($row = $db->fetchRow($result)) {
  57. $text = preg_replace(
  58. [
  59. "/\s*<p>/is", "/\s*<\/p>\s*/is", "/\s*<br\s*\/>\s*/is",
  60. "/\s*<(div|blockquote|pre|table|ol|ul)>/is", "/<\/(div|blockquote|pre|table|ol|ul)>\s*/is"
  61. ],
  62. ['', "\n\n", "\n", "\n\n<\\1>", "</\\1>\n\n"],
  63. $row['text']
  64. );
  65. $db->query($db->update('table.contents')
  66. ->rows(['text' => $text])
  67. ->where('cid = ?', $row['cid']));
  68. $j++;
  69. unset($text);
  70. unset($row);
  71. }
  72. if ($j < 100) {
  73. break;
  74. }
  75. $i++;
  76. unset($result);
  77. }
  78. }
  79. /**
  80. * 升级至9.1.14
  81. *
  82. * @access public
  83. * @param Db $db 数据库对象
  84. * @param Options $options 全局信息组件
  85. * @return void
  86. */
  87. public static function v0_4r9_1_14($db, $options)
  88. {
  89. if (is_writeable(__TYPECHO_ROOT_DIR__ . '/config.inc.php')) {
  90. $handle = fopen(__TYPECHO_ROOT_DIR__ . '/config.inc.php', 'ab');
  91. fwrite($handle, '
  92. /** 初始化时区 */
  93. Typecho_Date::setTimezoneOffset($options->timezone);
  94. ');
  95. fclose($handle);
  96. } else {
  97. throw new Exception(_t('config.inc.php 文件无法写入, 请将它的权限设置为可写'));
  98. }
  99. }
  100. /**
  101. * 升级至9.2.3
  102. *
  103. * @access public
  104. * @param Db $db 数据库对象
  105. * @param Options $options 全局信息组件
  106. * @return void
  107. */
  108. public static function v0_5r9_2_3($db, $options)
  109. {
  110. /** 转换评论 */
  111. $i = 1;
  112. while (true) {
  113. $result = $db->query($db->select('coid', 'text')->from('table.comments')
  114. ->order('coid', Db::SORT_ASC)->page($i, 100));
  115. $j = 0;
  116. while ($row = $db->fetchRow($result)) {
  117. $text = preg_replace("/\s*<br\s*\/>\s*/i", "\n", $row['text']);
  118. $db->query($db->update('table.comments')
  119. ->rows(['text' => $text])
  120. ->where('coid = ?', $row['coid']));
  121. $j++;
  122. unset($text);
  123. unset($row);
  124. }
  125. if ($j < 100) {
  126. break;
  127. }
  128. $i++;
  129. unset($result);
  130. }
  131. }
  132. /**
  133. * 升级至9.2.18
  134. *
  135. * @access public
  136. * @param Db $db 数据库对象
  137. * @param Options $options 全局信息组件
  138. * @return void
  139. */
  140. public static function v0_5r9_2_18($db, $options)
  141. {
  142. /** 升级编辑器接口 */
  143. $db->query($db->update('table.options')
  144. ->rows(['value' => 350])
  145. ->where('name = ?', 'editorSize'));
  146. }
  147. /**
  148. * 升级至9.2.25
  149. *
  150. * @access public
  151. * @param Db $db 数据库对象
  152. * @param Options $options 全局信息组件
  153. * @return void
  154. */
  155. public static function v0_5r9_2_25($db, $options)
  156. {
  157. /** 升级编辑器接口 */
  158. $db->query($db->insert('table.options')
  159. ->rows(['name' => 'useRichEditor', 'user' => 0, 'value' => 1]));
  160. }
  161. /**
  162. * 升级至9.4.3
  163. *
  164. * @access public
  165. * @param Db $db 数据库对象
  166. * @param Options $options 全局信息组件
  167. * @return void
  168. */
  169. public static function v0_6r9_4_3($db, $options)
  170. {
  171. /** 修改数据库字段 */
  172. $adapterName = $db->getAdapterName();
  173. $prefix = $db->getPrefix();
  174. //删除老数据
  175. try {
  176. switch (true) {
  177. case false !== strpos($adapterName, 'Mysql'):
  178. $db->query('ALTER TABLE `' . $prefix . 'users` DROP `meta`', Db::WRITE);
  179. break;
  180. case false !== strpos($adapterName, 'Pgsql'):
  181. $db->query('ALTER TABLE "' . $prefix . 'users" DROP COLUMN "meta"', Db::WRITE);
  182. break;
  183. case false !== strpos($adapterName, 'SQLite'):
  184. $uuid = uniqid();
  185. $db->query('CREATE TABLE ' . $prefix . 'users_' . $uuid . ' ( "uid" INTEGER NOT NULL PRIMARY KEY,
  186. "name" varchar(32) default NULL ,
  187. "password" varchar(64) default NULL ,
  188. "mail" varchar(150) default NULL ,
  189. "url" varchar(150) default NULL ,
  190. "screenName" varchar(32) default NULL ,
  191. "created" int(10) default \'0\' ,
  192. "activated" int(10) default \'0\' ,
  193. "logged" int(10) default \'0\' ,
  194. "group" varchar(16) default \'visitor\' ,
  195. "authCode" varchar(64) default NULL)', Db::WRITE);
  196. $db->query('INSERT INTO ' . $prefix . 'users_' . $uuid . ' ("uid", "name", "password", "mail", "url"
  197. , "screenName", "created", "activated", "logged", "group", "authCode") SELECT "uid", "name", "password", "mail", "url"
  198. , "screenName", "created", "activated", "logged", "group", "authCode" FROM ' . $prefix . 'users', Db::WRITE);
  199. $db->query('DROP TABLE ' . $prefix . 'users', Db::WRITE);
  200. $db->query('CREATE TABLE ' . $prefix . 'users ( "uid" INTEGER NOT NULL PRIMARY KEY,
  201. "name" varchar(32) default NULL ,
  202. "password" varchar(64) default NULL ,
  203. "mail" varchar(150) default NULL ,
  204. "url" varchar(150) default NULL ,
  205. "screenName" varchar(32) default NULL ,
  206. "created" int(10) default \'0\' ,
  207. "activated" int(10) default \'0\' ,
  208. "logged" int(10) default \'0\' ,
  209. "group" varchar(16) default \'visitor\' ,
  210. "authCode" varchar(64) default NULL)', Db::WRITE);
  211. $db->query('INSERT INTO ' . $prefix . 'users SELECT * FROM ' . $prefix . 'users_' . $uuid, Db::WRITE);
  212. $db->query('DROP TABLE ' . $prefix . 'users_' . $uuid, Db::WRITE);
  213. $db->query('CREATE UNIQUE INDEX ' . $prefix . 'users_name ON ' . $prefix . 'users ("name")', Db::WRITE);
  214. $db->query('CREATE UNIQUE INDEX ' . $prefix . 'users_mail ON ' . $prefix . 'users ("mail")', Db::WRITE);
  215. $db->flushPool();
  216. break;
  217. default:
  218. break;
  219. }
  220. } catch (Db_Exception $e) {
  221. //do nothing
  222. }
  223. //将slug字段长度增加到150
  224. try {
  225. switch (true) {
  226. case false !== strpos($adapterName, 'Mysql'):
  227. $db->query("ALTER TABLE `" . $prefix . "contents` MODIFY COLUMN `slug` varchar(150)", Db::WRITE);
  228. $db->query("ALTER TABLE `" . $prefix . "metas` MODIFY COLUMN `slug` varchar(150)", Db::WRITE);
  229. break;
  230. case false !== strpos($adapterName, 'Pgsql'):
  231. $db->query('ALTER TABLE "' . $prefix . 'contents" ALTER COLUMN "slug" TYPE varchar(150)', Db::WRITE);
  232. $db->query('ALTER TABLE "' . $prefix . 'metas" ALTER COLUMN "slug" TYPE varchar(150)', Db::WRITE);
  233. break;
  234. case false !== strpos($adapterName, 'SQLite'):
  235. $uuid = uniqid();
  236. $db->query('CREATE TABLE ' . $prefix . 'contents' . $uuid . ' ( "cid" INTEGER NOT NULL PRIMARY KEY,
  237. "title" varchar(150) default NULL ,
  238. "slug" varchar(150) default NULL ,
  239. "created" int(10) default \'0\' ,
  240. "modified" int(10) default \'0\' ,
  241. "text" text ,
  242. "order" int(10) default \'0\' ,
  243. "authorId" int(10) default \'0\' ,
  244. "template" varchar(32) default NULL ,
  245. "type" varchar(16) default \'post\' ,
  246. "status" varchar(16) default \'publish\' ,
  247. "password" varchar(32) default NULL ,
  248. "commentsNum" int(10) default \'0\' ,
  249. "allowComment" char(1) default \'0\' ,
  250. "allowPing" char(1) default \'0\' ,
  251. "allowFeed" char(1) default \'0\' )', Db::WRITE);
  252. $db->query('INSERT INTO ' . $prefix . 'contents' . $uuid . ' SELECT * FROM ' . $prefix . 'contents', Db::WRITE);
  253. $db->query('DROP TABLE ' . $prefix . 'contents', Db::WRITE);
  254. $db->query('CREATE TABLE ' . $prefix . 'contents ( "cid" INTEGER NOT NULL PRIMARY KEY,
  255. "title" varchar(150) default NULL ,
  256. "slug" varchar(150) default NULL ,
  257. "created" int(10) default \'0\' ,
  258. "modified" int(10) default \'0\' ,
  259. "text" text ,
  260. "order" int(10) default \'0\' ,
  261. "authorId" int(10) default \'0\' ,
  262. "template" varchar(32) default NULL ,
  263. "type" varchar(16) default \'post\' ,
  264. "status" varchar(16) default \'publish\' ,
  265. "password" varchar(32) default NULL ,
  266. "commentsNum" int(10) default \'0\' ,
  267. "allowComment" char(1) default \'0\' ,
  268. "allowPing" char(1) default \'0\' ,
  269. "allowFeed" char(1) default \'0\' )', Db::WRITE);
  270. $db->query('INSERT INTO ' . $prefix . 'contents SELECT * FROM ' . $prefix . 'contents' . $uuid, Db::WRITE);
  271. $db->query('DROP TABLE ' . $prefix . 'contents' . $uuid, Db::WRITE);
  272. $db->query('CREATE UNIQUE INDEX ' . $prefix . 'contents_slug ON ' . $prefix . 'contents ("slug")', Db::WRITE);
  273. $db->query('CREATE INDEX ' . $prefix . 'contents_created ON ' . $prefix . 'contents ("created")', Db::WRITE);
  274. $db->query('CREATE TABLE ' . $prefix . 'metas' . $uuid . ' ( "mid" INTEGER NOT NULL PRIMARY KEY,
  275. "name" varchar(150) default NULL ,
  276. "slug" varchar(150) default NULL ,
  277. "type" varchar(32) NOT NULL ,
  278. "description" varchar(150) default NULL ,
  279. "count" int(10) default \'0\' ,
  280. "order" int(10) default \'0\' )', Db::WRITE);
  281. $db->query('INSERT INTO ' . $prefix . 'metas' . $uuid . ' SELECT * FROM ' . $prefix . 'metas', Db::WRITE);
  282. $db->query('DROP TABLE ' . $prefix . 'metas', Db::WRITE);
  283. $db->query('CREATE TABLE ' . $prefix . 'metas ( "mid" INTEGER NOT NULL PRIMARY KEY,
  284. "name" varchar(150) default NULL ,
  285. "slug" varchar(150) default NULL ,
  286. "type" varchar(32) NOT NULL ,
  287. "description" varchar(150) default NULL ,
  288. "count" int(10) default \'0\' ,
  289. "order" int(10) default \'0\' )', Db::WRITE);
  290. $db->query('INSERT INTO ' . $prefix . 'metas SELECT * FROM ' . $prefix . 'metas' . $uuid, Db::WRITE);
  291. $db->query('DROP TABLE ' . $prefix . 'metas' . $uuid, Db::WRITE);
  292. $db->query('CREATE INDEX ' . $prefix . 'metas_slug ON ' . $prefix . 'metas ("slug")', Db::WRITE);
  293. $db->flushPool();
  294. break;
  295. default:
  296. break;
  297. }
  298. } catch (Db_Exception $e) {
  299. //do nothing
  300. }
  301. }
  302. /**
  303. * 升级至9.4.21
  304. *
  305. * @access public
  306. * @param Db $db 数据库对象
  307. * @param Options $options 全局信息组件
  308. * @return void
  309. */
  310. public static function v0_6r9_4_21($db, $options)
  311. {
  312. //创建上传目录
  313. $uploadDir = Common::url(Upload::UPLOAD_DIR, __TYPECHO_ROOT_DIR__);
  314. if (is_dir($uploadDir)) {
  315. if (!is_writeable($uploadDir)) {
  316. if (!@chmod($uploadDir, 0755)) {
  317. throw new \Typecho\Widget\Exception(_t('上传目录无法写入, 请手动将安装目录下的 %s 目录的权限设置为可写然后继续升级', Upload::UPLOAD_DIR));
  318. }
  319. }
  320. } else {
  321. if (!@mkdir($uploadDir, 0755)) {
  322. throw new \Typecho\Widget\Exception(_t('上传目录无法创建, 请手动创建安装目录下的 %s 目录, 并将它的权限设置为可写然后继续升级', Upload::UPLOAD_DIR));
  323. }
  324. }
  325. /** 增加自定义主页 */
  326. $db->query($db->insert('table.options')
  327. ->rows(['name' => 'customHomePage', 'user' => 0, 'value' => 0]));
  328. /** 增加文件上传散列函数 */
  329. $db->query($db->insert('table.options')
  330. ->rows(['name' => 'uploadHandle', 'user' => 0, 'value' => 'a:2:{i:0;s:13:"Widget_Upload";i:1;s:12:"uploadHandle";}']));
  331. /** 增加文件删除函数 */
  332. $db->query($db->insert('table.options')
  333. ->rows(['name' => 'deleteHandle', 'user' => 0, 'value' => 'a:2:{i:0;s:13:"Widget_Upload";i:1;s:12:"deleteHandle";}']));
  334. /** 增加文件展现散列函数 */
  335. $db->query($db->insert('table.options')
  336. ->rows(['name' => 'attachmentHandle', 'user' => 0, 'value' => 'a:2:{i:0;s:13:"Widget_Upload";i:1;s:16:"attachmentHandle";}']));
  337. /** 增加文件扩展名 */
  338. $db->query($db->insert('table.options')
  339. ->rows(['name' => 'attachmentTypes', 'user' => 0, 'value' => '*.jpg;*.gif;*.png;*.zip;*.tar.gz']));
  340. /** 增加路由 */
  341. $routingTable = $options->routingTable;
  342. if (isset($routingTable[0])) {
  343. unset($routingTable[0]);
  344. }
  345. $pre = array_slice($routingTable, 0, 2);
  346. $next = array_slice($routingTable, 2);
  347. $routingTable = array_merge($pre, [
  348. 'attachment' =>
  349. [
  350. 'url' => '/attachment/[cid:digital]/',
  351. 'widget' => 'Widget_Archive',
  352. 'action' => 'render',
  353. ]
  354. ], $next);
  355. $db->query($db->update('table.options')
  356. ->rows(['value' => serialize($routingTable)])
  357. ->where('name = ?', 'routingTable'));
  358. }
  359. /**
  360. * 升级至9.6.1
  361. *
  362. * @access public
  363. * @param Db $db 数据库对象
  364. * @param Options $options 全局信息组件
  365. * @return void
  366. */
  367. public static function v0_6r9_6_1($db, $options)
  368. {
  369. /** 去掉所见即所得编辑器 */
  370. $db->query($db->delete('table.options')
  371. ->where('name = ?', 'useRichEditor'));
  372. /** 修正自动保存值 */
  373. $db->query($db->update('table.options')
  374. ->rows(['value' => 0])
  375. ->where('name = ?', 'autoSave'));
  376. /** 增加堆楼楼层数目限制 */
  377. $db->query($db->insert('table.options')
  378. ->rows(['name' => 'commentsMaxNestingLevels', 'user' => 0, 'value' => 5]));
  379. }
  380. /**
  381. * 升级至9.6.16
  382. *
  383. * @access public
  384. * @param Db $db 数据库对象
  385. * @param Options $options 全局信息组件
  386. * @return void
  387. */
  388. public static function v0_7r9_6_16($db, $options)
  389. {
  390. /** 增加附件handle */
  391. $db->query($db->insert('table.options')
  392. ->rows(['name' => 'modifyHandle', 'value' => 'a:2:{i:0;s:13:"Widget_Upload";i:1;s:12:"modifyHandle";}']));
  393. /** 增加附件handle */
  394. $db->query($db->insert('table.options')
  395. ->rows(['name' => 'attachmentDataHandle', 'value' => 'a:2:{i:0;s:13:"Widget_Upload";i:1;s:20:"attachmentDataHandle";}']));
  396. /** 转换附件 */
  397. $i = 1;
  398. while (true) {
  399. $result = $db->query($db->select('cid', 'text')->from('table.contents')
  400. ->where('type = ?', 'attachment')
  401. ->order('cid', Db::SORT_ASC)->page($i, 100));
  402. $j = 0;
  403. while ($row = $db->fetchRow($result)) {
  404. $attachment = unserialize($row['text']);
  405. $attachment['modifyHandle'] = ['Widget_Upload', 'modifyHandle'];
  406. $attachment['attachmentDataHandle'] = ['Widget_Upload', 'attachmentDataHandle'];
  407. $db->query($db->update('table.contents')
  408. ->rows(['text' => serialize($attachment)])
  409. ->where('cid = ?', $row['cid']));
  410. $j++;
  411. unset($text);
  412. unset($row);
  413. }
  414. if ($j < 100) {
  415. break;
  416. }
  417. $i++;
  418. unset($result);
  419. }
  420. }
  421. /**
  422. * 升级至9.6.16.1
  423. *
  424. * @access public
  425. * @param Db $db 数据库对象
  426. * @param Options $options 全局信息组件
  427. * @return void
  428. */
  429. public static function v0_7r9_6_16_1($db, $options)
  430. {
  431. //修改action路由
  432. $routingTable = $options->routingTable;
  433. if (isset($routingTable[0])) {
  434. unset($routingTable[0]);
  435. }
  436. $routingTable['do'] = [
  437. 'url' => '/action/[action:alpha]',
  438. 'widget' => 'Widget_Do',
  439. 'action' => 'action'
  440. ];
  441. $db->query($db->update('table.options')
  442. ->rows(['value' => serialize($routingTable)])
  443. ->where('name = ?', 'routingTable'));
  444. //干掉垃圾数据
  445. $db->query($db->update('table.options')
  446. ->rows(['value' => 'a:0:{}'])
  447. ->where('name = ?', 'actionTable'));
  448. }
  449. /**
  450. * 升级至9.7.2
  451. *
  452. * @access public
  453. * @param Db $db 数据库对象
  454. * @param Options $options 全局信息组件
  455. * @return void
  456. */
  457. public static function v0_7r9_7_2($db, $options)
  458. {
  459. /** 增加默认内容格式 */
  460. $db->query($db->insert('table.options')
  461. ->rows(['name' => 'contentType', 'user' => 0, 'value' => 'text/html']));
  462. /** 增加gzip开关 */
  463. $db->query($db->insert('table.options')
  464. ->rows(['name' => 'gzip', 'user' => 0, 'value' => 0]));
  465. if (is_writeable(__TYPECHO_ROOT_DIR__ . '/config.inc.php')) {
  466. $contents = file_get_contents(__TYPECHO_ROOT_DIR__ . '/config.inc.php');
  467. $contents = preg_replace("/Common::init([^;]+);/is", "Common::init(array(
  468. 'autoLoad' => true,
  469. 'exception' => 'Widget_ExceptionHandle',
  470. 'gpc' => true
  471. ));", $contents);
  472. $contents = preg_replace("/\s*(\/[^\/]+\/)?\s*Typecho_Widget::widget([^;]+);/is", '', $contents);
  473. $contents = preg_replace("/\s*(\/[^\/]+\/)?\s*Typecho_Router::setRoutes([^;]+);/is", '', $contents);
  474. $contents = preg_replace("/\s*(\/[^\/]+\/)?\s*Typecho_Plugin::init([^;]+);/is", '', $contents);
  475. $contents = preg_replace("/\s*(\/[^\/]+\/)?\s*Typecho_Date::setTimezoneOffset([^;]+);/is", '', $contents);
  476. file_put_contents(__TYPECHO_ROOT_DIR__ . '/config.inc.php', $contents);
  477. } else {
  478. /** 升级提示 */
  479. return _t('建议您在升级到 Typecho 0.7/9.7.2 以后的版本后, 立刻执行<a href="https://typecho.org/upgrade/9.7.2">以下优化步骤</a>');
  480. }
  481. }
  482. /**
  483. * 升级至9.9.2
  484. * 修改contents表的text字段类型为longtext(仅限mysql, pgsql和sqlite都是不限制长度的)
  485. *
  486. * @access public
  487. * @param Db $db 数据库对象
  488. * @param Options $options 全局信息组件
  489. * @return void
  490. */
  491. public static function v0_7r9_9_2($db, $options)
  492. {
  493. $adapterName = $db->getAdapterName();
  494. $prefix = $db->getPrefix();
  495. if (false !== strpos($adapterName, 'Mysql')) {
  496. $db->query("ALTER TABLE `{$prefix}contents` CHANGE `text` `text` LONGTEXT NULL DEFAULT NULL COMMENT '内容文字'", Db::WRITE);
  497. }
  498. }
  499. /**
  500. * 升级至9.9.15
  501. * 优化路由表结构
  502. *
  503. * @access public
  504. * @param Db $db 数据库对象
  505. * @param Options $options 全局信息组件
  506. * @return void
  507. */
  508. public static function v0_7r9_9_15($db, $options)
  509. {
  510. /** 增加路由 */
  511. $routingTable = $options->routingTable;
  512. if (isset($routingTable[0])) {
  513. unset($routingTable[0]);
  514. }
  515. $do = $routingTable['do'];
  516. unset($routingTable['do']);
  517. $pre = array_slice($routingTable, 0, 1);
  518. $next = array_slice($routingTable, 1);
  519. $routingTable = array_merge($pre, ['do' => $do], $next);
  520. $db->query($db->update('table.options')
  521. ->rows(['value' => serialize($routingTable)])
  522. ->where('name = ?', 'routingTable'));
  523. }
  524. /**
  525. * 升级至9.9.22
  526. * 此升级用于修复从0.6升级时损坏的路由表
  527. *
  528. * @access public
  529. * @param Db $db 数据库对象
  530. * @param Options $options 全局信息组件
  531. * @return void
  532. */
  533. public static function v0_7r9_9_22($db, $options)
  534. {
  535. /** 修改路由 */
  536. $routingTable = $options->routingTable;
  537. if (isset($routingTable[0])) {
  538. unset($routingTable[0]);
  539. }
  540. $routingTable['do'] = [
  541. 'url' => '/action/[action:alpha]',
  542. 'widget' => 'Widget_Do',
  543. 'action' => 'action'
  544. ];
  545. $do = $routingTable['do'];
  546. unset($routingTable['do']);
  547. $pre = array_slice($routingTable, 0, 1);
  548. $next = array_slice($routingTable, 1);
  549. $routingTable = array_merge($pre, ['do' => $do], $next);
  550. $db->query($db->update('table.options')
  551. ->rows(['value' => serialize($routingTable)])
  552. ->where('name = ?', 'routingTable'));
  553. }
  554. /**
  555. * 升级至9.9.27
  556. * 增加按作者归档
  557. *
  558. * @access public
  559. * @param Db $db 数据库对象
  560. * @param Options $options 全局信息组件
  561. * @return void
  562. */
  563. public static function v0_7r9_9_27($db, $options)
  564. {
  565. /** 修改路由 */
  566. $routingTable = $options->routingTable;
  567. if (isset($routingTable[0])) {
  568. unset($routingTable[0]);
  569. }
  570. $pre = array_slice($routingTable, 0, 6);
  571. $next = array_slice($routingTable, 6);
  572. $next_pre = array_slice($next, 0, 5);
  573. $next_next = array_slice($next, 5);
  574. $author = [
  575. 'url' => '/author/[uid:digital]/',
  576. 'widget' => 'Widget_Archive',
  577. 'action' => 'render',
  578. ];
  579. $author_page = [
  580. 'url' => '/author/[uid:digital]/[page:digital]/',
  581. 'widget' => 'Widget_Archive',
  582. 'action' => 'render',
  583. ];
  584. $routingTable = array_merge($pre, ['author' => $author], $next_pre,
  585. ['author_page' => $author_page], $next_next);
  586. $db->query($db->update('table.options')
  587. ->rows(['value' => serialize($routingTable)])
  588. ->where('name = ?', 'routingTable'));
  589. }
  590. /**
  591. * 升级至9.10.16
  592. * 增加评论分页
  593. *
  594. * @access public
  595. * @param Db $db 数据库对象
  596. * @param Options $options 全局信息组件
  597. * @return void
  598. */
  599. public static function v0_7r9_10_16($db, $options)
  600. {
  601. /** 修改路由 */
  602. $routingTable = $options->routingTable;
  603. if (isset($routingTable[0])) {
  604. unset($routingTable[0]);
  605. }
  606. $pre = array_slice($routingTable, 0, 20);
  607. $next = array_slice($routingTable, 20);
  608. $commentPage = [
  609. 'url' => '[permalink:string]/[commentType:alpha]-page-[commentPage:digital]',
  610. 'widget' => 'Widget_Archive',
  611. 'action' => 'render',
  612. ];
  613. $routingTable = array_merge($pre, ['comment_page' => $commentPage], $next);
  614. $db->query($db->update('table.options')
  615. ->rows(['value' => serialize($routingTable)])
  616. ->where('name = ?', 'routingTable'));
  617. }
  618. /**
  619. * 升级至9.10.16
  620. * 增加评论分页
  621. *
  622. * @access public
  623. * @param Db $db 数据库对象
  624. * @param Options $options 全局信息组件
  625. * @return void
  626. */
  627. public static function v0_7r9_10_20($db, $options)
  628. {
  629. /** 修改数据库字段 */
  630. $adapterName = $db->getAdapterName();
  631. $prefix = $db->getPrefix();
  632. switch (true) {
  633. case false !== strpos($adapterName, 'Mysql'):
  634. $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `parent` INT(10) UNSIGNED NULL DEFAULT \'0\'', Db::WRITE);
  635. break;
  636. case false !== strpos($adapterName, 'Pgsql'):
  637. $db->query('ALTER TABLE "' . $prefix . 'contents" ADD COLUMN "parent" INT NULL DEFAULT \'0\'', Db::WRITE);
  638. break;
  639. case false !== strpos($adapterName, 'SQLite'):
  640. $uuid = uniqid();
  641. $db->query('CREATE TABLE ' . $prefix . 'contents_tmp ( "cid" INTEGER NOT NULL PRIMARY KEY,
  642. "title" varchar(150) default NULL ,
  643. "slug" varchar(150) default NULL ,
  644. "created" int(10) default \'0\' ,
  645. "modified" int(10) default \'0\' ,
  646. "text" text ,
  647. "order" int(10) default \'0\' ,
  648. "authorId" int(10) default \'0\' ,
  649. "template" varchar(32) default NULL ,
  650. "type" varchar(16) default \'post\' ,
  651. "status" varchar(16) default \'publish\' ,
  652. "password" varchar(32) default NULL ,
  653. "commentsNum" int(10) default \'0\' ,
  654. "allowComment" char(1) default \'0\' ,
  655. "allowPing" char(1) default \'0\' ,
  656. "allowFeed" char(1) default \'0\' ,
  657. "parent" int(10) default \'0\' )', Db::WRITE);
  658. $db->query('INSERT INTO ' . $prefix . 'contents_tmp ("cid", "title", "slug", "created", "modified"
  659. , "text", "order", "authorId", "template", "type", "status", "password", "commentsNum", "allowComment",
  660. "allowPing", "allowFeed", "parent") SELECT "cid", "title", "slug", "created", "modified"
  661. , "text", "order", "authorId", "template", "type", "status", "password", "commentsNum", "allowComment",
  662. "allowPing", "allowFeed", "parent" FROM ' . $prefix . 'contents', Db::WRITE);
  663. $db->query('DROP TABLE ' . $prefix . 'contents', Db::WRITE);
  664. $db->query('CREATE TABLE ' . $prefix . 'contents ( "cid" INTEGER NOT NULL PRIMARY KEY,
  665. "title" varchar(150) default NULL ,
  666. "slug" varchar(150) default NULL ,
  667. "created" int(10) default \'0\' ,
  668. "modified" int(10) default \'0\' ,
  669. "text" text ,
  670. "order" int(10) default \'0\' ,
  671. "authorId" int(10) default \'0\' ,
  672. "template" varchar(32) default NULL ,
  673. "type" varchar(16) default \'post\' ,
  674. "status" varchar(16) default \'publish\' ,
  675. "password" varchar(32) default NULL ,
  676. "commentsNum" int(10) default \'0\' ,
  677. "allowComment" char(1) default \'0\' ,
  678. "allowPing" char(1) default \'0\' ,
  679. "allowFeed" char(1) default \'0\' ,
  680. "parent" int(10) default \'0\' )', Db::WRITE);
  681. $db->query('INSERT INTO ' . $prefix . 'contents SELECT * FROM ' . $prefix . 'contents_tmp', Db::WRITE);
  682. $db->query('DROP TABLE ' . $prefix . 'contents_tmp', Db::WRITE);
  683. $db->query('CREATE UNIQUE INDEX ' . $prefix . 'contents_slug ON ' . $prefix . 'contents ("slug")', Db::WRITE);
  684. $db->query('CREATE INDEX ' . $prefix . 'contents_created ON ' . $prefix . 'contents ("created")', Db::WRITE);
  685. $db->flushPool();
  686. break;
  687. default:
  688. break;
  689. }
  690. $db->query($db->update('table.contents')->expression('parent', 'order')
  691. ->where('type = ?', 'attachment'));
  692. $db->query($db->update('table.contents')->rows(['order' => 0])
  693. ->where('type = ?', 'attachment'));
  694. }
  695. /**
  696. * 升级至9.10.31
  697. * 修正附件
  698. *
  699. * @access public
  700. * @param Db $db 数据库对象
  701. * @param Options $options 全局信息组件
  702. * @return void
  703. */
  704. public static function v0_7r9_10_31($db, $options)
  705. {
  706. $db->query($db->update('table.contents')->rows(['status' => 'publish'])
  707. ->where('type = ?', 'attachment'));
  708. }
  709. /**
  710. * 升级至9.11.25
  711. *
  712. * @access public
  713. * @param Db $db 数据库对象
  714. * @param Options $options 全局信息组件
  715. * @return void
  716. */
  717. public static function v0_8r9_11_25($db, $options)
  718. {
  719. /** 增加若干选项 */
  720. $db->query($db->insert('table.options')
  721. ->rows(['name' => 'commentsPageBreak', 'user' => 0, 'value' => 0]));
  722. $db->query($db->insert('table.options')
  723. ->rows(['name' => 'commentsThreaded', 'user' => 0, 'value' => 1]));
  724. $db->query($db->insert('table.options')
  725. ->rows(['name' => 'commentsPageSize', 'user' => 0, 'value' => 20]));
  726. $db->query($db->insert('table.options')
  727. ->rows(['name' => 'commentsPageDisplay', 'user' => 0, 'value' => 'last']));
  728. $db->query($db->insert('table.options')
  729. ->rows(['name' => 'commentsOrder', 'user' => 0, 'value' => 'ASC']));
  730. $db->query($db->insert('table.options')
  731. ->rows(['name' => 'commentsCheckReferer', 'user' => 0, 'value' => 1]));
  732. $db->query($db->insert('table.options')
  733. ->rows(['name' => 'commentsAutoClose', 'user' => 0, 'value' => 0]));
  734. $db->query($db->insert('table.options')
  735. ->rows(['name' => 'commentsPostIntervalEnable', 'user' => 0, 'value' => 1]));
  736. $db->query($db->insert('table.options')
  737. ->rows(['name' => 'commentsPostInterval', 'user' => 0, 'value' => 60]));
  738. $db->query($db->insert('table.options')
  739. ->rows(['name' => 'commentsShowCommentOnly', 'user' => 0, 'value' => 0]));
  740. /** 修改路由 */
  741. $routingTable = $options->routingTable;
  742. if (isset($routingTable[0])) {
  743. unset($routingTable[0]);
  744. }
  745. if (isset($routingTable['comment_page'])) {
  746. $routingTable['comment_page'] = [
  747. 'url' => '[permalink:string]/comment-page-[commentPage:digital]',
  748. 'widget' => 'Widget_Archive',
  749. 'action' => 'render',
  750. ];
  751. } else {
  752. $pre = array_slice($routingTable, 0, 20);
  753. $next = array_slice($routingTable, 20);
  754. $commentPage = [
  755. 'url' => '[permalink:string]/comment-page-[commentPage:digital]',
  756. 'widget' => 'Widget_Archive',
  757. 'action' => 'render',
  758. ];
  759. $routingTable = array_merge($pre, ['comment_page' => $commentPage], $next);
  760. }
  761. $db->query($db->update('table.options')
  762. ->rows(['value' => serialize($routingTable)])
  763. ->where('name = ?', 'routingTable'));
  764. }
  765. /**
  766. * 升级至9.12.11
  767. *
  768. * @access public
  769. * @param Db $db 数据库对象
  770. * @param Options $options 全局信息组件
  771. * @return void
  772. */
  773. public static function v0_8r9_12_11($db, $options)
  774. {
  775. /** 删除无用选项 */
  776. $db->query($db->delete('table.options')
  777. ->where('name = ? OR name = ? OR name = ? OR name = ? OR name = ? OR name = ? OR name = ?', 'customHomePage', 'uploadHandle',
  778. 'deleteHandle', 'modifyHandle', 'attachmentHandle', 'attachmentDataHandle', 'gzip'));
  779. // 增加自定义首页
  780. $db->query($db->insert('table.options')
  781. ->rows(['name' => 'frontPage', 'user' => 0, 'value' => 'recent']));
  782. }
  783. /**
  784. * 升级至10.2.27
  785. *
  786. * @access public
  787. * @param Db $db 数据库对象
  788. * @param Options $options 全局信息组件
  789. * @return void
  790. */
  791. public static function v0_8r10_2_27($db, $options)
  792. {
  793. /** 增加若干选项 */
  794. $db->query($db->insert('table.options')
  795. ->rows(['name' => 'commentsAvatar', 'user' => 0, 'value' => 1]));
  796. $db->query($db->insert('table.options')
  797. ->rows(['name' => 'commentsAvatarRating', 'user' => 0, 'value' => 'G']));
  798. //更新扩展
  799. if (null != $options->attachmentTypes) {
  800. $attachmentTypes = array_map('trim', explode(';', $options->attachmentTypes));
  801. $attachmentTypesResult = [];
  802. foreach ($attachmentTypes as $type) {
  803. $type = trim($type, '*.');
  804. if (!empty($type)) {
  805. $attachmentTypesResult[] = $type;
  806. }
  807. }
  808. if (!empty($attachmentTypesResult)) {
  809. $db->query($db->update('table.options')
  810. ->rows(['value' => implode(',', $attachmentTypesResult)])
  811. ->where('name = ?', 'attachmentTypes'));
  812. }
  813. }
  814. }
  815. /**
  816. * 升级至10.3.8
  817. *
  818. * @access public
  819. * @param Db $db 数据库对象
  820. * @param Options $options 全局信息组件
  821. * @return void
  822. */
  823. public static function v0_8r10_3_8($db, $options)
  824. {
  825. /** 删除无用选项 */
  826. $db->query($db->delete('table.options')
  827. ->where('name = ?', 'commentsAvatarSize'));
  828. }
  829. /**
  830. * 升级至10.5.17
  831. *
  832. * @access public
  833. * @param Db $db 数据库对象
  834. * @param Options $options 全局信息组件
  835. * @return void
  836. */
  837. public static function v0_8r10_5_17($db, $options)
  838. {
  839. Edit::alloc(null, 'change=' . $options->theme, function (Edit $edit) {
  840. $edit->action();
  841. });
  842. }
  843. /**
  844. * 升级至13.10.18
  845. *
  846. * @param mixed $db
  847. * @param mixed $options
  848. * @static
  849. * @access public
  850. * @return void
  851. */
  852. public static function v0_9r13_10_18($db, $options)
  853. {
  854. // 增加markdown
  855. $db->query($db->insert('table.options')
  856. ->rows(['name' => 'markdown', 'user' => 0, 'value' => 0]));
  857. // 更新原来被搞乱的草稿
  858. $db->query($db->update('table.contents')
  859. ->rows([
  860. 'type' => 'post_draft',
  861. 'status' => 'publish'
  862. ])
  863. ->where('type = ? AND status = ?', 'post', 'draft'));
  864. $db->query($db->update('table.contents')
  865. ->rows([
  866. 'type' => 'page_draft',
  867. 'status' => 'publish'
  868. ])
  869. ->where('type = ? AND status = ?', 'page', 'draft'));
  870. }
  871. /**
  872. * v0_9r13_11_17
  873. *
  874. * @param mixed $db
  875. * @param mixed $options
  876. * @static
  877. * @access public
  878. * @return void
  879. */
  880. public static function v0_9r13_11_17($db, $options)
  881. {
  882. Helper::addRoute('archive', '/blog/', 'Widget_Archive', 'render', 'index');
  883. Helper::addRoute('archive_page', '/blog/[page:digital]/', 'Widget_Archive', 'render', 'index_page');
  884. $db->query($db->insert('table.options')
  885. ->rows(['name' => 'frontArchive', 'user' => 0, 'value' => 0]));
  886. }
  887. /**
  888. * v0_9r13_11_24
  889. *
  890. * @param mixed $db
  891. * @param mixed $options
  892. * @static
  893. * @access public
  894. * @return void
  895. */
  896. public static function v0_9r13_11_24($db, $options)
  897. {
  898. /* 增加数据表 */
  899. $adapterName = $db->getAdapterName();
  900. $prefix = $db->getPrefix();
  901. switch (true) {
  902. case false !== strpos($adapterName, 'Mysql'):
  903. $config = $db->getConfig();
  904. $db->query("CREATE TABLE `{$prefix}fields` (
  905. `cid` int(10) unsigned NOT NULL,
  906. `name` varchar(150) NOT NULL,
  907. `type` varchar(8) default 'str',
  908. `str_value` text,
  909. `int_value` int(10) default '0',
  910. `float_value` float default '0',
  911. PRIMARY KEY (`cid`,`name`),
  912. KEY `int_value` (`int_value`),
  913. KEY `float_value` (`float_value`)
  914. ) ENGINE=MyISAM DEFAULT CHARSET=" . $config[0]->charset, Db::WRITE);
  915. break;
  916. case false !== strpos($adapterName, 'Pgsql'):
  917. $db->query('CREATE TABLE "' . $prefix . 'fields" ("cid" INT NOT NULL,
  918. "name" VARCHAR(150) NOT NULL,
  919. "type" VARCHAR(8) NULL DEFAULT \'str\',
  920. "str_value" TEXT NULL DEFAULT NULL,
  921. "int_value" INT NULL DEFAULT \'0\',
  922. "float_value" REAL NULL DEFAULT \'0\',
  923. PRIMARY KEY ("cid","name")
  924. )', Db::WRITE);
  925. $db->query('CREATE INDEX "' . $prefix . 'fields_int_value" ON "' . $prefix . 'fields" ("int_value")', Db::WRITE);
  926. $db->query('CREATE INDEX "' . $prefix . 'fields_float_value" ON "' . $prefix . 'fields" ("float_value")', Db::WRITE);
  927. break;
  928. case false !== strpos($adapterName, 'SQLite'):
  929. $db->query('CREATE TABLE "' . $prefix . 'fields" ("cid" INTEGER NOT NULL,
  930. "name" varchar(150) NOT NULL,
  931. "type" varchar(8) default \'str\',
  932. "str_value" text,
  933. "int_value" int(10) default \'0\',
  934. "float_value" real default \'0\'
  935. )', Db::WRITE);
  936. $db->query('CREATE UNIQUE INDEX ' . $prefix . 'fields_cid_name ON ' . $prefix . 'fields ("cid", "name")', Db::WRITE);
  937. $db->query('CREATE INDEX ' . $prefix . 'fields_int_value ON ' . $prefix . 'fields ("int_value")', Db::WRITE);
  938. $db->query('CREATE INDEX ' . $prefix . 'fields_float_value ON ' . $prefix . 'fields ("float_value")', Db::WRITE);
  939. break;
  940. default:
  941. break;
  942. }
  943. $db->query($db->insert('table.options')
  944. ->rows(['name' => 'commentsMarkdown', 'user' => 0, 'value' => 0]));
  945. }
  946. /**
  947. * 升级至17.4.24
  948. *
  949. * @param mixed $db
  950. * @param mixed $options
  951. * @static
  952. * @access public
  953. * @return void
  954. */
  955. public static function v1_1r17_4_24($db, $options)
  956. {
  957. // 增加markdown
  958. if (!isset($options->xmlrpcMarkdown)) {
  959. $db->query($db->insert('table.options')
  960. ->rows(['name' => 'xmlrpcMarkdown', 'user' => 0, 'value' => 0]));
  961. }
  962. }
  963. /**
  964. * 升级至17.10.24
  965. *
  966. * @param mixed $db
  967. * @param mixed $options
  968. * @static
  969. * @access public
  970. * @return void
  971. */
  972. public static function v1_1r17_10_24($db, $options)
  973. {
  974. // 增加installed
  975. if (!isset($options->installed)) {
  976. $db->query($db->insert('table.options')
  977. ->rows(['name' => 'installed', 'user' => 0, 'value' => 1]));
  978. }
  979. }
  980. /**
  981. * 升级至17.10.27
  982. *
  983. * @param mixed $db
  984. * @param mixed $options
  985. * @static
  986. * @access public
  987. * @return void
  988. */
  989. public static function v1_1r17_10_27($db, $options)
  990. {
  991. // 增加xmlRpc开关
  992. if (!isset($options->allowXmlRpc)) {
  993. $db->query($db->insert('table.options')
  994. ->rows(['name' => 'allowXmlRpc', 'user' => 0, 'value' => 2]));
  995. }
  996. }
  997. /**
  998. * 升级至17.12.8
  999. *
  1000. * @param $db
  1001. */
  1002. public static function v1_1r17_12_8($db)
  1003. {
  1004. /** 修改数据库字段 */
  1005. $adapterName = $db->getAdapterName();
  1006. $prefix = $db->getPrefix();
  1007. switch (true) {
  1008. case false !== strpos($adapterName, 'Mysql'):
  1009. $db->query("ALTER TABLE `" . $prefix . "comments` MODIFY COLUMN `agent` varchar(511)", Db::WRITE);
  1010. break;
  1011. case false !== strpos($adapterName, 'Pgsql'):
  1012. $db->query('ALTER TABLE "' . $prefix . 'comments" ALTER COLUMN "agent" TYPE varchar(511)', Db::WRITE);
  1013. break;
  1014. case false !== strpos($adapterName, 'SQLite'):
  1015. $uuid = uniqid();
  1016. $db->query('CREATE TABLE ' . $prefix . 'comments' . $uuid . ' ( "coid" INTEGER NOT NULL PRIMARY KEY,
  1017. "cid" int(10) default \'0\' ,
  1018. "created" int(10) default \'0\' ,
  1019. "author" varchar(150) default NULL ,
  1020. "authorId" int(10) default \'0\' ,
  1021. "ownerId" int(10) default \'0\' ,
  1022. "mail" varchar(150) default NULL ,
  1023. "url" varchar(150) default NULL ,
  1024. "ip" varchar(64) default NULL ,
  1025. "agent" varchar(511) default NULL ,
  1026. "text" text ,
  1027. "type" varchar(16) default \'comment\' ,
  1028. "status" varchar(16) default \'approved\' ,
  1029. "parent" int(10) default \'0\')', Db::WRITE);
  1030. $db->query('INSERT INTO ' . $prefix . 'comments' . $uuid . ' SELECT * FROM ' . $prefix . 'comments', Db::WRITE);
  1031. $db->query('DROP TABLE ' . $prefix . 'metas', Db::WRITE);
  1032. $db->query('CREATE TABLE ' . $prefix . 'comments ( "coid" INTEGER NOT NULL PRIMARY KEY,
  1033. "cid" int(10) default \'0\' ,
  1034. "created" int(10) default \'0\' ,
  1035. "author" varchar(150) default NULL ,
  1036. "authorId" int(10) default \'0\' ,
  1037. "ownerId" int(10) default \'0\' ,
  1038. "mail" varchar(150) default NULL ,
  1039. "url" varchar(150) default NULL ,
  1040. "ip" varchar(64) default NULL ,
  1041. "agent" varchar(511) default NULL ,
  1042. "text" text ,
  1043. "type" varchar(16) default \'comment\' ,
  1044. "status" varchar(16) default \'approved\' ,
  1045. "parent" int(10) default \'0\')', Db::WRITE);
  1046. $db->query('INSERT INTO ' . $prefix . 'comments SELECT * FROM ' . $prefix . 'comments' . $uuid, Db::WRITE);
  1047. $db->query('DROP TABLE ' . $prefix . 'comments' . $uuid, Db::WRITE);
  1048. $db->query('CREATE INDEX ' . $prefix . 'comments_cid ON ' . $prefix . 'comments ("cid")', Db::WRITE);
  1049. $db->query('CREATE INDEX ' . $prefix . 'comments_created ON ' . $prefix . 'comments ("created")', Db::WRITE);
  1050. $db->flushPool();
  1051. break;
  1052. default:
  1053. break;
  1054. }
  1055. }
  1056. /**
  1057. * 升级至18.1.29
  1058. *
  1059. * @param $db
  1060. */
  1061. public static function v1_2r18_1_29($db)
  1062. {
  1063. /** 修改数据库字段 */
  1064. $adapterName = $db->getAdapterName();
  1065. $prefix = $db->getPrefix();
  1066. switch (true) {
  1067. case false !== strpos($adapterName, 'Mysql'):
  1068. $db->query("ALTER TABLE `" . $prefix . "comments` MODIFY COLUMN `url` varchar(255)", Db::WRITE);
  1069. break;
  1070. case false !== strpos($adapterName, 'Pgsql'):
  1071. $db->query('ALTER TABLE "' . $prefix . 'comments" ALTER COLUMN "url" TYPE varchar(255)', Db::WRITE);
  1072. break;
  1073. case false !== strpos($adapterName, 'SQLite'):
  1074. $uuid = uniqid();
  1075. $db->query('CREATE TABLE ' . $prefix . 'comments' . $uuid . ' ( "coid" INTEGER NOT NULL PRIMARY KEY,
  1076. "cid" int(10) default \'0\' ,
  1077. "created" int(10) default \'0\' ,
  1078. "author" varchar(150) default NULL ,
  1079. "authorId" int(10) default \'0\' ,
  1080. "ownerId" int(10) default \'0\' ,
  1081. "mail" varchar(150) default NULL ,
  1082. "url" varchar(255) default NULL ,
  1083. "ip" varchar(64) default NULL ,
  1084. "agent" varchar(511) default NULL ,
  1085. "text" text ,
  1086. "type" varchar(16) default \'comment\' ,
  1087. "status" varchar(16) default \'approved\' ,
  1088. "parent" int(10) default \'0\')', Db::WRITE);
  1089. $db->query('INSERT INTO ' . $prefix . 'comments' . $uuid . ' SELECT * FROM ' . $prefix . 'comments', Db::WRITE);
  1090. $db->query('DROP TABLE ' . $prefix . 'metas', Db::WRITE);
  1091. $db->query('CREATE TABLE ' . $prefix . 'comments ( "coid" INTEGER NOT NULL PRIMARY KEY,
  1092. "cid" int(10) default \'0\' ,
  1093. "created" int(10) default \'0\' ,
  1094. "author" varchar(150) default NULL ,
  1095. "authorId" int(10) default \'0\' ,
  1096. "ownerId" int(10) default \'0\' ,
  1097. "mail" varchar(150) default NULL ,
  1098. "url" varchar(255) default NULL ,
  1099. "ip" varchar(64) default NULL ,
  1100. "agent" varchar(511) default NULL ,
  1101. "text" text ,
  1102. "type" varchar(16) default \'comment\' ,
  1103. "status" varchar(16) default \'approved\' ,
  1104. "parent" int(10) default \'0\')', Db::WRITE);
  1105. $db->query('INSERT INTO ' . $prefix . 'comments SELECT * FROM ' . $prefix . 'comments' . $uuid, Db::WRITE);
  1106. $db->query('DROP TABLE ' . $prefix . 'comments' . $uuid, Db::WRITE);
  1107. $db->query('CREATE INDEX ' . $prefix . 'comments_cid ON ' . $prefix . 'comments ("cid")', Db::WRITE);
  1108. $db->query('CREATE INDEX ' . $prefix . 'comments_created ON ' . $prefix . 'comments ("created")', Db::WRITE);
  1109. $db->flushPool();
  1110. break;
  1111. default:
  1112. break;
  1113. }
  1114. }
  1115. /**
  1116. * v0_9r13_11_24
  1117. *
  1118. * @param mixed $db
  1119. * @param mixed $options
  1120. * @access public
  1121. * @return void
  1122. */
  1123. public function v0_9r13_12_6($db, $options)
  1124. {
  1125. if (!isset($options->frontArchive)) {
  1126. $db->query($db->insert('table.options')
  1127. ->rows(['name' => 'frontArchive', 'user' => 0, 'value' => 0]));
  1128. }
  1129. }
  1130. /**
  1131. * v0_9r13_12_20
  1132. *
  1133. * @param mixed $db
  1134. * @param mixed $options
  1135. * @access public
  1136. * @return void
  1137. */
  1138. public function v0_9r13_12_20($db, $options)
  1139. {
  1140. if (!isset($options->commentsWhitelist)) {
  1141. $db->query($db->insert('table.options')
  1142. ->rows(['name' => 'commentsWhitelist', 'user' => 0, 'value' => 0]));
  1143. }
  1144. }
  1145. /**
  1146. * v0_9r14_2_24
  1147. *
  1148. * @param mixed $db
  1149. * @param mixed $options
  1150. * @access public
  1151. * @return void
  1152. */
  1153. public function v0_9r14_2_24($db, $options)
  1154. {
  1155. /** 修改数据库字段 */
  1156. $adapterName = $db->getAdapterName();
  1157. $prefix = $db->getPrefix();
  1158. switch (true) {
  1159. case false !== strpos($adapterName, 'Mysql'):
  1160. $db->query('ALTER TABLE `' . $prefix . 'metas` ADD `parent` INT(10) UNSIGNED NULL DEFAULT \'0\'', Db::WRITE);
  1161. break;
  1162. case false !== strpos($adapterName, 'Pgsql'):
  1163. $db->query('ALTER TABLE "' . $prefix . 'metas" ADD COLUMN "parent" INT NULL DEFAULT \'0\'', Db::WRITE);
  1164. break;
  1165. case false !== strpos($adapterName, 'SQLite'):
  1166. $uuid = uniqid();
  1167. $db->query('CREATE TABLE ' . $prefix . 'metas' . $uuid . ' ( "mid" INTEGER NOT NULL PRIMARY KEY,
  1168. "name" varchar(150) default NULL ,
  1169. "slug" varchar(150) default NULL ,
  1170. "type" varchar(32) NOT NULL ,
  1171. "description" varchar(150) default NULL ,
  1172. "count" int(10) default \'0\' ,
  1173. "order" int(10) default \'0\' ,
  1174. "parent" int(10) default \'0\')', Db::WRITE);
  1175. $db->query('INSERT INTO ' . $prefix . 'metas' . $uuid . ' ("mid", "name", "slug", "type", "description", "count", "order")
  1176. SELECT "mid", "name", "slug", "type", "description", "count", "order" FROM ' . $prefix . 'metas', Db::WRITE);
  1177. $db->query('DROP TABLE ' . $prefix . 'metas', Db::WRITE);
  1178. $db->query('CREATE TABLE ' . $prefix . 'metas ( "mid" INTEGER NOT NULL PRIMARY KEY,
  1179. "name" varchar(150) default NULL ,
  1180. "slug" varchar(150) default NULL ,
  1181. "type" varchar(32) NOT NULL ,
  1182. "description" varchar(150) default NULL ,
  1183. "count" int(10) default \'0\' ,
  1184. "order" int(10) default \'0\' ,
  1185. "parent" int(10) default \'0\')', Db::WRITE);
  1186. $db->query('INSERT INTO ' . $prefix . 'metas SELECT * FROM ' . $prefix . 'metas' . $uuid, Db::WRITE);
  1187. $db->query('DROP TABLE ' . $prefix . 'metas' . $uuid, Db::WRITE);
  1188. $db->query('CREATE INDEX ' . $prefix . 'metas_slug ON ' . $prefix . 'metas ("slug")', Db::WRITE);
  1189. $db->flushPool();
  1190. break;
  1191. default:
  1192. break;
  1193. }
  1194. }
  1195. /**
  1196. * v0_9r14_3_14
  1197. *
  1198. * @param mixed $db
  1199. * @param mixed $options
  1200. * @access public
  1201. * @return void
  1202. */
  1203. public function v0_9r14_3_14($db, $options)
  1204. {
  1205. if (!isset($options->secret)) {
  1206. $db->query($db->insert('table.options')
  1207. ->rows(['name' => 'secret', 'user' => 0, 'value' => Common::randString(32, true)]));
  1208. }
  1209. }
  1210. /**
  1211. * v1_0r14_9_2
  1212. *
  1213. * @param mixed $db
  1214. * @param mixed $options
  1215. * @access public
  1216. * @return void
  1217. */
  1218. public function v1_0r14_9_2($db, $options)
  1219. {
  1220. if (!isset($options->lang)) {
  1221. $db->query($db->insert('table.options')
  1222. ->rows(['name' => 'lang', 'user' => 0, 'value' => 'zh_CN']));
  1223. }
  1224. }
  1225. /**
  1226. * v1_0r14_10_10
  1227. *
  1228. * @param mixed $db
  1229. * @param mixed $options
  1230. * @access public
  1231. * @return void
  1232. */
  1233. public function v1_0r14_10_10($db, $options)
  1234. {
  1235. if (!isset($options->commentsAntiSpam)) {
  1236. $db->query($db->insert('table.options')
  1237. ->rows(['name' => 'commentsAntiSpam', 'user' => 0, 'value' => 1]));
  1238. }
  1239. }
  1240. }