/[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.1 - (hide annotations)
Fri Jan 16 06:50:54 2026 UTC (2 months ago) by sysadm
Branch: MAIN
Add export_article

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     }
93    
94     mysqli_free_result($rs);
95    
96     if ($ret != 0)
97     {
98     break;
99     }
100    
101     if ($export_state["last_aid"] == $last_aid)
102     {
103     break;
104     }
105     $export_state["last_aid"] = $last_aid;
106    
107     echo (json_encode($export_state)) . "\n";
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 'Z': // Set article as trnasship
157     unset($delete_aid_list[$aid]);
158     $export_aid_list[$aid] = true;
159     break;
160     default:
161     // Unknown type
162     break;
163     }
164     }
165    
166     mysqli_free_result($rs);
167    
168     foreach($delete_aid_list as $aid => $dummy)
169     {
170     $export_file = $export_dir . "/" . $aid . ".xml";
171    
172     if (file_exists($export_file) && unlink($export_file) == false)
173     {
174     echo ("Delete " . $aid . ".xml error!");
175     $ret = -3;
176     break;
177     }
178     }
179    
180     if ($ret != 0)
181     {
182     break;
183     }
184    
185     foreach($export_aid_list as $aid => $dummy)
186     {
187     $buffer = shell_exec($PHP_bin . " ../bbs/view_article.php export_xml " . $aid);
188     if (!$buffer || ($buffer[0] == "<" && file_put_contents($export_dir . "/" . $aid . ".xml", $buffer) == false))
189     {
190     echo ("Write " . $aid . ".xml error!");
191     $ret = -3;
192     break;
193     }
194     }
195    
196     if ($ret != 0)
197     {
198     break;
199     }
200    
201     unset($export_aid_list);
202     unset($delete_aid_list);
203    
204     if ($export_state["last_mid"] == $last_mid)
205     {
206     break;
207     }
208     $export_state["last_mid"] = $last_mid;
209    
210     echo (json_encode($export_state)) . "\n";
211     file_put_contents($export_state_file, json_encode($export_state));
212     }
213    
214     mysqli_close($db_conn);
215    
216     exit($ret);

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