Skip to content

Commit 77de574

Browse files
committedJan 19, 2014
[odb] wip: backend
1 parent c02db9d commit 77de574

File tree

6 files changed

+284
-9
lines changed

6 files changed

+284
-9
lines changed
 

‎example/odb_backend.php

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
3+
class Pool
4+
{
5+
public static $pool = array();
6+
}
7+
8+
$a = array(
9+
"read" => function($oid){
10+
echo "\e[32m# read $oid\e[m\n";
11+
return array(
12+
Pool::$pool[$oid][0],
13+
Pool::$pool[$oid][1],
14+
);
15+
},
16+
"read_prefix" => function(){
17+
echo "Helo WOrld";
18+
19+
},
20+
"read_header" => function() {
21+
echo "Helo WOrld";
22+
23+
},
24+
"write" => function($oid, $buffer, $otype) {
25+
echo "\e[32m# write $oid\e[m\n";
26+
Pool::$pool[$oid] = array($buffer, $otype);
27+
},
28+
"writestream" => function() {
29+
30+
},
31+
"readstream" => function() {
32+
33+
},
34+
"exists" => function($oid) {
35+
$retval = 0;
36+
if (isset(Pool::$pool[$oid])) {
37+
$retval = 1;
38+
}
39+
40+
echo "\e[32m# exists $retval\e[m\n";
41+
42+
return $retval;
43+
},
44+
"refresh" => function() {
45+
46+
},
47+
"foreach" => function() {
48+
49+
},
50+
"writepack" => function() {
51+
52+
},
53+
"free" => function() {
54+
}
55+
);
56+
$memory_backend = git_odb_backend_new($a);
57+
58+
$repo = git_repository_open(".");
59+
$odb = git_repository_odb($repo);
60+
git_odb_add_backend($odb, $memory_backend, 1000);
61+
62+
$oid = git_odb_write($odb, "Helo World(php memory backend)", GIT_OBJ_BLOB);
63+
$obj = git_odb_read($odb, $oid);
64+
65+
echo git_odb_object_data($obj);
66+
exit;

‎odb.c

+189-2
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ PHP_FUNCTION(git_odb_read)
107107
if (git_oid_fromstrn(&__id, id, id_len)) {
108108
RETURN_FALSE;
109109
}
110-
error = git_odb_read(&out, PHP_GIT2_V(_db, odb),& __id);
110+
error = git_odb_read(&out, PHP_GIT2_V(_db, odb),&__id);
111111
if (php_git2_check_error(error, "git_odb_read" TSRMLS_CC)) {
112112
RETURN_FALSE;
113113
}
@@ -568,14 +568,16 @@ PHP_FUNCTION(git_odb_object_data)
568568
{
569569
zval *object = NULL;
570570
php_git2_t *_object = NULL;
571+
const char *buffer;
571572

572573
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
573574
"r", &object) == FAILURE) {
574575
return;
575576
}
576577

577578
ZEND_FETCH_RESOURCE(_object, php_git2_t*, &object, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
578-
git_odb_object_data(PHP_GIT2_V(_object, odb_object));
579+
buffer = git_odb_object_data(PHP_GIT2_V(_object, odb_object));
580+
RETURN_STRINGL(buffer, git_odb_object_size(PHP_GIT2_V(_object, odb_object)), 1);
579581
}
580582
/* }}} */
581583

@@ -705,3 +707,188 @@ PHP_FUNCTION(git_odb_get_backend)
705707
}
706708
/* }}} */
707709

