@@ -107,7 +107,7 @@ PHP_FUNCTION(git_odb_read)
107
107
if (git_oid_fromstrn (& __id , id , id_len )) {
108
108
RETURN_FALSE ;
109
109
}
110
- error = git_odb_read (& out , PHP_GIT2_V (_db , odb ),& __id );
110
+ error = git_odb_read (& out , PHP_GIT2_V (_db , odb ),& __id );
111
111
if (php_git2_check_error (error , "git_odb_read" TSRMLS_CC )) {
112
112
RETURN_FALSE ;
113
113
}
@@ -568,14 +568,16 @@ PHP_FUNCTION(git_odb_object_data)
568
568
{
569
569
zval * object = NULL ;
570
570
php_git2_t * _object = NULL ;
571
+ const char * buffer ;
571
572
572
573
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
573
574
"r" , & object ) == FAILURE ) {
574
575
return ;
575
576
}
576
577
577
578
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 );
579
581
}
580
582
/* }}} */
581
583
@@ -705,3 +707,188 @@ PHP_FUNCTION(git_odb_get_backend)
705
707
}
706
708
/* }}} */
707
709
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