#include "SampleLib.h"
#define QUEUE_NAME "DEMO_BOOK_QUEUE"
#define QUEUE_OBJECT_TYPE "UDT_BOOK"
#define NUM_BOOKS 2
#define NUM_ATTRS 3
struct bookType {
char *title;
char *authors;
double price;
};
struct bookType books[NUM_BOOKS] = {
{ "Oracle Call Interface Programmers Guide", "Oracle", 0 },
{ "Selecting Employees", "Scott Tiger", 7.99 }
};
int main(int argc, char **argv)
{
dpiObjectAttr *attrs[NUM_ATTRS];
dpiDeqOptions *deqOptions;
dpiObjectType *objType;
dpiMsgProps *msgProps;
dpiData attrValue;
dpiQueue *queue;
dpiObject *book;
dpiConn *conn;
uint32_t i;
conn = dpiSamples_getConn(0, NULL);
if (dpiConn_getObjectType(conn, QUEUE_OBJECT_TYPE,
strlen(QUEUE_OBJECT_TYPE), &objType) < 0)
return dpiSamples_showError();
if (dpiObjectType_getAttributes(objType, NUM_ATTRS, attrs) < 0)
return dpiSamples_showError();
if (dpiConn_newQueue(conn, QUEUE_NAME, strlen(QUEUE_NAME),
objType, &queue) < 0)
return dpiSamples_showError();
dpiConn_release(conn);
if (dpiConn_newMsgProps(conn, &msgProps) < 0)
return dpiSamples_showError();
if (dpiObjectType_createObject(objType, &book) < 0)
return dpiSamples_showError();
if (dpiMsgProps_setPayloadObject(msgProps, book) < 0)
return dpiSamples_showError();
printf("Enqueuing messages...\n");
for (i = 0; i < NUM_BOOKS; i++) {
printf("%s\n", books[i].title);
dpiData_setBytes(&attrValue, books[i].title, strlen(books[i].title));
if (dpiObject_setAttributeValue(book, attrs[0], DPI_NATIVE_TYPE_BYTES,
&attrValue) < 0)
return dpiSamples_showError();
dpiData_setBytes(&attrValue, books[i].authors,
strlen(books[i].authors));
if (dpiObject_setAttributeValue(book, attrs[1], DPI_NATIVE_TYPE_BYTES,
&attrValue) < 0)
return dpiSamples_showError();
dpiData_setDouble(&attrValue, books[i].price);
if (dpiObject_setAttributeValue(book, attrs[2], DPI_NATIVE_TYPE_DOUBLE,
&attrValue) < 0)
return dpiSamples_showError();
if (dpiQueue_enqOne(queue, msgProps) < 0)
return dpiSamples_showError();
}
dpiObjectType_release(objType);
dpiMsgProps_release(msgProps);
dpiObject_release(book);
if (dpiQueue_getDeqOptions(queue, &deqOptions) < 0)
return dpiSamples_showError();
if (dpiDeqOptions_setNavigation(deqOptions, DPI_DEQ_NAV_FIRST_MSG) < 0)
return dpiSamples_showError();
if (dpiDeqOptions_setWait(deqOptions, DPI_DEQ_WAIT_NO_WAIT) < 0)
return dpiSamples_showError();
printf("\nDequeuing messages...\n");
while (1) {
if (dpiQueue_deqOne(queue, &msgProps) < 0)
return dpiSamples_showError();
if (!msgProps)
break;
if (dpiMsgProps_getPayload(msgProps, &book, NULL, NULL) < 0)
return dpiSamples_showError();
if (dpiObject_getAttributeValue(book, attrs[0], DPI_NATIVE_TYPE_BYTES,
&attrValue) < 0)
return dpiSamples_showError();
printf("%.*s\n", attrValue.value.asBytes.length,
attrValue.value.asBytes.ptr);
dpiMsgProps_release(msgProps);
}
for (i = 0; i < NUM_ATTRS; i++)
dpiObjectAttr_release(attrs[i]);
printf("\nDone.\n");
return 0;
}