/*
		msql.library monitor example
		©1998 Christophe Sollet (cfc@iname.com)

		This monitor example list all msql.library function call.
*/

#include <exec/types.h>
#include <exec/memory.h>
#include <proto/exec.h>
#include <proto/msql.h>
#include <utility/hooks.h>
#include <utility/tagitem.h>
#include <dos/dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Hook *hook;
struct MsgPort *port;

struct Library *MsqlBase;

struct HMessage
{
	struct Message msg;
	struct HookMessage *hmsg;
};

ULONG __saveds __asm HookFunc(register __a0 struct Hook *hook, register __a2 APTR object, register __a1 APTR message)
{
	struct HMessage *hm;
	struct MsgPort *rp;

	if(hm = AllocMem(sizeof(struct HMessage), MEMF_CLEAR))
	{
		if(rp = CreateMsgPort())
		{
			hm->msg.mn_Node.ln_Type = NT_MESSAGE;
			hm->msg.mn_Length = sizeof(struct HMessage);
			hm->msg.mn_ReplyPort = rp;

			hm->hmsg = message;
			PutMsg(port, (struct Message *) hm);
			WaitPort(rp);
			GetMsg(rp);

			DeleteMsgPort(rp);
		}
		FreeMem(hm, sizeof(struct HMessage));
	}
	return NULL;
}

