Fork de wikipp, le moteur de wiki en c++, basé sur cppcms. Le fork ajoute la langue française
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

migrate.cpp 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <cppdb/frontend.h>
  2. #include <iostream>
  3. int main(int argc,char **argv)
  4. {
  5. if(argc!=3) {
  6. std::cerr << "Wikipp database migration utility - allows to convert database from one\n"
  7. "engine to another. It supports: postgresql, mysql, sqlite3\n"
  8. "\n"
  9. "To use, create a new database using provided sql scripts and then run\n"
  10. "$ wikipp_migrate source_connection_string target_connection_string\n"
  11. << std::endl;
  12. return 1;
  13. }
  14. std::string cs_src = argv[1];
  15. std::string cs_tgt = argv[2];
  16. try {
  17. using namespace cppdb;
  18. session src(cs_src);
  19. session tgt(cs_tgt);
  20. transaction tr_src(src);
  21. transaction tr_tgt(tgt);
  22. result r;
  23. statement st;
  24. r = src << "SELECT lang,name,value FROM options";
  25. st = tgt<<"INSERT into options(lang,name,value) values(?,?,?)";
  26. while(r.next()) {
  27. std::string l,n,v;
  28. r>>l>>n>>v;
  29. st << l << n << v;
  30. st.exec();
  31. st.reset();
  32. }
  33. r = src << "SELECT id, username, password FROM users";
  34. st = tgt << "INSERT into users(id,username,password) values(?,?,?)";
  35. while(r.next()) {
  36. std::string id,user,pass;
  37. r >> id >> user >> pass;
  38. st << id << user << pass;
  39. st.exec();
  40. st.reset();
  41. }
  42. r = src << "SELECT id, lang, slug, title, content, sidebar, users_only FROM pages";
  43. st = tgt << "INSERT into pages(id, lang, slug, title, content, sidebar, users_only) values(?,?,?,?,?,?,?)";
  44. while(r.next()) {
  45. long long id;
  46. int users_only;
  47. std::string lang, slug, title, content, sidebar;
  48. r >> id >> lang >> slug >> title >> content >> sidebar >> users_only;
  49. st << id << lang << slug << title << content << sidebar << users_only;
  50. st.exec();
  51. st.reset();
  52. }
  53. r = src << "SELECT id, version, created, author, title, content, sidebar FROM history ";
  54. st = tgt << "INSERT INTO history(id, version, created, author, title, content, sidebar) VALUES(?,?,?,?,?,?,?)";
  55. while(r.next()) {
  56. long long id,version;
  57. std::tm created;
  58. std::string a,t,c,side;
  59. r >> id >> version >> created >> a >> t >> c >> side;
  60. st << id << version << created << a << t << c << side;
  61. st.exec();
  62. st.reset();
  63. }
  64. if(tgt.engine()=="postgresql") {
  65. tgt<<"SELECT setval('users_id_seq',(SELECT max(id) FROM users))" << row;
  66. tgt<<"SELECT setval('pages_id_seq',(SELECT max(id) FROM pages))" << row;
  67. }
  68. tr_src.commit();
  69. tr_tgt.commit();
  70. }
  71. catch(std::exception const &e) {
  72. std::cerr <<"Failed " << e.what() << std::endl;
  73. return 1;
  74. }
  75. return 0;
  76. }