29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
# File 'ext/aerospike_native/key.c', line 29
VALUE key_initialize(int argc, VALUE* vArgs, VALUE vSelf)
{
VALUE vNamespace, vSet, vValue, vDigest = Qnil;
as_key *ptr;
as_digest* digest = NULL;
if (argc > 4 || argc < 3) { // there should only be 3 or 4 arguments
rb_raise(rb_eArgError, "wrong number of arguments (%d for 3..4)", argc);
}
vNamespace = vArgs[0];
Check_Type(vNamespace, T_STRING);
vSet = vArgs[1];
Check_Type(vSet, T_STRING);
vValue = vArgs[2];
if (argc == 4) {
vDigest = vArgs[3];
}
Data_Get_Struct(vSelf, as_key, ptr);
if(TYPE(vValue) != T_NIL) {
switch(TYPE(vValue)) {
case T_FIXNUM:
as_key_init_int64(ptr, StringValueCStr( vNamespace ), StringValueCStr( vSet ), FIX2LONG( vValue ));
break;
case T_STRING:
as_key_init_str(ptr, StringValueCStr( vNamespace ), StringValueCStr( vSet ), StringValueCStr( vValue ));
break;
default: {
VALUE vBytes = rb_funcall(vValue, rb_intern("to_msgpack"), 0);
as_key_init_raw(ptr, StringValueCStr( vNamespace ), StringValueCStr( vSet ), StringValuePtr(vBytes), RSTRING_LEN(vBytes));
}
}
} else {
Check_Type(vValue, T_NIL);
Check_Type(vDigest, T_STRING);
as_key_init_digest(ptr, StringValueCStr( vNamespace ), StringValueCStr( vSet ), StringValuePtr( vDigest ));
}
if (digest == NULL) {
digest = as_key_digest(ptr);
}
rb_iv_set(vSelf, "@namespace", vNamespace);
rb_iv_set(vSelf, "@set", vSet);
rb_iv_set(vSelf, "@value", vValue);
rb_iv_set(vSelf, "@digest", rb_str_new( digest->value, AS_DIGEST_VALUE_SIZE));
return vSelf;
}
|