libgit2 - 将树对象写入mysql odb后端

时间:2015-03-11 04:15:24

标签: mysql libgit2

我跟着libgit2-backend项目为libgit2 ODB后端创建了mysql后端。

创建blob对象并将其放入支持mysql的ODB中相当容易,我正在使用git_blob_create_frombuffer

但是当谈到像树这样的其他ODB对象时,这很困难。

据我所知,从libgit2文档101示例和API参考,您可以使用treebuilder或index编写树,但这两个appoach都需要路径。 由于存储库是使用git_repository_wrap_odb

创建的虚假存储库

我尝试使用像'README.md'之类的相对路径来构建树或索引,然后使用git_treebuilder_write或git_index_write_tree_to,但两者都在路径验证时失败。

我想知道将树对象写入mysql odb后端的选项。

提前致谢!

示例代码:

git_odb_backend_mysql(odb_backend,"localhost", "git2", "git2", "git2", 0, NULL, 0);

git_odb_new(&odb_backend->odb);
git_repository_wrap_odb(&repo, odb_backend->odb);
git_odb_add_backend(odb_backend->odb, odb_backend, 1);

git_blob_create_frombuffer(&oid, repo, str, strlen(str));

git_treebuilder_new(&bld, repo, NULL);
git_treebuilder_insert(NULL, bld, "README.md", &oid, 0100644);   
git_treebuilder_write(&treeoid, repo, bld);

这是在windows 7 32位,visual studio 2013 express for desktop edition

上测试的

Libgit2版本:0.22.1

我将测试代码放入libgit2_clar

str写入mysql:

select  lower(hex(oid)),type, size, convert(uncompress(data) using utf8)
from git2_odb;

oid                                       type size data
5dd01c177f5d7d1be5346a5bc18a569a7410c2ef  3    13   Hello, world! 

调用git_treebuilder_insert

时出错

错误讯息: libgit2_clar.exe中0x013A56A1处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

Visual Studio调试在libgit2 / src / win32 / path_w32.c,第196行停止

  if (path__is_absolute(src)) {

1 个答案:

答案 0 :(得分:0)

由于您正在获取segfault / AV,这是libgit2中的某个错误。最有可能的地方是路径验证,以确保没有插入危险或无效的路径。此NULL值的可能位置是存储库的路径,因为它用于确定最终路径是否会尝试写入gitdir中的任何检查。

你正在使用的构造函数只是用于读取dabatase而AFAIK从未被测试过是一种编写方式。我建议使用打开存储库,然后使用git_repository_set_odb()设置odb,如果你想使用存储库接口的话。