PyObject * dataconv_ReadFromInTuple(PyObject *self, PyObject *args)
{
PyObject *obArgTypes;
PyObject *obArgType;
PyObject *obPtr;
BYTE *pb;
BYTE *pbArg;
Py_ssize_t cArgs, i;
PyObject *obArgs = NULL;
PyObject *obArg;
VARTYPE vtArgType;
UINT cb;
VARIANT var;
BOOL bIsByRef;
if (!PyArg_ParseTuple(args, "OO:ReadFromInTuple", &obArgTypes, &obPtr))
return NULL;
pbArg = (BYTE *)PyLong_AsVoidPtr(obPtr);
assert(pbArg);
if (!pbArg)
return NULL;
pb = pbArg;
if (!PyTuple_Check(obArgTypes))
{
PyErr_SetString(PyExc_TypeError, "OLE type description - expecting a tuple");
return NULL;
}
cArgs = PyTuple_Size(obArgTypes);
obArgs = PyTuple_New(cArgs);
if (!obArgs)
return NULL;
for(i = 0 ; i < cArgs; i++)
{
// (<type tuple>, argPtr offset, arg size)
if (PyTuple_Size(PyTuple_GET_ITEM(obArgTypes, i)) != 3)
{
PyErr_SetString(PyExc_TypeError, "OLE type description - expecting an arg desc tuple of size 3");
goto Error;
}
obArgType = PyTuple_GET_ITEM(PyTuple_GET_ITEM(obArgTypes, i), 0);
// Position pb to point to the current argument.
pb = pbArg + PyInt_AS_LONG(PyTuple_GET_ITEM(PyTuple_GET_ITEM(obArgTypes, i), 1));
vtArgType = (VARTYPE)PyInt_AS_LONG(obArgType);
#ifdef _M_IX86
bIsByRef = vtArgType & VT_BYREF;
#elif _M_X64
// params > 64bits always passed by address - and the only
// arg we support > 64 bits is a VARIANT structure.
bIsByRef = (vtArgType==VT_VARIANT) || (vtArgType & VT_BYREF);
#else
#error Unknown platform
#endif
VARTYPE vtConversionType = vtArgType & VT_TYPEMASK;
if (vtArgType & VT_ARRAY) {
SAFEARRAY FAR *psa = *((SAFEARRAY **)pb);
if (psa==NULL) { // A NULL array
Py_INCREF(Py_None);
obArg = Py_None;
} else {
if (vtArgType & VT_BYREF) // one more level of indirection
psa = *((SAFEARRAY FAR **)psa);
if (psa==NULL) { // A NULL array
Py_INCREF(Py_None);
obArg = Py_None;
} else
obArg = PyCom_PyObjectFromSAFEARRAY(psa, (VARENUM)vtConversionType);
}
} else {
switch (vtConversionType)
{
// If they can fit in a VARIANT, cheat and make that code do all of the work...
case VT_I2:
case VT_I4:
case VT_R4:
case VT_R8:
case VT_CY:
case VT_DATE:
case VT_BSTR:
case VT_ERROR:
case VT_BOOL:
case VT_I1:
case VT_UI1:
case VT_UI2:
case VT_UI4:
case VT_INT:
case VT_UINT:
case VT_UNKNOWN:
case VT_DISPATCH:
case VT_HRESULT:
VariantInit(&var);
if (vtConversionType == VT_HRESULT ||
vtConversionType == VT_INT)
//.........这里部分代码省略.........
//.........这里部分代码省略.........
{
PyErr_Format(PyExc_TypeError,
"signal 'attribute_names' must be a sequence of str, not %s",
sipPyTypeName(Py_TYPE(value)));
if (parameter_names)
delete parameter_names;
Py_XDECREF(name_obj);
return -1;
}
}
else
{
#if PY_MAJOR_VERSION >= 3
PyErr_Format(PyExc_TypeError,
"pyqtSignal() got an unexpected keyword argument '%U'",
key);
#else
PyErr_Format(PyExc_TypeError,
"pyqtSignal() got an unexpected keyword argument '%s'",
PyString_AsString(key));
#endif
Py_XDECREF(name_obj);
return -1;
}
}
}
// If there is at least one argument and it is a sequence then assume all
// arguments are sequences. Unfortunately a string is also a sequence so
// check for tuples and lists explicitly.
if (PyTuple_Size(args) > 0 && (PyTuple_Check(PyTuple_GetItem(args, 0)) || PyList_Check(PyTuple_GetItem(args, 0))))
{
for (Py_ssize_t i = 0; i < PyTuple_Size(args); ++i)
{
PyObject *types = PySequence_Tuple(PyTuple_GetItem(args, i));
if (!types)
{
PyErr_SetString(PyExc_TypeError,
"pyqtSignal() argument expected to be sequence of types");
if (name)
{
Py_DECREF(name_obj);
}
return -1;
}
int rc;
if (i == 0)
{
// The first is the default.
rc = init_signal_from_types(ps, name, parameter_names,
revision, types);
}
else
{
qpycore_pyqtSignal *overload = (qpycore_pyqtSignal *)PyType_GenericNew(qpycore_pyqtSignal_TypeObject, 0, 0);
if (!overload)
{
/**
*********************************************************************
* This function will invoke aerospike_batch_get_bins to get filtered
* bins from all the records in a batches.
*
* @param self AerospikeClient object
* @param py_keys List of keys passed on by user
* @param py_bins List of filter bins passed on by user
* @param py_policy User specified Policy dictionary
*
*********************************************************************
**/
static
PyObject * AerospikeClient_Select_Many_Invoke(
AerospikeClient * self,
PyObject * py_keys, PyObject * py_bins, PyObject * py_policy)
{
// Python Return Value
PyObject * py_recs = NULL;
// Aerospike Client Arguments
as_error err;
as_policy_batch policy;
as_policy_batch * batch_policy_p = NULL;
Py_ssize_t bins_size = 0;
char **filter_bins = NULL;
bool has_batch_index = false;
// Unicode object's pool
UnicodePyObjects u_objs;
u_objs.size = 0;
int i = 0;
// Initialize error
as_error_init(&err);
if (!self || !self->as) {
as_error_update(&err, AEROSPIKE_ERR_PARAM, "Invalid aerospike object");
goto CLEANUP;
}
if (!self->is_conn_16) {
as_error_update(&err, AEROSPIKE_ERR_CLUSTER, "No connection to aerospike cluster");
goto CLEANUP;
}
// Check the type of bins and get it's size
// i.e. number of bins provided
if (py_bins != NULL && PyList_Check(py_bins)) {
bins_size = PyList_Size(py_bins);
}
else if (py_bins != NULL && PyTuple_Check(py_bins)) {
bins_size = PyTuple_Size(py_bins);
}
else {
as_error_update(&err, AEROSPIKE_ERR_PARAM, "Filter bins should be specified as a list or tuple.");
goto CLEANUP;
}
filter_bins = (char **)malloc(sizeof(long int) * bins_size);
for (i = 0; i < bins_size; i++) {
PyObject *py_bin = NULL;
if(PyList_Check(py_bins)) {
py_bin = PyList_GetItem(py_bins, i);
}
if(PyTuple_Check(py_bins)) {
py_bin = PyTuple_GetItem(py_bins, i);
}
if (PyUnicode_Check(py_bin)) {
// Store the unicode object into a pool
// It is DECREFed at later stages
// So, no need of DECREF here.
filter_bins[i] = PyStr_AsString(
store_unicode_bins(&u_objs, PyUnicode_AsUTF8String(py_bin)));
}
else if (PyStr_Check(py_bin)) {
filter_bins[i] = PyStr_AsString(py_bin);
}
else {
as_error_update(&err, AEROSPIKE_ERR_PARAM, "Bin name should be a string or unicode string.");
goto CLEANUP;
}
}
// Convert python policy object to as_policy_batch
pyobject_to_policy_batch(&err, py_policy, &policy, &batch_policy_p,
&self->as->config.policies.batch);
if ( err.code != AEROSPIKE_OK ) {
goto CLEANUP;
}
has_batch_index = aerospike_has_batch_index(self->as);
if (has_batch_index) {
py_recs = batch_select_aerospike_batch_read(&err, self, py_keys, batch_policy_p, filter_bins, bins_size);
} else {
py_recs = batch_select_aerospike_batch_get(&err, self, py_keys, batch_policy_p, filter_bins, bins_size);
}
CLEANUP:
//.........这里部分代码省略.........
/**
*******************************************************************************************************
* This function will get a batch of records from the Aeropike DB.
*
* @param err as_error object
* @param self AerospikeClient object
* @param py_keys The list of keys
* @param batch_policy_p as_policy_batch object
*
* Returns the record if key exists otherwise NULL.
*******************************************************************************************************
*/
static PyObject * batch_select_aerospike_batch_get(as_error *err, AerospikeClient * self, PyObject *py_keys, as_policy_batch * batch_policy_p, char **filter_bins, Py_ssize_t bins_size)
{
PyObject * py_recs = NULL;
as_batch batch;
bool batch_initialised = false;
// Convert python keys list to as_key ** and add it to as_batch.keys
// keys can be specified in PyList or PyTuple
if ( py_keys != NULL && PyList_Check(py_keys) ) {
Py_ssize_t size = PyList_Size(py_keys);
py_recs = PyList_New(size);
as_batch_init(&batch, size);
// Batch object initialised
batch_initialised = true;
for ( int i = 0; i < size; i++ ) {
PyObject * py_key = PyList_GetItem(py_keys, i);
if ( !PyTuple_Check(py_key) ) {
as_error_update(err, AEROSPIKE_ERR_PARAM, "Key should be a tuple.");
goto CLEANUP;
}
pyobject_to_key(err, py_key, as_batch_keyat(&batch, i));
if ( err->code != AEROSPIKE_OK ) {
goto CLEANUP;
}
}
}
else if ( py_keys != NULL && PyTuple_Check(py_keys) ) {
Py_ssize_t size = PyTuple_Size(py_keys);
py_recs = PyList_New(size);
as_batch_init(&batch, size);
// Batch object initialised
batch_initialised = true;
for ( int i = 0; i < size; i++ ) {
PyObject * py_key = PyTuple_GetItem(py_keys, i);
if ( !PyTuple_Check(py_key) ) {
as_error_update(err, AEROSPIKE_ERR_PARAM, "Key should be a tuple.");
goto CLEANUP;
}
pyobject_to_key(err, py_key, as_batch_keyat(&batch, i));
if ( err->code != AEROSPIKE_OK ) {
goto CLEANUP;
}
}
}
else {
as_error_update(err, AEROSPIKE_ERR_PARAM, "Keys should be specified as a list or tuple.");
goto CLEANUP;
}
// Invoke C-client API
aerospike_batch_get_bins(self->as, err, batch_policy_p,
&batch, (const char **) filter_bins, bins_size,
(aerospike_batch_read_callback) batch_select_cb,
py_recs);
CLEANUP:
if (batch_initialised == true) {
// We should destroy batch object as we are using 'as_batch_init' for initialisation
// Also, pyobject_to_key is soing strdup() in case of Unicode. So, object destruction
// is necessary.
as_batch_destroy(&batch);
}
return py_recs;
}
/**
* pyg_flags_get_value:
* @flag_type: the GType of the flag.
* @obj: a Python object representing the flag value
* @val: a pointer to the location to store the integer representation of the flag.
*
* Converts a Python object to the integer equivalent. The conversion
* will depend on the type of the Python object. If the object is an
* integer, it is passed through directly. If it is a string, it will
* be treated as a full or short flag name as defined in the GType.
* If it is a tuple, then the items are treated as strings and ORed
* together.
*
* Returns: 0 on success or -1 on failure
*/
gint
pyg_flags_get_value(GType flag_type, PyObject *obj, gint *val)
{
GFlagsClass *fclass = NULL;
gint res = -1;
g_return_val_if_fail(val != NULL, -1);
if (!obj) {
*val = 0;
res = 0;
} else if (PYGLIB_PyLong_Check(obj)) {
*val = PYGLIB_PyLong_AsLong(obj);
res = 0;
} else if (PyLong_Check(obj)) {
*val = PyLong_AsLongLong(obj);
res = 0;
} else if (PYGLIB_PyUnicode_Check(obj)) {
GFlagsValue *info;
char *str = PYGLIB_PyUnicode_AsString(obj);
if (flag_type != G_TYPE_NONE)
fclass = G_FLAGS_CLASS(g_type_class_ref(flag_type));
else {
PyErr_SetString(PyExc_TypeError, "could not convert string to flag because there is no GType associated to look up the value");
res = -1;
}
info = g_flags_get_value_by_name(fclass, str);
g_type_class_unref(fclass);
if (!info)
info = g_flags_get_value_by_nick(fclass, str);
if (info) {
*val = info->value;
res = 0;
} else {
PyErr_SetString(PyExc_TypeError, "could not convert string");
res = -1;
}
} else if (PyTuple_Check(obj)) {
int i, len;
len = PyTuple_Size(obj);
*val = 0;
res = 0;
if (flag_type != G_TYPE_NONE)
fclass = G_FLAGS_CLASS(g_type_class_ref(flag_type));
else {
PyErr_SetString(PyExc_TypeError, "could not convert string to flag because there is no GType associated to look up the value");
res = -1;
}
for (i = 0; i < len; i++) {
PyObject *item = PyTuple_GetItem(obj, i);
char *str = PYGLIB_PyUnicode_AsString(item);
GFlagsValue *info = g_flags_get_value_by_name(fclass, str);
if (!info)
info = g_flags_get_value_by_nick(fclass, str);
if (info) {
*val |= info->value;
} else {
PyErr_SetString(PyExc_TypeError, "could not convert string");
res = -1;
break;
}
}
g_type_class_unref(fclass);
} else {
PyErr_SetString(PyExc_TypeError,
"flag values must be strings, ints, longs, or tuples");
res = -1;
}
return res;
}
开发者ID:nzjrs,项目名称:pygobject,代码行数:90,代码来源:pygtype.c
示例15: _same_vals_helper
static int
_same_vals_helper(PyObject *v1, PyObject *v2)
{
PyTypeObject *typ1, *typ2;
if (v1 == v2) return 0; // 0 -> items are equal
typ1 = v1->ob_type;
typ2 = v2->ob_type;
if (typ1 != typ2) return 1;
if (typ1 == &PyDict_Type) {
PyObject *key;
PyObject *value;
XXX_Py_ssize_t pos = 0;
if (PyDict_Size(v1) != PyDict_Size(v2)) {
return 1;
}
while (PyDict_Next(v1, &pos, &key, &value)) {
// note: when compiling the above line I get the following warning, hopefully harmless:
// samevalshelp.c:49: warning: passing argument 2 of ‘PyDict_Next’ from incompatible pointer type
// [bruce 090206, compiling on Mac OS 10.5.6, pyrexc version 0.9.6.4]
PyObject *value2 = PyDict_GetItem(v2, key);
if (value2 == NULL) {
return 1;
}
if (_same_vals_helper(value, value2)) {
return 1;
}
}
return 0;
} else if (typ1 == &PyList_Type) {
int i, n;
n = PyList_Size(v1);
if (n != PyList_Size(v2)) {
return 1;
}
for (i = 0; i < n; i++)
if (_same_vals_helper(PyList_GetItem(v1, i),
PyList_GetItem(v2, i)))
return 1;
return 0;
} else if (typ1 == &PyTuple_Type) {
int i, n;
n = PyTuple_Size(v1);
if (n != PyTuple_Size(v2)) {
return 1;
}
for (i = 0; i < n; i++)
if (_same_vals_helper(PyTuple_GetItem(v1, i),
PyTuple_GetItem(v2, i)))
return 1;
return 0;
} else if (arrayType != NULL && typ1 == arrayType) {
PyArrayObject *x = (PyArrayObject *) v1;
PyArrayObject *y = (PyArrayObject *) v2;
int i;
int elementSize;
int *indices;
int topDimension;
char *xdata;
char *ydata;
int objectCompare = 0;
// do all quick rejects first (no loops)
if (x->nd != y->nd) {
// number of dimensions doesn't match
return 1;
// note that a (1 x X) array can never equal a single
// dimensional array of length X.
}
if (x->descr->type_num != y->descr->type_num) {
// type of elements doesn't match
return 1;
}
if (x->descr->type_num == PyArray_OBJECT) {
objectCompare = 1;
}
elementSize = x->descr->elsize;
if (elementSize != y->descr->elsize) {
// size of elements doesn't match (shouldn't happen if
// types match!)
return 1;
}
for (i = x->nd - 1; i >= 0; i--) {
if (x->dimensions[i] != y->dimensions[i])
// shapes don't match
return 1;
}
// we do a lot of these, so handle them early
if (x->nd == 1 && !objectCompare && x->strides[0]==elementSize && y->strides[0]==elementSize) {
// contiguous one dimensional array of non-objects
return memcmp(x->data, y->data, elementSize * x->dimensions[0]) ? 1 : 0;
}
if (x->nd == 0) {
// scalar, just compare one element
if (objectCompare) {
return _same_vals_helper(*(PyObject **)x->data, *(PyObject **)y->data);
} else {
return memcmp(x->data, y->data, elementSize) ? 1 : 0;
//.........这里部分代码省略.........
请发表评论