Ejemplo n.º 1
0
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();
	}
}
Ejemplo n.º 2
0
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();
	}
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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;
}