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

Annotation of /fenglin/manage/export_article.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide annotations)
Tue Jan 20 07:48:30 2026 UTC (8 weeks, 1 day ago) by sysadm
Branch: MAIN
Changes since 1.2: +3 -1 lines
Update

1 sysadm 1.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 sysadm 1.2 echo $row["AID"] . "\n";
93 sysadm 1.1 }
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 sysadm 1.3 case 'E': // Set article as excerption
157     case 'O': // Unset article as excerption
158     case 'Z': // Set article as transship
159 sysadm 1.1 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 sysadm 1.2 $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 sysadm 1.1 {
183 sysadm 1.2 echo ("Write " . $aid . ".xml error!");
184 sysadm 1.1 $ret = -3;
185     break;
186     }
187 sysadm 1.2 echo $aid . "\n";
188 sysadm 1.1 }
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 || ($buffer[0] == "<" && file_put_contents($export_dir . "/" . $aid . ".xml", $buffer) == false))
199     {
200     echo ("Write " . $aid . ".xml error!");
201     $ret = -3;
202     break;
203     }
204 sysadm 1.2 echo $aid . "\n";
205 sysadm 1.1 }
206    
207     if ($ret != 0)
208     {
209     break;
210     }
211    
212     unset($export_aid_list);
213     unset($delete_aid_list);
214    
215     if ($export_state["last_mid"] == $last_mid)
216     {
217     break;
218     }
219     $export_state["last_mid"] = $last_mid;
220    
221     file_put_contents($export_state_file, json_encode($export_state));
222     }
223    
224     mysqli_close($db_conn);
225    
226     exit($ret);

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