@@ -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+ }
0 commit comments