From 4a7c3337a09ac177c7ee2aa70545dafa7f3e1d2e Mon Sep 17 00:00:00 2001 From: Maurilio Longo Date: Sun, 28 May 2000 19:39:31 +0000 Subject: [PATCH] 20000528-21:38 GMT+2 Maurilio Longo --- harbour/ChangeLog | 7 +++ harbour/contrib/msql/msql.c | 55 +++++++++++++++++++++ harbour/contrib/msql/tmsql.prg | 90 +++++++++++++++++++++++++++++++--- 3 files changed, 146 insertions(+), 6 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index c8013ef9ed..b6e4da4cc2 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,10 @@ +20000528-21:38 GMT+2 Maurilio Longo + + * contrib/msql/tmsql.prg + + added a few methods to TmSQLServer + * contrib/msql/msql.c + * changed to support new methods in tmsql.prg + 20000528-17:41 GMT+2 Maurilio Longo * doc/cvs_tips.txt diff --git a/harbour/contrib/msql/msql.c b/harbour/contrib/msql/msql.c index 850378a3f2..61d2cc330c 100644 --- a/harbour/contrib/msql/msql.c +++ b/harbour/contrib/msql/msql.c @@ -179,3 +179,58 @@ HB_FUNC(MSQLGETERR) // char *msqlGetErrMsg(char *); _retc(msqlGetErrMsg(NULL)); } + +HB_FUNC(MSQLLISTDB) // m_result * msqlListDBs(int); +{ + int sock = _parnl(1); + m_result *mresult; + m_row mrow; + long nr, i; + ITEM aDBs; + ITEM temp; + + mresult = msqlListDBs(sock); + nr = msqlNumRows(mresult); + aDBs = _itemArrayNew(nr); + + for (i = 0; i < nr; i++) { + mrow = msqlFetchRow(mresult); + temp = _itemPutC(NULL, mrow[0]); + + _itemArrayPut(aDBs, i + 1, temp); + _itemRelease(temp); + } + + msqlFreeResult(mresult); + _itemReturn(aDBs); + _itemRelease(aDBs); +} + + +HB_FUNC(MSQLLISTTA) // m_result * msqlListTables(int); +{ + int sock = _parnl(1); + m_result *mresult; + m_row mrow; + long nr, i; + ITEM aTables; + ITEM temp; + + mresult = msqlListTables(sock); + nr = msqlNumRows(mresult); + aTables = _itemArrayNew(nr); + + for (i = 0; i < nr; i++) { + + mrow = msqlFetchRow(mresult); + temp = _itemPutC(NULL, mrow[0]); + + _itemArrayPut(aTables, i + 1, temp); + _itemRelease(temp); + } + + msqlFreeResult(mresult); + _itemReturn(aTables); + _itemRelease(aTables); +} + diff --git a/harbour/contrib/msql/tmsql.prg b/harbour/contrib/msql/tmsql.prg index a8174427d8..9cdb611344 100644 --- a/harbour/contrib/msql/tmsql.prg +++ b/harbour/contrib/msql/tmsql.prg @@ -583,11 +583,15 @@ CLASS TmSQLServer METHOD SelectDB(cDBName) // Which data base I will use for subsequent queries - METHOD CreateTable(cName, aStruct) // Create new table using the same syntax of dbCreate() - METHOD DeleteTable(cName) // delete table + METHOD CreateTable(cTable, aStruct) // Create new table using the same syntax of dbCreate() + METHOD DeleteTable(cTable) // delete table + METHOD TableStruct(cTable) // returns a structure array compatible with clipper's dbStruct() ones METHOD CreateIndex(cName, cTable, aFNames, lUnique) // Create an index (unique) on field name(s) passed as an array of strings aFNames METHOD DeleteIndex(cName, cTable) // Delete index cName from cTable + METHOD ListDBs() // returns an array with list of data bases available + METHOD ListTables() // returns an array with list of available tables in current database + METHOD Query(cQuery) // Gets a textual query and returns a TmSQLQuery or TmSQLTable object METHOD NetErr() INLINE ::lError // Returns .T. if something went wrong @@ -622,9 +626,9 @@ METHOD SelectDB(cDBName) CLASS TmSQLServer return .F. -METHOD CreateTable(cName, aStruct) CLASS TmSQLServer +METHOD CreateTable(cTable, aStruct) CLASS TmSQLServer - local cCreateQuery := "CREATE TABLE " + cName + " (" + local cCreateQuery := "CREATE TABLE " + cTable + " (" local i for i := 1 to Len(aStruct) @@ -704,9 +708,9 @@ METHOD DeleteIndex(cName, cTable) CLASS TmSQLServer return .F. -METHOD DeleteTable(cName) CLASS TmSQLServer +METHOD DeleteTable(cTable) CLASS TmSQLServer - local cDropQuery := "DROP TABLE " + cName + local cDropQuery := "DROP TABLE " + cTable if msqlQuery(::nSocket, cDropQuery) == 1 return .T. @@ -756,3 +760,77 @@ METHOD Error() CLASS TmSQLServer return msqlGetErr() + +METHOD ListDBs() CLASS TmSQLServer + + local aList + + aList := msqlListDB(::nSocket) + +return aList + + +METHOD ListTables() CLASS TmSQLServer + + local aList + + aList := msqlListTa(::nSocket) + +return aList + + +/* TOFIX: Conversion creates a .dbf with fields of wrong dimension (often) */ +METHOD TableStruct(cTable) CLASS TmSQLServer + + local nRes, aField, aStruct, aSField, i + + aStruct := {} + nRes := msqlListFi(::nSocket, cTable) + + if nRes > 0 + for i := 1 to msqlNumFie(nRes) + + aField := msqlFetchF(nRes) + aSField := Array(DBS_DEC) + + // don't count indexes as real fields + if aField[MSQL_FS_TYPE] <= MSQL_LAST_REAL_TYPE + + aSField[DBS_NAME] := Left(aField[MSQL_FS_NAME], 10) + aSField[DBS_DEC] := 0 + + do case + case aField[MSQL_FS_TYPE] == MSQL_INT_TYPE + aSField[DBS_TYPE] := "N" + aSField[DBS_LEN] := 11 + + case aField[MSQL_FS_TYPE] == MSQL_UINT_TYPE + aSField[DBS_TYPE] := "L" + aSField[DBS_LEN] := 1 + + case aField[MSQL_FS_TYPE] == MSQL_CHAR_TYPE + aSField[DBS_TYPE] := "C" + aSField[DBS_LEN] := aField[MSQL_FS_LENGTH] + + case aField[MSQL_FS_TYPE] == MSQL_DATE_TYPE + aSField[DBS_TYPE] := "D" + aSField[DBS_LEN] := aField[MSQL_FS_LENGTH] + + case aField[MSQL_FS_TYPE] == MSQL_REAL_TYPE + aSField[DBS_TYPE] := "N" + aSField[DBS_LEN] := 12 + aSFIeld[DBS_DEC] := 8 + + otherwise + + endcase + + AAdd(aStruct, aSField) + endif + next + + msqlFreeR(nRes) + + endif + +return aStruct