710+
static int php_git2_odb_backend_read(void **buffer, size_t *size, git_otype *type, git_odb_backend *backend, const git_oid *oid)
711+
{
712+
php_git2_t *result;
713+
php_git2_odb_backend *php_backend = (php_git2_odb_backend*)backend;
714+
zval *param_oid = NULL, *retval_ptr = NULL;
715+
php_git2_multi_cb_t *p = php_backend->multi;
716+
int i = 0, retval = 0;
717+
GIT2_TSRMLS_SET(p->tsrm_ls);
718+
char buf[41] = {0};
719+
720+
git_oid_fmt(buf, oid);
721+
MAKE_STD_ZVAL(param_oid);
722+
ZVAL_STRING(param_oid, buf, 1);
723+
724+
if (php_git2_call_function_v(&p->callbacks[0].fci, &p->callbacks[0].fcc TSRMLS_CC, &retval_ptr, 1, &param_oid)) {
725+
return GIT_EUSER;
726+
}
727+
if (Z_TYPE_P(retval_ptr) == IS_ARRAY) {
728+
zval **value, **otype;
729+
char *pp;
730+
731+
if (zend_hash_num_elements(Z_ARRVAL_P(retval_ptr)) != 2) {
732+
return GIT_ENOTFOUND;
733+
}
734+
735+
zend_hash_get_current_data(Z_ARRVAL_P(retval_ptr), (void **)&value);
736+
pp = git_odb_backend_malloc(backend, Z_STRLEN_PP(value));
737+
memset(pp, '\0', Z_STRLEN_PP(value));
738+
memcpy(pp, Z_STRVAL_PP(value), Z_STRLEN_PP(value));
739+
740+
*buffer = pp;
741+
*size = Z_STRLEN_PP(value);
742+
743+
zend_hash_move_forward(Z_ARRVAL_P(retval_ptr));
744+
zend_hash_get_current_data(Z_ARRVAL_P(retval_ptr), (void **)&otype);
745+
*type = Z_LVAL_PP(otype);
746+
} else {
747+
retval = GIT_ENOTFOUND;
748+
}
749+
750+
zval_ptr_dtor(&retval_ptr);
751+
return retval;
752+
}
753+
static int php_git2_odb_backend_write(git_odb_backend *backend, const git_oid *oid, const void *buffer, size_t size, git_otype type)
754+
{
755+
php_git2_t *result;
756+
php_git2_odb_backend *php_backend = (php_git2_odb_backend*)backend;
757+
zval *param_oid = NULL, *param_buffer = NULL, *param_otype = NULL, *retval_ptr = NULL;
758+
php_git2_multi_cb_t *p = php_backend->multi;
759+
int i = 0, retval = 0;
760+
GIT2_TSRMLS_SET(p->tsrm_ls);
761+
char buf[41] = {0};
762+
763+
git_oid_fmt(buf, oid);
764+
MAKE_STD_ZVAL(param_oid);
765+
MAKE_STD_ZVAL(param_buffer);
766+
MAKE_STD_ZVAL(param_otype);
767+
768+
ZVAL_STRING(param_oid, buf, 1);
769+
ZVAL_STRINGL(param_buffer, buffer, size, 1);
770+
ZVAL_LONG(param_otype, type);
771+
772+
if (php_git2_call_function_v(&p->callbacks[1].fci, &p->callbacks[1].fcc TSRMLS_CC, &retval_ptr, 3,
773+
&param_oid, &param_buffer, &param_otype)) {
774+
return GIT_EUSER;
775+
}
776+
777+
retval = Z_LVAL_P(retval_ptr);
778+
zval_ptr_dtor(&retval_ptr);
779+
return retval;
780+
}
781+
static int php_git2_odb_backend_read_prefix(git_oid *out_oid,
782+
void **buffer_p,
783+
size_t *len_p,
784+
git_otype *type_p,
785+
git_odb_backend *backend,
786+
const git_oid *short_oid,
787+
size_t len)
788+
{
789+
fprintf(stderr, "READ_PREFIX");
790+
}
791+
792+
static int php_git2_odb_backend_read_header(size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid)
793+
{
794+
}
795+
static int php_git2_odb_backend_writestream(git_odb_stream **stream_out, git_odb_backend *_backend, size_t length, git_otype type)
796+
{
797+
fprintf(stderr, "WRITES");
798+
}
799+
static int php_git2_odb_backend_exists(git_odb_backend *backend, const git_oid *oid)
800+
{
801+
php_git2_t *result;
802+
php_git2_odb_backend *php_backend = (php_git2_odb_backend*)backend;
803+
zval *param_oid = NULL, *retval_ptr = NULL;
804+
php_git2_multi_cb_t *p = php_backend->multi;
805+
int i = 0, retval = 0;
806+
GIT2_TSRMLS_SET(p->tsrm_ls);
807+
char buf[41] = {0};
808+
809+
git_oid_fmt(buf, oid);
810+
MAKE_STD_ZVAL(param_oid);
811+
ZVAL_STRING(param_oid, buf, 1);
812+
813+
if (php_git2_call_function_v(&p->callbacks[5].fci, &p->callbacks[5].fcc TSRMLS_CC, &retval_ptr, 1,
814+
&param_oid)) {
815+
return GIT_EUSER;
816+
}
817+
818+
retval = Z_LVAL_P(retval_ptr);
819+
if (retval == 1) {
820+
retval = 0;
821+
} else {
822+
retval = GIT_ENOTFOUND;
823+
}
824+
zval_ptr_dtor(&retval_ptr);
825+
return !retval;
826+
827+
}
828+
static int php_git2_odb_backend_foreach(git_odb_backend *_backend, git_odb_foreach_cb cb, void *data)
829+
{
830+
}
831+
static void php_git2_odb_backend_free(git_odb_backend *_backend)
832+
{
833+
}
834+
835+
PHP_FUNCTION(git_odb_backend_new)
836+
{
837+
php_git2_odb_backend *backend;
838+
php_git2_t *result;
839+
zval *callbacks, *tmp;
840+
zend_fcall_info read_fci, write_fci, read_prefix_fci, read_header_fci, writestream_fci,
841+
exists_fci, foreach_fci, free_fci;
842+
zend_fcall_info_cache read_fcc, write_fcc, read_prefix_fcc, read_header_fcc, writestream_fcc,
843+
exists_fcc, foreach_fcc, free_fcc;
844+
845+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
846+
"a", &callbacks) == FAILURE) {
847+
return;
848+
}
849+
850+
backend = ecalloc(1, sizeof(php_git2_odb_backend));
851+
852+
backend->parent.version = GIT_ODB_BACKEND_VERSION;
853+
backend->parent.read = &php_git2_odb_backend_read;
854+
backend->parent.write = &php_git2_odb_backend_write;
855+
backend->parent.read_prefix = &php_git2_odb_backend_read_prefix;
856+
backend->parent.read_header = &php_git2_odb_backend_read_header;
857+
backend->parent.writestream = &php_git2_odb_backend_writestream;
858+
backend->parent.exists = &php_git2_odb_backend_exists;
859+
backend->parent.foreach = &php_git2_odb_backend_foreach;
860+
backend->parent.free = &php_git2_odb_backend_free;
861+
862+
tmp = php_git2_read_arrval(callbacks, ZEND_STRS("read") TSRMLS_CC);
863+
if (tmp) {
864+
php_git2_fcall_info_wrapper2(tmp, &read_fci, &read_fcc TSRMLS_CC);
865+
}
866+
tmp = php_git2_read_arrval(callbacks, ZEND_STRS("write") TSRMLS_CC);
867+
if (tmp) {
868+
php_git2_fcall_info_wrapper2(tmp, &write_fci, &write_fcc TSRMLS_CC);
869+
}
870+
871+
tmp = php_git2_read_arrval(callbacks, ZEND_STRS("exists") TSRMLS_CC);
872+
if (tmp) {
873+
php_git2_fcall_info_wrapper2(tmp, &exists_fci, &exists_fcc TSRMLS_CC);
874+
}
875+
876+
877+
Z_ADDREF_P(callbacks);
878+
php_git2_multi_cb_init(&backend->multi, callbacks TSRMLS_CC, 8,
879+
&read_fci, &read_fcc,
880+
&write_fci, &write_fcc,
881+
&read_prefix_fci, &read_prefix_fcc,
882+
&read_header_fci, &read_header_fcc,
883+
&writestream_fci, &writestream_fcc,
884+
&exists_fci, &exists_fcc,
885+
&foreach_fci, &foreach_fcc,
886+
&free_fci, &free_fcc
887+
);
888+
889+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_ODB_BACKEND, backend, 1 TSRMLS_CC)) {
890+
RETURN_FALSE;
891+
}
892+
893+
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));
894+
}