main()
{
	struct HMessage *hm;
	char buffer[80];

	if(MsqlBase = OpenLibrary("msql.library", 4))
	{
		if(port = CreateMsgPort())
		{
			if(hook = AllocVec(sizeof(struct Hook), MEMF_CLEAR))
			{
				hook->h_Entry = (HOOKFUNC) HookFunc;
				if(MsqlAddMHook(hook, TAG_DONE))
				{
					BOOL fin = FALSE;
					while(!fin)
					{
						ULONG sigrevd = Wait((1L << port->mp_SigBit) | SIGBREAKF_CTRL_C);

						if(sigrevd & SIGBREAKF_CTRL_C)
							fin = TRUE;
						else
						{
							while(hm = (struct HMessage *) GetMsg(port))
							{
								if(hm->hmsg->type == FCH_ENTER)
									strcpy(buffer, "0x%x-->%s"); else strcpy(buffer, "0x%x<--%s");

								switch(hm->hmsg->id)
								{
									case MFT_AllocConnection	:
										printf(buffer, hm->hmsg->task,  "MsqlAllocConnection()");
										break;
									case MFT_FreeConnection	:
										printf(buffer, hm->hmsg->task,  "MsqlFreeConnection()");
										break;
									case MFT_GetErrMsg		:
										printf(buffer, hm->hmsg->task,  "MsqlGetErrMsg()");
										break;
									case MFT_Connect			:
										printf(buffer, hm->hmsg->task,  "MsqlConnect()");
										break;
									case MFT_SelectDB		:
										printf(buffer, hm->hmsg->task,  "MsqlSelectDB()");
										break;
									case MFT_Query			:
										printf(buffer, hm->hmsg->task,  "MsqlQuery()");
										break;
									case MFT_CreateDB		:
										printf(buffer, hm->hmsg->task,  "MsqlCreateDB()");
										break;
									case MFT_DropDB			:
										printf(buffer, hm->hmsg->task,  "MsqlDropDB()");
										break;
									case MFT_Shutdown		:
										printf(buffer, hm->hmsg->task,  "MsqlShutdown()");
										break;
									case MFT_GetProtoInfo	:
										printf(buffer, hm->hmsg->task,  "MsqlGetProtoInfo()");
										break;
									case MFT_ReloadAcls		:
										printf(buffer, hm->hmsg->task,  "MsqlReloadAcls()");
										break;
									case MFT_GetServerInfo	:
										printf(buffer, hm->hmsg->task,  "MsqlGetServerInfo()");
										break;
									case MFT_GetHostInfo		:
										printf(buffer, hm->hmsg->task,  "MsqlGetHostInfo()");
										break;
									case MFT_Close			:
										printf(buffer, hm->hmsg->task,  "MsqlClose()");
										break;
									case MFT_DataSeek		:
										printf(buffer, hm->hmsg->task,  "MsqlDataSeek()");
										break;
									case MFT_FieldSeek		:
										printf(buffer, hm->hmsg->task,  "MsqlFieldSeek()");
										break;
									case MFT_FreeResult		:
										printf(buffer, hm->hmsg->task,  "MsqlFreeResult()");
										break;
									case MFT_FetchRow		:
										printf(buffer, hm->hmsg->task,  "MsqlFetchRow()");
										break;
									case MFT_FetchField		:
										printf(buffer, hm->hmsg->task,  "MsqlFetchField()");
										break;
									case MFT_ListDBs			:
										printf(buffer, hm->hmsg->task,  "MsqlListDBs()");
										break;
									case MFT_ListTables		:
										printf(buffer, hm->hmsg->task,  "MsqlListTables()");
										break;
									case MFT_ListFields		:
										printf(buffer, hm->hmsg->task,  "MsqlListFields()");
										break;
									case MFT_ListIndex		:
										printf(buffer, hm->hmsg->task,  "MsqlListIndex()");
										break;
									case MFT_StoreResult		:
										printf(buffer, hm->hmsg->task,  "MsqlStoreResult()");
										break;
									case MFT_LoadConfigFile	:
										printf(buffer, hm->hmsg->task,  "MsqlLoadConfigFile()");
										break;
									case MFT_GetIntConfOld	:
										printf(buffer, hm->hmsg->task,  "MsqlGetIntConfOld()");
										break;
									case MFT_GetCharConfOld	:
										printf(buffer, hm->hmsg->task,  "MsqlGetCharConfOld()");
										break;
									case MFT_GetIntConf		:
										printf(buffer, hm->hmsg->task,  "MsqlGetIntConf()");
										break;
									case MFT_GetCharConf		:
										printf(buffer, hm->hmsg->task,  "MsqlGetCharConf()");
										break;
									case MFT_GetServerStats	:
										printf(buffer, hm->hmsg->task,  "MsqlGetServerStats()");
										break;
									case MFT_CopyDB			:
										printf(buffer, hm->hmsg->task,  "MsqlCopyDB()");
										break;
									case MFT_MoveDB			:
										printf(buffer, hm->hmsg->task,  "MsqlMoveDB()");
										break;
									case MFT_UnixTimeToDate	:
										printf(buffer, hm->hmsg->task,  "MsqlUnixTimeToDate()");
										break;
									case MFT_UnixTimeToTime	:
										printf(buffer, hm->hmsg->task,  "MsqlUnixTimeToTime()");
										break;
									case MFT_GetSequenceInfo	:
										printf(buffer, hm->hmsg->task,  "MsqlGetSequenceInfo()");
										break;
									case MFT_DateToUnixTime	:
										printf(buffer, hm->hmsg->task,  "MsqlDateToUnixTime()");
										break;
									case MFT_TimeToUnixTime	:
										printf(buffer, hm->hmsg->task,  "MsqlTimeToUnixTime()");
										break;
									case MFT_SumTimes		:
										printf(buffer, hm->hmsg->task,  "MsqlSumTimes()");
										break;
									case MFT_DateOffset		:
										printf(buffer, hm->hmsg->task,  "MsqlDateOffset()");
										break;
									case MFT_DiffTimes		:
										printf(buffer, hm->hmsg->task,  "MsqlDiffTimes()");
										break;
									case MFT_DiffDates		:
										printf(buffer, hm->hmsg->task,  "MsqlDiffDates()");
										break;
									default:
										printf("Unknown function call!");
										break;

								}
								printf("\n");
								ReplyMsg((struct Message *) hm);
							}
						}
					}
					MsqlRemMHook(hook);
				}
				FreeVec(hook);
			}
			while(hm = (struct HMessage *) GetMsg(port)) ReplyMsg((struct Message *) hm);
			DeleteMsgPort(port);
		}
		CloseLibrary(MsqlBase);
	}
}
