/[LeafOK_CVS]/fenglin/manage/export_article.php
ViewVC logotype

Contents of /fenglin/manage/export_article.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations)
Wed Jan 21 13:17:43 2026 UTC (7 weeks, 6 days ago) by sysadm
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +8 -5 lines
Refine

1 <?php
2 if (!isset($_SERVER["argc"]))
3 {
4 echo "Invalid usage";
5 exit();
6 }
7
8 chdir(dirname($_SERVER["argv"][0]));
9
10 require_once "../lib/db_open.inc.php";
11 require_once "../lib/common.inc.php";
12
13 $export_dir = "../export_xml";
14 $export_state_file = $export_dir . "/export_state.json";
15 $export_batch_size = 100;
16
17 $export_state = array(
18 "last_aid" => -1,
19 "last_mid" => -1,
20 );
21
22 if (!file_exists($export_dir) && mkdir($export_dir, 0750) == false)
23 {
24 echo ("Create dir error!");
25 exit(-1);
26 }
27
28 if(file_exists($export_state_file))
29 {
30 $export_state_json = file_get_contents($export_state_file);
31 if ($export_state_json !== false)
32 {
33 $export_state_loaded = json_decode($export_state_json, true);
34 if (isset($export_state_loaded["last_aid"]))
35 {
36 $export_state["last_aid"] = intval($export_state_loaded["last_aid"]);
37 }
38 if (isset($export_state_loaded["last_mid"]))
39 {
40 $export_state["last_mid"] = intval($export_state_loaded["last_mid"]);
41 }
42 }
43 }
44
45 if ($export_state["last_mid"] == -1)
46 {
47 $sql = "SELECT MID FROM bbs_article_op ORDER BY MID DESC LIMIT 1";
48
49 $rs = mysqli_query($db_conn, $sql);
50 if ($rs == false)
51 {
52 echo "Query article log error: " . mysqli_error($db_conn);
53 mysqli_close($db_conn);
54 exit(-2);
55 }
56
57 if ($row = mysqli_fetch_array($rs))
58 {
59 $export_state["last_mid"] = intval($row["MID"]);
60 }
61
62 mysqli_free_result($rs);
63 }
64
65 $ret = 0;
66 while ($ret == 0)
67 {
68 $sql = "SELECT AID FROM bbs WHERE AID > " . $export_state["last_aid"] .
69 " AND TID = 0 AND visible ORDER BY AID LIMIT $export_batch_size";
70
71 $rs = mysqli_query($db_conn, $sql);
72 if ($rs == false)
73 {
74 echo "Query article list error: " . mysqli_error($db_conn);
75 $ret = -2;
76 break;
77 }
78
79 $last_aid = $export_state["last_aid"];
80
81 while($row = mysqli_fetch_array($rs))
82 {
83 $last_aid = intval($row["AID"]);
84
85 $buffer = shell_exec($PHP_bin . " ../bbs/view_article.php export_xml " . $row["AID"]);
86 if (!$buffer || ($buffer[0] == "<" && file_put_contents($export_dir . "/" . $row["AID"] . ".xml", $buffer) == false))
87 {
88 echo ("Write " . $row["AID"] . ".xml error!");
89 $ret = -3;
90 break;
91 }
92 echo $row["AID"] . "\n";
93 }
94
95 mysqli_free_result($rs);
96
97 if ($ret != 0)
98 {
99 break;
100 }
101
102 if ($export_state["last_aid"] == $last_aid)
103 {
104 break;
105 }
106 $export_state["last_aid"] = $last_aid;
107
108 file_put_contents($export_state_file, json_encode($export_state));
109 }
110
111 while($ret == 0)
112 {
113 $sql = "SELECT MID, bbs.AID, bbs.TID, type FROM bbs_article_op
114 INNER JOIN bbs ON bbs_article_op.AID = bbs.AID
115 WHERE MID > " . $export_state["last_mid"] .
116 " AND type NOT IN ('A') ORDER BY MID LIMIT $export_batch_size";
117
118 $rs = mysqli_query($db_conn, $sql);
119 if ($rs == false)
120 {
121 echo "Query article log error: " . mysqli_error($db_conn);
122 $ret = -4;
123 break;
124 }
125
126 $export_aid_list = array();
127 $delete_aid_list = array();
128
129 $last_mid = $export_state["last_mid"];
130
131 while($row = mysqli_fetch_array($rs))
132 {
133 $last_mid = intval($row["MID"]);
134 $aid = ($row["TID"] == 0 ? $row["AID"] : $row["TID"]);
135
136 switch ($row["type"])
137 {
138 case 'D': // Delete article
139 case 'X': // Delete article by Admin
140 if ($row["TID"] == 0)
141 {
142 // Topic
143 unset($export_aid_list[$aid]);
144 $delete_aid_list[$aid] = true;
145 }
146 else
147 {
148 // Reply
149 unset($delete_aid_list[$aid]);
150 $export_aid_list[$aid] = true;
151 }
152 break;
153 case 'S': // Restore article
154 case 'M': // Modify article
155 case 'T': // Move article
156 case 'E': // Set article as excerption
157 case 'O': // Unset article as excerption
158 case 'Z': // Set article as transship
159 unset($delete_aid_list[$aid]);
160 $export_aid_list[$aid] = true;
161 break;
162 default:
163 // Unknown type
164 break;
165 }
166 }
167
168 mysqli_free_result($rs);
169
170 foreach($delete_aid_list as $aid => $dummy)
171 {
172 $export_file = $export_dir . "/" . $aid . ".xml";
173
174 $buffer = <<< HTML
175 <delete>
176 <id>{$aid}</id>
177 </delete>
178
179 HTML;
180
181 if (file_put_contents($export_dir . "/" . $aid . ".xml", $buffer) == false)
182 {
183 echo ("Write " . $aid . ".xml error!");
184 $ret = -3;
185 break;
186 }
187 echo $aid . "\n";
188 }
189
190 if ($ret != 0)
191 {
192 break;
193 }
194
195 foreach($export_aid_list as $aid => $dummy)
196 {
197 $buffer = shell_exec($PHP_bin . " ../bbs/view_article.php export_xml " . $aid);
198 if ($buffer != false && $buffer[0] == "<")
199 {
200 if (file_put_contents($export_dir . "/" . $aid . ".xml", $buffer) == false)
201 {
202 echo ("Write " . $aid . ".xml error!");
203 $ret = -3;
204 break;
205 }
206 echo $aid . "\n";
207 }
208 }
209
210 if ($ret != 0)
211 {
212 break;
213 }
214
215 unset($export_aid_list);
216 unset($delete_aid_list);
217
218 if ($export_state["last_mid"] == $last_mid)
219 {
220 break;
221 }
222 $export_state["last_mid"] = $last_mid;
223
224 file_put_contents($export_state_file, json_encode($export_state));
225 }
226
227 mysqli_close($db_conn);
228
229 exit($ret);

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1