‎odb.h

+6
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_git_odb_get_backend, 0, 0, 2)
173173
ZEND_ARG_INFO(0, pos)
174174
ZEND_END_ARG_INFO()
175175

176+
ZEND_BEGIN_ARG_INFO_EX(arginfo_git_odb_backend_new, 0, 0, 1)
177+
ZEND_ARG_INFO(0, callbacks)
178+
ZEND_END_ARG_INFO()
179+
176180
/* {{{ proto resource git_odb_new()
177181
*/
178182
PHP_FUNCTION(git_odb_new);
@@ -293,4 +297,6 @@ PHP_FUNCTION(git_odb_num_backends);
293297
*/
294298
PHP_FUNCTION(git_odb_get_backend);
295299

300+
PHP_FUNCTION(git_odb_backend_new);
301+
296302
#endif

‎php_git2.c

+10
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,14 @@ void static destruct_git2(zend_rsrc_list_entry *rsrc TSRMLS_DC)
116116
case PHP_GIT2_TYPE_FILTER_LIST:
117117
git_filter_list_free(PHP_GIT2_V(resource, filter_list));
118118
break;
119+
case PHP_GIT2_TYPE_ODB_BACKEND:
120+
{
121+
php_git2_odb_backend *backend = (php_git2_odb_backend*)PHP_GIT2_V(resource, odb_backend);
122+
zval_ptr_dtor(&backend->multi->payload);
123+
php_git2_multi_cb_free(backend->multi);
124+
efree(PHP_GIT2_V(resource, odb_backend));
125+
break;
126+
}
119127
}
120128
}
121129

