MCPcopy Create free account
hub / github.com/2shady4u/godot-sqlite / function_callback

Function function_callback

src/gdsqlite.cpp:778–860  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

776}
777
778static void function_callback(sqlite3_context *context, int argc, sqlite3_value **argv) {
779 void *temp = sqlite3_user_data(context);
780 Callable callable = *(Callable *)temp;
781
782 /* Check if the callable is valid */
783 if (!callable.is_valid()) {
784 ERR_PRINT("GDSQLite Error: Supplied function reference is invalid! Aborting callback...");
785 return;
786 }
787
788 Array argument_array = Array();
789 Variant argument_value;
790 for (int i = 0; i <= argc - 1; i++) {
791 sqlite3_value *value = *argv;
792 /* Check the value type and do correct casting */
793 switch (sqlite3_value_type(value)) {
794 case SQLITE_INTEGER:
795 argument_value = Variant((int64_t)sqlite3_value_int64(value));
796 break;
797
798 case SQLITE_FLOAT:
799 argument_value = Variant(sqlite3_value_double(value));
800 break;
801
802 case SQLITE_TEXT:
803 argument_value = Variant((char *)sqlite3_value_text(value));
804 break;
805
806 case SQLITE_BLOB: {
807 int bytes = sqlite3_value_bytes(value);
808 PackedByteArray arr = PackedByteArray();
809 arr.resize(bytes);
810 memcpy((void *)arr.ptrw(), (char *)sqlite3_value_blob(value), bytes);
811 argument_value = arr;
812 break;
813 }
814
815 case SQLITE_NULL:
816 break;
817
818 default:
819 break;
820 }
821
822 argument_array.append(argument_value);
823 argv += 1;
824 }
825
826 Variant output = callable.callv(argument_array);
827
828 switch (output.get_type()) {
829 case Variant::NIL:
830 sqlite3_result_null(context);
831 break;
832
833 case Variant::BOOL:
834 case Variant::INT:
835 sqlite3_result_int64(context, int64_t(output));

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected