void write_db_users() { m_write_db_users_time = srv_time(); if (!m_use_sql) return; if (!m_torrents_users_updates_buffer.empty()) { m_torrents_users_updates_buffer.pop_back(); async_query("insert into " + db_name("files_users") + " (active, announced, completed, downloaded, `left`, uploaded, mtime, fid, uid) values " + m_torrents_users_updates_buffer + " on duplicate key update" + " active = values(active)," + " announced = announced + values(announced)," + " completed = completed + values(completed)," + " downloaded = downloaded + values(downloaded)," + " `left` = values(`left`)," + " uploaded = uploaded + values(uploaded)," + " mtime = values(mtime)"); m_torrents_users_updates_buffer.erase(); } async_query("update " + db_name("files_users") + " set active = 0 where mtime < unix_timestamp() - 60 * 60"); if (!m_users_updates_buffer.empty()) { m_users_updates_buffer.pop_back(); async_query("insert into " + db_name("users") + " (downloaded, uploaded, " + db_name("uid") + ") values " + m_users_updates_buffer + " on duplicate key update" + " downloaded = downloaded + values(downloaded)," + " uploaded = uploaded + values(uploaded)"); m_users_updates_buffer.erase(); } }
void write_db_torrents() { m_write_db_torrents_time = srv_time(); if (!m_use_sql) return; try { std::string buffer; while (1) { for (auto& i : m_torrents) { t_torrent& file = i.second; if (!file.dirty) continue; if (!file.fid) { Csql_query(m_database, "insert into @files (info_hash, mtime, ctime) values (?, unix_timestamp(), unix_timestamp())")(i.first).execute(); file.fid = m_database.insert_id(); } buffer += Csql_query(m_database, "(?,?,?,?),")(file.leechers)(file.seeders)(file.completed)(file.fid).read(); file.dirty = false; if (buffer.size() > 255 << 10) break; } if (buffer.empty()) break; buffer.pop_back(); async_query("insert into " + db_name("files") + " (" + db_name("leechers") + ", " + db_name("seeders") + ", " + db_name("completed") + ", " + db_name("fid") + ") values " + buffer + " on duplicate key update" + " " + db_name("leechers") + " = values(" + db_name("leechers") + ")," + " " + db_name("seeders") + " = values(" + db_name("seeders") + ")," + " " + db_name("completed") + " = values(" + db_name("completed") + ")," + " mtime = unix_timestamp()"); buffer.clear(); } } catch (bad_query&) { } if (!m_announce_log_buffer.empty()) { m_announce_log_buffer.pop_back(); async_query("insert delayed into " + db_name("announce_log") + " (ipa, port, event, info_hash, peer_id, downloaded, left0, uploaded, uid, mtime) values " + m_announce_log_buffer); m_announce_log_buffer.erase(); } if (!m_scrape_log_buffer.empty()) { m_scrape_log_buffer.pop_back(); async_query("insert delayed into " + db_name("scrape_log") + " (ipa, uid, mtime) values " + m_scrape_log_buffer); m_scrape_log_buffer.erase(); } }
int gridfs_symlink(const char* target, const char* path) { path = fuse_to_mongo_path(path); mongo::OID id; id.init(); fuse_context *context = fuse_get_context(); mongo::BSONObjBuilder file; file << "_id" << id << "filename" << path << "chunkSize" << 0 << "uploadDate" << mongo::DATENOW << "md5" << 0 << "mode" << (S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO) << "target" << target; { passwd *pw = getpwuid(context->uid); if (pw) file << "owner" << pw->pw_name; } { group *gr = getgrgid(context->gid); if (gr) file << "group" << gr->gr_name; } auto sdc = make_ScopedDbConnection(); sdc->conn().insert(db_name() + ".files", file.obj()); return 0; }
int gridfs_readlink(const char* path, char* buf, size_t size) { path = fuse_to_mongo_path(path); auto sdc = make_ScopedDbConnection(); mongo::BSONObj file_obj = sdc->conn().findOne(db_name() + ".files", BSON("filename" << path)); if (file_obj.isEmpty()) return -ENOENT; if (!file_obj.hasField("target")) return -ENOENT; std::string target = file_obj["target"].String(); strncpy(buf, target.c_str(), size); if (target.length() >= size) buf[size] = 0; return 0; }
int main() { // 路由表, 使一个程序能逻辑上实现多个页面 std::map<String, void(*)(Page*)> handle; handle["index"] = index; handle["product_list"] = productList; handle["article_list"] = articleList; handle["node"] = node; handle["admin_login"] = adminLogin; handle["admin_index"] = adminIndex; handle["admin_user"] = adminUser; handle["admin_type"] = adminType; handle["admin_node"] = adminNode; handle["admin_node_modify"] = adminNodeModify; handle["admin_comment"] = adminComment; handle["admin_attachment"] = adminAttachment; handle["admin_attachment_dialog"] = adminAttachmentDialog; handle["admin_setting"] = adminSetting; handle["admin_password"] = adminPassword; handle["admin_edit_tmpl"] = adminEditTmpl; handle["admin_run_sql"] = adminRunSql; handle["admin_file"] = adminFile; // 获取数据库连接参数 String db_host(getenv("DATABASE_HOST")); String db_name(getenv("DATABASE_NAME")); String db_user(getenv("DATABASE_USER")); String db_password(getenv("DATABASE_PASSWORD")); int db_port = atoi(getenv("DATABASE_PORT")); // 打开数据库 db = new Mysql; db->open(db_host, db_user, db_password, db_name, db_port); // MySQL需要执行下面语句避免数据库中文乱码 db->exec("set names 'utf8'"); // 设置模版加载目录 Page::setTmplDir("./tmpl/"); // 临时文件存放目录 Page::setTempDir("./cache/"); // 文件上传目录 Page::setUploadDir("/uploads/"); // 初始化页面对象 Page page; // 页面中可以使用变量html_head在HTML头中插入额外的CSS和JS page.response("html_head", ""); String path = page.pathInfo(0); if(!path.startsWith("admin_")) { db->query("select name,value from settings where name in ('web_title','web_logo','web_keywords','web_description')"); while(db->next()) { if(db->getString(0) == "web_title") page.response("web_title", db->getString(1)); if(db->getString(0) == "web_logo") page.response("web_logo", db->getString(1)); if(db->getString(0) == "web_keywords") page.response("web_keywords", db->getString(1)); if(db->getString(0) == "web_description") page.response("web_description", db->getString(1)); } } if(path.empty()) index(&page); else if(handle.find(path) != handle.end()) handle[path](&page); else page.notFound(); // 关闭数据库 db->close(); delete db; return 0; }