@@ -846,6 +854,8 @@ static zend_function_entry php_git2_functions[] = {
846854
PHP_FE(git_odb_num_backends, arginfo_git_odb_num_backends)
847855
PHP_FE(git_odb_get_backend, arginfo_git_odb_get_backend)
848856

857+
PHP_FE(git_odb_backend_new, arginfo_git_odb_backend_new)
858+
849859
/* reflog */
850860
PHP_FE(git_reflog_read, arginfo_git_reflog_read)
851861
PHP_FE(git_reflog_write, arginfo_git_reflog_write)

‎php_git2.h

+6
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
#include "git2/odb_backend.h"
5353
#include "git2/trace.h"
5454
#include "git2/sys/filter.h"
55+
#include "git2/sys/odb_backend.h"
5556

5657
#include "date/php_date.h"
5758

@@ -223,4 +224,9 @@ typedef struct php_git2_filter {
223224
php_git2_multi_cb_t *multi;
224225
} php_git2_filter;
225226

227+
typedef struct php_git2_odb_backend {
228+
git_odb_backend parent;
229+
php_git2_multi_cb_t *multi;
230+
} php_git2_odb_backend;
231+
226232
#endif /* PHP_GIT2_H */

‎repository.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ PHP_FUNCTION(git_repository_wrap_odb)
287287
if (php_git2_check_error(error, "git_repository_wrap_odb" TSRMLS_CC)) {
288288
RETURN_FALSE;
289289
}
290-
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REPOSITORY, result, 1 TSRMLS_CC)) {
290+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REPOSITORY, out, 1 TSRMLS_CC)) {
291291
RETURN_FALSE;
292292
}
293293
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));
@@ -343,7 +343,7 @@ PHP_FUNCTION(git_repository_open_ext)
343343
if (php_git2_check_error(error, "git_repository_open_ext" TSRMLS_CC)) {
344344
RETURN_FALSE;
345345
}
346-
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REPOSITORY, result, 1 TSRMLS_CC)) {
346+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REPOSITORY, out, 1 TSRMLS_CC)) {
347347
RETURN_FALSE;
348348
}
349349
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));
@@ -392,7 +392,7 @@ PHP_FUNCTION(git_repository_init_ext)
392392
if (php_git2_check_error(error, "git_repository_init_ext" TSRMLS_CC)) {
393393
RETURN_FALSE;
394394
}
395-
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REPOSITORY, result, 1 TSRMLS_CC)) {
395+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REPOSITORY, out, 1 TSRMLS_CC)) {
396396
RETURN_FALSE;
397397
}
398398
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));
@@ -420,7 +420,7 @@ PHP_FUNCTION(git_repository_head)
420420
if (php_git2_check_error(error, "git_repository_head" TSRMLS_CC)) {
421421
RETURN_FALSE;
422422
}
423-
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REFERENCE, result, 1 TSRMLS_CC)) {
423+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REFERENCE, out, 1 TSRMLS_CC)) {
424424
RETURN_FALSE;
425425
}
426426
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));
@@ -573,7 +573,7 @@ PHP_FUNCTION(git_repository_config)
573573
if (php_git2_check_error(error, "git_repository_config" TSRMLS_CC)) {
574574
RETURN_FALSE;
575575
}
576-
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_CONFIG, result, 1 TSRMLS_CC)) {
576+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_CONFIG, out, 1 TSRMLS_CC)) {
577577
RETURN_FALSE;
578578
}
579579
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));
@@ -601,7 +601,7 @@ PHP_FUNCTION(git_repository_odb)
601601
if (php_git2_check_error(error, "git_repository_odb" TSRMLS_CC)) {
602602
RETURN_FALSE;
603603
}
604-
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_ODB, result, 1 TSRMLS_CC)) {
604+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_ODB, out, 1 TSRMLS_CC)) {
605605
RETURN_FALSE;
606606
}
607607
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));
@@ -629,7 +629,7 @@ PHP_FUNCTION(git_repository_refdb)
629629
if (php_git2_check_error(error, "git_repository_refdb" TSRMLS_CC)) {
630630
RETURN_FALSE;
631631
}
632-
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REFDB, result, 1 TSRMLS_CC)) {
632+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_REFDB, out, 1 TSRMLS_CC)) {
633633
RETURN_FALSE;
634634
}
635635
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));

0 commit comments

Comments
 (0)
Please sign in to comment.