/permission_overlays/sax2sql.php

https://github.com/tledoux/AQuA · PHP · 329 lines · 221 code · 41 blank · 67 comment · 22 complexity · 806822f096e708fee5503517471e6b84 MD5 · raw file

  1. <?php
  2. $filename = "";
  3. $dbfile = "sqlite:volumes.db";
  4. $parser = null;
  5. $fp = null;
  6. $db = null;
  7. $insertVolumeStmt = null;
  8. $insertFileStmt = null;
  9. $error = "";
  10. $values = null;
  11. $fileValues = null;
  12. $where = null;
  13. $counter = 1;
  14. /**
  15. * insert volume into database
  16. * @param none
  17. * @return volumeID returned as last insert ID
  18. * @notes
  19. * uses global variables $insertVolumeStmt, $values and $db
  20. */
  21. function insertVolume() {
  22. global $insertVolumeStmt, $values, $db;
  23. $insertVolumeStmt->execute(array(":volumeName" => $values["image_filename"]));
  24. return $db->lastInsertID();
  25. }
  26. /**
  27. * insert user into database
  28. * @param userName - name of user
  29. * @return userID returned as last insert ID
  30. * @notes
  31. * uses global variables $insertUserStmt, $values and $db
  32. */
  33. function insertUser($userName) {
  34. global $insertUserStmt, $values, $db;
  35. $insertUserStmt->execute(array(":volumeID" => $values["volumeID"], ":userName" => $userName));
  36. return $db->lastInsertID();
  37. }
  38. /**
  39. * insert group into database
  40. * @param groupName - name of group
  41. * @return groupID returned as last insert ID
  42. * @notes
  43. * uses global variables $insertGroupStmt, $values and $db
  44. */
  45. function insertGroup($groupName) {
  46. global $insertGroupStmt, $values, $db;
  47. $insertGroupStmt->execute(array(":volumeID" => $values["volumeID"], ":groupName" => $groupName));
  48. return $db->lastInsertID();
  49. }
  50. /**
  51. * insert file into database
  52. * @param none
  53. * @return fileID returned as last insert ID
  54. * @notes
  55. * uses global variables $insertFileStmt, $fileValues, $values, $db, $counter
  56. */
  57. function insertFile() {
  58. global $insertFileStmt, $fileValues, $values, $db, $counter;
  59. if (!isset($fileValues[0])) {
  60. print "uh ho\n";
  61. exit;
  62. }
  63. print "adding " . $fileValues[0]["fileName"] . "\n";
  64. ++ $counter; // increment counter for next y
  65. $args = array(":volumeID" => $values["volumeID"],
  66. ":fileType" => $fileValues[0]["fileType"],
  67. ":filePath" => dirname($fileValues[0]["fileName"]),
  68. ":fileName" => basename($fileValues[0]["fileName"]),
  69. ":x" => $fileValues[0]["x"],
  70. ":y" => $counter,
  71. ":depth" => count($fileValues),
  72. ":userID" => $values["userID"],
  73. ":groupID" => $values["groupID"],
  74. ":mode" => $fileValues[0]["mode"]);
  75. $insertFileStmt->execute($args);
  76. return $db->lastInsertID();
  77. }
  78. /**
  79. * opening element handler
  80. * initialise some values ready for accepting new character data
  81. * @param parser - the parser resource
  82. * @param element - the name of the element
  83. * @param attributes - array of attribute names => values
  84. * @return none
  85. */
  86. function startElement($parser, $element, $attributes) {
  87. global $where, $fileValues, $values, $counter;
  88. switch ($element) {
  89. case "image_filename":
  90. $values["image_filename"] = "";
  91. array_unshift($where, $element);
  92. break;
  93. case "fileobject":
  94. array_unshift($where, $element);
  95. break;
  96. case "filename":
  97. $values["filename"] = "";
  98. array_unshift($where, $element);
  99. break;
  100. case "name_type":
  101. $values["name_type"] = "";
  102. array_unshift($where, $element);
  103. break;
  104. case "mode":
  105. $values["mode"] = 0;
  106. array_unshift($where, $element);
  107. break;
  108. case "fiwalk":
  109. // initialise
  110. $fileValues = array(array("fileName" => ".", "fileType" => "d", "volumeID" => 0, "x" => $counter, "y" => 0, "mode" => 0));
  111. $where = array("");
  112. $values = array("image_filename" => "", "filename" => "", "name_type" => "", "volumeID" => 0, "userID" => 0, "groupID" => 0, "mode" => 0);
  113. break;
  114. default:
  115. break;
  116. }
  117. }
  118. /**
  119. * character data handler
  120. * @param parser - the parser resource
  121. * @param data - character data
  122. * @return none
  123. */
  124. function characterData($parser, $data) {
  125. global $where, $values;
  126. switch ($where[0]) {
  127. case "image_filename":
  128. $values["image_filename"] = $data;
  129. break;
  130. case "fileobject":
  131. break;
  132. case "filename":
  133. $values["filename"] .= $data; // concatenate, as can be longer than one chunk
  134. break;
  135. case "name_type":
  136. $values["name_type"] = $data;
  137. break;
  138. case "mode":
  139. $values["mode"] = $data;
  140. default:
  141. break;
  142. }
  143. }
  144. /**
  145. * closing element handler
  146. * @param parser - the parser resource
  147. * @param element - the name of the element
  148. * @return none
  149. */
  150. function endElement($parser, $element) {
  151. global $where, $values, $fileValues, $counter;
  152. switch ($element) {
  153. case "image_filename":
  154. // insert new volume, getting volumeID
  155. $values["volumeID"] = insertVolume();
  156. // add admin user/group for this volume
  157. $values["userID"] = insertUser("admin");
  158. $values["groupID"] = insertGroup("admin");
  159. array_shift($where);
  160. break;
  161. case "fileobject":
  162. do {
  163. // skip . and .. directories
  164. // and anything called '.' (without quotes)
  165. // and anything under $OrphanFiles
  166. if ("/." == substr($values["filename"], -2) ||
  167. "/.." == substr($values["filename"], -3) ||
  168. "\$OrphanFiles" == substr($values["filename"], 0, 12) ||
  169. "." == $values["filename"]) {
  170. break;
  171. }
  172. print "processing " . $values["filename"] . "\n";
  173. // get most recent file (directory)
  174. $lastDir = $fileValues[0]["fileName"];
  175. // get dirname and basename of current file
  176. $p = dirname($values["filename"]);
  177. $f = basename($values["filename"]);
  178. print "comparing $lastDir and $p\n";
  179. // go up until current file/dir is child of last directory
  180. while ($lastDir != $p) {
  181. insertFile();
  182. array_shift($fileValues);
  183. $lastDir = dirname($lastDir);
  184. }
  185. // add current file/dir
  186. ++ $counter; // increment counter for next x
  187. array_unshift($fileValues, array("fileName" => $values["filename"], "fileType" => $values["name_type"], "x" => $counter, "mode" => $values["mode"]));
  188. // directory, so handle it later in while loop above
  189. if ("d" == $values["name_type"]) {
  190. break;
  191. }
  192. // file, so insert and forget about it
  193. insertFile();
  194. array_shift($fileValues);
  195. } while (false);
  196. array_shift($where);
  197. break;
  198. // just remove most recent item from where array, to forget that we've been here
  199. case "filename":
  200. case "name_type":
  201. case "mode":
  202. array_shift($where);
  203. break;
  204. case "fiwalk":
  205. // catch any remaining files/directories in the queue
  206. while ($fileValues) {
  207. insertFile();
  208. array_shift($fileValues);
  209. }
  210. break;
  211. default:
  212. break;
  213. }
  214. }
  215. do {
  216. // get name of XML file
  217. if (!isset($argv[1])) {
  218. $error = "no filename given";
  219. break;
  220. }
  221. $filename = $argv[1];
  222. // create parser
  223. $parser = xml_parser_create("ISO-8859-1");
  224. if (!$parser) {
  225. $error = "couldn't create parser";
  226. break;
  227. }
  228. // turn off case folding
  229. xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  230. // set up handler functions
  231. if (!xml_set_element_handler($parser, "startElement", "endElement")) {
  232. $error = "couldn't set up element handlers";
  233. break;
  234. }
  235. if (!xml_set_character_data_handler($parser, "characterData")) {
  236. $error = "couldn't set up character data handler";
  237. break;
  238. }
  239. // open XML file
  240. if (!($fp = fopen($filename, "r"))) {
  241. $error = "couldn't open $filename";
  242. break;
  243. }
  244. // open database
  245. $db = new PDO($dbfile);
  246. if (!$db) {
  247. $error = "couldn't open db";
  248. break;
  249. }
  250. // create prepared statements
  251. $insertVolumeStmt = $db->prepare("INSERT INTO Volumes (volumeID, volumeName) VALUES (NULL, :volumeName)");
  252. $insertUserStmt = $db->prepare("INSERT INTO Users (userID, userName, volumeID) VALUES (NULL, :userName, :volumeID)");
  253. $insertGroupStmt = $db->prepare("INSERT INTO Groups (groupID, groupName, volumeID) VALUES (NULL, :groupName, :volumeID)");
  254. $insertFileStmt = $db->prepare("INSERT INTO Files (fileID, volumeID, fileType, filePath, fileName, x, y, depth, userID, groupID, mode) VALUES (NULL, :volumeID, :fileType, :filePath, :fileName, :x, :y, :depth, :userID, :groupID, :mode)");
  255. // start transaction
  256. if (!$db->beginTransaction()) {
  257. $error = "couldn't start transaction";
  258. break;
  259. }
  260. // read in the XML file
  261. while ($data = fread($fp, 4096)) {
  262. if (!xml_parse($parser, $data, feof($fp))) {
  263. $error = sprintf("XML error: %s at line %d",
  264. xml_error_string(xml_get_error_code($parser)),
  265. xml_get_current_line_number($parser));
  266. break;
  267. }
  268. }
  269. // finish transaction
  270. if (!$db->commit()) {
  271. $error = "couldn't commit transaction";
  272. break;
  273. }
  274. } while(false);
  275. if ($error) {
  276. if ($db->inTransaction()) {
  277. $db->rollBack();
  278. }
  279. die($error);
  280. }
  281. ?>