diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 3e93a0c945..13562879a5 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,19 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-05-03 10:11 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * contrib/hbmysql/mysql.ch + * contrib/hbmysql/tmysql.prg + * Synced type constant names with MYSQL. + Kept old names for compatibility, guarded with HB_LEGACY_LEVEL3. + + * contrib/hbmysql/tmysql.prg + % Minor optimizations. + ! TMySQLRow:MakePrimaryKeyWhere() and TMySQLTable:MakePrimaryKeyWhere() + fixed to not create wrong SQL expression when no primary key + is present. + ; TOFIX: Handle this case properly in callers of these methods. + 2010-05-03 00:38 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * contrib/hbxbp/xbptoolbar.prg ! Issued: setWindowaTitle() for main menubar. @@ -34,16 +47,16 @@ * contrib/hbide/ideshortcuts.prg + Implemented: almost all the docks can be placed on any of the areas. Exception is "Output Console" which is only dockable to top or bottom. - + Main toolbar and statusbar featured to toggle. Statusbar, however is - session dependant, i.e., is not saved for next run. + + Main toolbar and statusbar featured to toggle. Statusbar, however is + session dependant, i.e., is not saved for next run. ! Many artifacts fixed for Search/Replace engine, all the three variants. ! "Exppression" edit fixed to respect "Enter" key press to start searching. ! More artifacts I must be forgetting. - + 2010-05-02 18:11 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * contrib/hbqt/hbqt_hbqplaintextedit.cpp % Fixed to honor right-to-left selection. - Now text can be selected in either directions with + Now text can be selected in either directions with keyboard and mouse, both. 2010-05-02 16:29 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) @@ -53,7 +66,7 @@ 2010-05-02 16:12 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * contrib/hbqt/hbqt_hbqplaintextedit.cpp + Implemented: horizontally scrolled text to be copied. - So now it is identical to xMate in all respects plus + So now it is identical to xMate in all respects plus selection through mouse as properitory to hbIDE. 2010-05-02 15:00 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) @@ -64,7 +77,7 @@ + Implemented: much-awaited and extremely-required feature - block copy/paste. This implementation closely follows xMate's footsteps and is highly optimized, - having maximum tasks carried through .prg code. Probably this opens up + having maximum tasks carried through .prg code. Probably this opens up hbIDE to wider audience. This has been the most difficult feature so far, and has consumed an entire week with intensive schedule. @@ -79,7 +92,7 @@ Mouse : Mouse-move while left-button pressed ( Only available for visible text ). Copy : Ctrl+C ( text is also available on the clip-board ) Paste : Ctrl+V ( text only copied through Ctrl+C while in "Column Selection" mode ). - Inserts : Position cursor at first line and column, + Inserts : Position cursor at first line and column, Press Shift+Down arraow upto some ending row, A thin-vertical-line should appear follwoing your cursor path, Start typing any characters, @@ -90,10 +103,10 @@ Deletes : Select the text with Shift+Navigation Keys, Press "Del". - It is highly possible that some of the artifacts may have gone not exactly like + It is highly possible that some of the artifacts may have gone not exactly like xMate, so please report back. Also note that selections left-to-right are known - for accuracy, right-to-left may not produce accurate results. Other thing to - note is that horizontal scrolling has not been possible, so if your text goes + for accuracy, right-to-left may not produce accurate results. Other thing to + note is that horizontal scrolling has not been possible, so if your text goes beyond right-edge of the window and you have a need to copy it, then first zoom-in to brought it into viewport, then start selection process. Vertical length does not matter. However with mouse you can only select a window-full of text. diff --git a/harbour/contrib/hbmysql/mysql.ch b/harbour/contrib/hbmysql/mysql.ch index f0e79ae349..e24e7b27f9 100644 --- a/harbour/contrib/hbmysql/mysql.ch +++ b/harbour/contrib/hbmysql/mysql.ch @@ -52,56 +52,87 @@ */ /* MySQL field types */ -#define MYSQL_TINY_TYPE 1 /* NOTE: TINY is used to map clipper logical values to MySQL tables, so 0 == .F., 1 == .T. */ -#define MYSQL_SHORT_TYPE 2 -#define MYSQL_LONG_TYPE 3 -#define MYSQL_FLOAT_TYPE 4 -#define MYSQL_DOUBLE_TYPE 5 -#define MYSQL_NULL_TYPE 6 -#define MYSQL_TIMESTAMP_TYPE 7 -#define MYSQL_LONGLONG_TYPE 8 -#define MYSQL_INT24_TYPE 9 -#define MYSQL_DATE_TYPE 10 -#define MYSQL_TIME_TYPE 11 -#define MYSQL_DATETIME_TYPE 12 -#define MYSQL_YEAR_TYPE 13 -#define MYSQL_NEWDATE_TYPE 14 -#define MYSQL_DECIMAL_TYPE 246 -#define MYSQL_ENUMTYPE 247 -#define MYSQL_SET_TYPE 248 -#define MYSQL_TINY_BLOB_TYPE 249 -#define MYSQL_MEDIUM_BLOB_TYPE 250 -#define MYSQL_LONG_BLOB_TYPE 251 -#define MYSQL_BLOB_TYPE 252 -#define MYSQL_VAR_STRING_TYPE 253 -#define MYSQL_STRING_TYPE 254 +#define MYSQL_TYPE_DECIMAL 0 +#define MYSQL_TYPE_TINY 1 /* NOTE: TINY is used to map clipper logical values to MySQL tables, so 0 == .F., 1 == .T. */ +#define MYSQL_TYPE_SHORT 2 +#define MYSQL_TYPE_LONG 3 +#define MYSQL_TYPE_FLOAT 4 +#define MYSQL_TYPE_DOUBLE 5 +#define MYSQL_TYPE_NULL 6 +#define MYSQL_TYPE_TIMESTAMP 7 +#define MYSQL_TYPE_LONGLONG 8 +#define MYSQL_TYPE_INT24 9 +#define MYSQL_TYPE_DATE 10 +#define MYSQL_TYPE_TIME 11 +#define MYSQL_TYPE_DATETIME 12 +#define MYSQL_TYPE_YEAR 13 +#define MYSQL_TYPE_NEWDATE 14 +#define MYSQL_TYPE_VARCHAR 15 +#define MYSQL_TYPE_BIT 16 +#define MYSQL_TYPE_NEWDECIMAL 246 +#define MYSQL_TYPE_ENUM 247 +#define MYSQL_TYPE_SET 248 +#define MYSQL_TYPE_TINY_BLOB 249 +#define MYSQL_TYPE_MEDIUM_BLOB 250 +#define MYSQL_TYPE_LONG_BLOB 251 +#define MYSQL_TYPE_BLOB 252 +#define MYSQL_TYPE_VAR_STRING 253 +#define MYSQL_TYPE_STRING 254 +#define MYSQL_TYPE_GEOMETRY 255 /* MySQL field structure item number (C level structure is translated to a clipper array) */ -#define MYSQL_FS_NAME 1 /* Name of column */ -#define MYSQL_FS_TABLE 2 /* Table of column if column was a field */ -#define MYSQL_FS_DEF 3 /* Default value (set by mysql_list_fields) */ -#define MYSQL_FS_TYPE 4 /* Type of field. Se mysql_com.h for types */ -#define MYSQL_FS_LENGTH 5 /* Width of column */ -#define MYSQL_FS_MAXLEN 6 /* Max width of selected set */ -#define MYSQL_FS_FLAGS 7 /* Div flags */ -#define MYSQL_FS_DECIMALS 8 /* Number of decimals in field */ +#define MYSQL_FS_NAME 1 /* Name of column */ +#define MYSQL_FS_TABLE 2 /* Table of column if column was a field */ +#define MYSQL_FS_DEF 3 /* Default value (set by mysql_list_fields) */ +#define MYSQL_FS_TYPE 4 /* Type of field. Se mysql_com.h for types */ +#define MYSQL_FS_LENGTH 5 /* Width of column */ +#define MYSQL_FS_MAXLEN 6 /* Max width of selected set */ +#define MYSQL_FS_FLAGS 7 /* Div flags */ +#define MYSQL_FS_DECIMALS 8 /* Number of decimals in field */ /* MySQL field flags */ -#define NOT_NULL_FLAG 1 /* Field can't be NULL */ -#define PRI_KEY_FLAG 2 /* Field is part of a primary key */ -#define UNIQUE_KEY_FLAG 4 /* Field is part of a unique key */ -#define MULTIPLE_KEY_FLAG 8 /* Field is part of a key */ -#define BLOB_FLAG 16 /* Field is a blob */ -#define UNSIGNED_FLAG 32 /* Field is unsigned */ -#define ZEROFILL_FLAG 64 /* Field is zerofill */ -#define BINARY_FLAG 128 +#define NOT_NULL_FLAG 1 /* Field can't be NULL */ +#define PRI_KEY_FLAG 2 /* Field is part of a primary key */ +#define UNIQUE_KEY_FLAG 4 /* Field is part of a unique key */ +#define MULTIPLE_KEY_FLAG 8 /* Field is part of a key */ +#define BLOB_FLAG 16 /* Field is a blob */ +#define UNSIGNED_FLAG 32 /* Field is unsigned */ +#define ZEROFILL_FLAG 64 /* Field is zerofill */ +#define BINARY_FLAG 128 /* The following are only sent to new clients */ -#define ENUM_FLAG 256 /* field is an enum */ -#define AUTO_INCREMENT_FLAG 512 /* field is a autoincrement field */ -#define TIMESTAMP_FLAG 1024 /* Field is a timestamp */ -#define PART_KEY_FLAG 16384 /* Intern; Part of some key */ -#define GROUP_FLAG 32768 /* Intern group field */ +#define ENUM_FLAG 256 /* field is an enum */ +#define AUTO_INCREMENT_FLAG 512 /* field is a autoincrement field */ +#define TIMESTAMP_FLAG 1024 /* Field is a timestamp */ +#define PART_KEY_FLAG 16384 /* Intern; Part of some key */ +#define GROUP_FLAG 32768 /* Intern group field */ /* Extension to DBS_xxx defines to encompass NOT NULL fields, needed by indexes */ -#define DBS_NOTNULL 5 /* True if field has to be NOT NULL */ +#define DBS_NOTNULL 5 /* True if field has to be NOT NULL */ + +#if defined( HB_LEGACY_LEVEL3 ) +/* MySQL field types (for compatibility with older Harbour versions) */ +#define MYSQL_TINY_TYPE MYSQL_TYPE_TINY +#define MYSQL_SHORT_TYPE MYSQL_TYPE_SHORT +#define MYSQL_LONG_TYPE MYSQL_TYPE_LONG +#define MYSQL_FLOAT_TYPE MYSQL_TYPE_FLOAT +#define MYSQL_DOUBLE_TYPE MYSQL_TYPE_DOUBLE +#define MYSQL_NULL_TYPE MYSQL_TYPE_NULL +#define MYSQL_TIMESTAMP_TYPE MYSQL_TYPE_TIMESTAMP +#define MYSQL_LONGLONG_TYPE MYSQL_TYPE_LONGLONG +#define MYSQL_INT24_TYPE MYSQL_TYPE_INT24 +#define MYSQL_DATE_TYPE MYSQL_TYPE_DATE +#define MYSQL_TIME_TYPE MYSQL_TYPE_TIME +#define MYSQL_DATETIME_TYPE MYSQL_TYPE_DATETIME +#define MYSQL_YEAR_TYPE MYSQL_TYPE_YEAR +#define MYSQL_NEWDATE_TYPE MYSQL_TYPE_NEWDATE +#define MYSQL_DECIMAL_TYPE MYSQL_TYPE_NEWDECIMAL +#define MYSQL_ENUMTYPE MYSQL_TYPE_ENUM +#define MYSQL_SET_TYPE MYSQL_TYPE_SET +#define MYSQL_TINY_BLOB_TYPE MYSQL_TYPE_TINY_BLOB +#define MYSQL_MEDIUM_BLOB_TYPE MYSQL_TYPE_MEDIUM_BLOB +#define MYSQL_LONG_BLOB_TYPE MYSQL_TYPE_LONG_BLOB +#define MYSQL_BLOB_TYPE MYSQL_TYPE_BLOB +#define MYSQL_VAR_STRING_TYPE MYSQL_TYPE_VAR_STRING +#define MYSQL_STRING_TYPE MYSQL_TYPE_STRING +#endif diff --git a/harbour/contrib/hbmysql/tmysql.prg b/harbour/contrib/hbmysql/tmysql.prg index c8d54b92e0..f5ab462794 100644 --- a/harbour/contrib/hbmysql/tmysql.prg +++ b/harbour/contrib/hbmysql/tmysql.prg @@ -181,8 +181,8 @@ METHOD FieldDec( nNum, lFormat ) CLASS TMySQLRow IF nNum >= 1 .AND. nNum <= Len( ::aFieldStruct ) - IF !lFormat .AND. ( ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] == MYSQL_FLOAT_TYPE .OR. ; - ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] == MYSQL_DOUBLE_TYPE ) + IF !lFormat .AND. ( ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] == MYSQL_TYPE_FLOAT .OR. ; + ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] == MYSQL_TYPE_DOUBLE ) RETURN Set( _SET_DECIMALS ) ELSE RETURN ::aFieldStruct[ nNum ][ MYSQL_FS_DECIMALS ] @@ -197,28 +197,28 @@ METHOD FieldType( nNum ) CLASS TMySQLRow IF nNum >= 1 .AND. nNum <= Len( ::aFieldStruct ) SWITCH ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] - CASE MYSQL_TINY_TYPE + CASE MYSQL_TYPE_TINY RETURN "L" - CASE MYSQL_SHORT_TYPE - CASE MYSQL_LONG_TYPE - CASE MYSQL_LONGLONG_TYPE - CASE MYSQL_FLOAT_TYPE - CASE MYSQL_DOUBLE_TYPE - CASE MYSQL_DECIMAL_TYPE - CASE MYSQL_INT24_TYPE + CASE MYSQL_TYPE_SHORT + CASE MYSQL_TYPE_LONG + CASE MYSQL_TYPE_LONGLONG + CASE MYSQL_TYPE_FLOAT + CASE MYSQL_TYPE_DOUBLE + CASE MYSQL_TYPE_NEWDECIMAL + CASE MYSQL_TYPE_INT24 RETURN "N" - CASE MYSQL_VAR_STRING_TYPE - CASE MYSQL_STRING_TYPE - CASE MYSQL_DATETIME_TYPE + CASE MYSQL_TYPE_VAR_STRING + CASE MYSQL_TYPE_STRING + CASE MYSQL_TYPE_DATETIME RETURN "C" - CASE MYSQL_DATE_TYPE + CASE MYSQL_TYPE_DATE RETURN "D" - CASE MYSQL_BLOB_TYPE - CASE MYSQL_MEDIUM_BLOB_TYPE + CASE MYSQL_TYPE_BLOB + CASE MYSQL_TYPE_MEDIUM_BLOB RETURN "M" ENDSWITCH @@ -230,7 +230,7 @@ METHOD FieldType( nNum ) CLASS TMySQLRow // returns a WHERE x=y statement which uses primary key (if available) METHOD MakePrimaryKeyWhere() CLASS TMySQLRow - LOCAL ni, cWhere := " WHERE " + LOCAL ni, cWhere := "" FOR nI := 1 TO Len( ::aFieldStruct ) @@ -238,6 +238,10 @@ METHOD MakePrimaryKeyWhere() CLASS TMySQLRow IF hb_bitAnd( ::aFieldStruct[ nI ][ MYSQL_FS_FLAGS ], PRI_KEY_FLAG ) == PRI_KEY_FLAG .OR. ; hb_bitAnd( ::aFieldStruct[ nI ][ MYSQL_FS_FLAGS ], MULTIPLE_KEY_FLAG ) == MULTIPLE_KEY_FLAG + IF ! Empty( cWhere ) + cWhere += " AND " + ENDIF + cWhere += ::aFieldStruct[ nI ][ MYSQL_FS_NAME ] + "=" // if a part of a primary key has been changed, use original value @@ -246,14 +250,13 @@ METHOD MakePrimaryKeyWhere() CLASS TMySQLRow ELSE cWhere += ClipValue2SQL( ::aRow[ nI ] ) ENDIF - - cWhere += " AND " ENDIF NEXT - // remove last " AND " - cWhere := Left( cWhere, Len( cWhere ) - 5 ) + IF ! Empty( cWhere ) + cWhere := " WHERE " + cWhere + ENDIF RETURN cWhere @@ -508,7 +511,7 @@ METHOD GetRow( nRow ) CLASS TMySQLQuery FOR i := 1 TO ::nNumFields SWITCH ::aFieldStruct[ i ][ MYSQL_FS_TYPE ] - CASE MYSQL_TINY_TYPE + CASE MYSQL_TYPE_TINY //DAVID: IF ::aRow[ i ] == NIL ::aRow[ i ] := "0" @@ -516,11 +519,11 @@ METHOD GetRow( nRow ) CLASS TMySQLQuery ::aRow[ i ] := Val( ::aRow[ i ] ) != 0 EXIT - CASE MYSQL_SHORT_TYPE - CASE MYSQL_LONG_TYPE - CASE MYSQL_LONGLONG_TYPE - CASE MYSQL_INT24_TYPE - CASE MYSQL_DECIMAL_TYPE + CASE MYSQL_TYPE_SHORT + CASE MYSQL_TYPE_LONG + CASE MYSQL_TYPE_LONGLONG + CASE MYSQL_TYPE_INT24 + CASE MYSQL_TYPE_NEWDECIMAL //DAVID: IF ::aRow[ i ] == NIL ::aRow[ i ] := "0" @@ -528,8 +531,8 @@ METHOD GetRow( nRow ) CLASS TMySQLQuery ::aRow[ i ] := Val( ::aRow[ i ] ) EXIT - CASE MYSQL_DOUBLE_TYPE - CASE MYSQL_FLOAT_TYPE + CASE MYSQL_TYPE_DOUBLE + CASE MYSQL_TYPE_FLOAT //DAVID: IF ::aRow[ i ] == NIL ::aRow[ i ] := "0" @@ -537,7 +540,7 @@ METHOD GetRow( nRow ) CLASS TMySQLQuery ::aRow[ i ] := Val( ::aRow[ i ] ) EXIT - CASE MYSQL_DATE_TYPE + CASE MYSQL_TYPE_DATE IF Empty( ::aRow[ i ] ) ::aRow[ i ] := hb_SToD( "" ) ELSE @@ -546,16 +549,16 @@ METHOD GetRow( nRow ) CLASS TMySQLQuery ENDIF EXIT - CASE MYSQL_BLOB_TYPE + CASE MYSQL_TYPE_BLOB // Memo field EXIT - CASE MYSQL_STRING_TYPE - CASE MYSQL_VAR_STRING_TYPE + CASE MYSQL_TYPE_STRING + CASE MYSQL_TYPE_VAR_STRING // char field EXIT - CASE MYSQL_DATETIME_TYPE + CASE MYSQL_TYPE_DATETIME // DateTime field EXIT @@ -681,8 +684,8 @@ METHOD FieldDec( nNum, lFormat ) CLASS TMySQLQuery DEFAULT lFormat TO .F. IF nNum >=1 .AND. nNum <= Len( ::aFieldStruct ) - IF !lFormat .AND. ( ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] == MYSQL_FLOAT_TYPE .OR. ; - ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] == MYSQL_DOUBLE_TYPE ) + IF !lFormat .AND. ( ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] == MYSQL_TYPE_FLOAT .OR. ; + ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] == MYSQL_TYPE_DOUBLE ) RETURN Set( _SET_DECIMALS ) ELSE RETURN ::aFieldStruct[ nNum ][ MYSQL_FS_DECIMALS ] @@ -697,28 +700,28 @@ METHOD FieldType( nNum ) CLASS TMySQLQuery IF nNum >= 1 .AND. nNum <= Len( ::aFieldStruct ) SWITCH ::aFieldStruct[ nNum ][ MYSQL_FS_TYPE ] - CASE MYSQL_TINY_TYPE + CASE MYSQL_TYPE_TINY RETURN "L" - CASE MYSQL_SHORT_TYPE - CASE MYSQL_LONG_TYPE - CASE MYSQL_LONGLONG_TYPE - CASE MYSQL_FLOAT_TYPE - CASE MYSQL_DOUBLE_TYPE - CASE MYSQL_DECIMAL_TYPE - CASE MYSQL_INT24_TYPE + CASE MYSQL_TYPE_SHORT + CASE MYSQL_TYPE_LONG + CASE MYSQL_TYPE_LONGLONG + CASE MYSQL_TYPE_FLOAT + CASE MYSQL_TYPE_DOUBLE + CASE MYSQL_TYPE_NEWDECIMAL + CASE MYSQL_TYPE_INT24 RETURN "N" - CASE MYSQL_VAR_STRING_TYPE - CASE MYSQL_STRING_TYPE - CASE MYSQL_DATETIME_TYPE + CASE MYSQL_TYPE_VAR_STRING + CASE MYSQL_TYPE_STRING + CASE MYSQL_TYPE_DATETIME RETURN "C" - CASE MYSQL_DATE_TYPE + CASE MYSQL_TYPE_DATE RETURN "D" - CASE MYSQL_BLOB_TYPE - CASE MYSQL_MEDIUM_BLOB_TYPE + CASE MYSQL_TYPE_BLOB + CASE MYSQL_TYPE_MEDIUM_BLOB RETURN "M" ENDSWITCH @@ -824,7 +827,6 @@ METHOD Update( oRow, lOldRecord, lRefresh ) CLASS TMySQLTable IF oRow == NIL // default Current row FOR i := 1 TO ::nNumFields - IF !( ::aOldValue[ i ] == ::FieldGet( i ) ) cUpdateQuery += ::aFieldStruct[ i ][ MYSQL_FS_NAME ] + "=" + ClipValue2SQL( ::FieldGet( i ) ) + "," ENDIF @@ -844,10 +846,7 @@ METHOD Update( oRow, lOldRecord, lRefresh ) CLASS TMySQLTable // WARNING: if there are more than one record of ALL fields matching, all of those records will be changed FOR nI := 1 TO Len( ::aFieldStruct ) - cWhere += ::aFieldStruct[ nI ][ MYSQL_FS_NAME ] + "=" - // use original value - cWhere += ClipValue2SQL( ::aOldValue[ nI ] ) - cWhere += " AND " + cWhere += ::aFieldStruct[ nI ][ MYSQL_FS_NAME ] + "=" + ClipValue2SQL( ::aOldValue[ nI ] ) + " AND " NEXT // remove last " AND " cWhere := Left( cWhere, Len( cWhere ) - 5 ) @@ -886,7 +885,7 @@ METHOD Update( oRow, lOldRecord, lRefresh ) CLASS TMySQLTable NEXT // remove last comma - cUpdateQuery := Left( cUpdateQuery, Len( cUpdateQuery ) -1 ) + cUpdateQuery := Left( cUpdateQuery, Len( cUpdateQuery ) - 1 ) //DAVID: IF lOldRecord @@ -894,10 +893,7 @@ METHOD Update( oRow, lOldRecord, lRefresh ) CLASS TMySQLTable // WARNING: if there are more than one record of ALL fields matching, all of those records will be changed FOR nI := 1 TO Len( oRow:aFieldStruct ) - cWhere += oRow:aFieldStruct[ nI ][ MYSQL_FS_NAME ] + "=" - // use original value - cWhere += ClipValue2SQL( oRow:aOriValue[ nI ] ) - cWhere += " AND " + cWhere += oRow:aFieldStruct[ nI ][ MYSQL_FS_NAME ] + "=" + ClipValue2SQL( oRow:aOriValue[ nI ] ) + " AND " NEXT // remove last " AND " cWhere := Left( cWhere, Len( cWhere ) - 5 ) @@ -1146,31 +1142,31 @@ METHOD GetBlankRow( lSetValues ) CLASS TMySQLTable FOR i := 1 TO ::nNumFields SWITCH ::aFieldStruct[ i ][ MYSQL_FS_TYPE ] - CASE MYSQL_STRING_TYPE - CASE MYSQL_VAR_STRING_TYPE - CASE MYSQL_BLOB_TYPE - CASE MYSQL_DATETIME_TYPE + CASE MYSQL_TYPE_STRING + CASE MYSQL_TYPE_VAR_STRING + CASE MYSQL_TYPE_BLOB + CASE MYSQL_TYPE_DATETIME aRow[ i ] := "" EXIT - CASE MYSQL_SHORT_TYPE - CASE MYSQL_LONG_TYPE - CASE MYSQL_LONGLONG_TYPE - CASE MYSQL_INT24_TYPE - CASE MYSQL_DECIMAL_TYPE + CASE MYSQL_TYPE_SHORT + CASE MYSQL_TYPE_LONG + CASE MYSQL_TYPE_LONGLONG + CASE MYSQL_TYPE_INT24 + CASE MYSQL_TYPE_NEWDECIMAL aRow[ i ] := 0 EXIT - CASE MYSQL_TINY_TYPE + CASE MYSQL_TYPE_TINY aRow[ i ] := .F. EXIT - CASE MYSQL_DOUBLE_TYPE - CASE MYSQL_FLOAT_TYPE + CASE MYSQL_TYPE_DOUBLE + CASE MYSQL_TYPE_FLOAT aRow[ i ] := 0.0 EXIT - CASE MYSQL_DATE_TYPE + CASE MYSQL_TYPE_DATE aRow[ i ] := hb_SToD( "" ) EXIT @@ -1264,32 +1260,29 @@ METHOD Refresh() CLASS TMySQLTABLE // returns a WHERE x=y statement which uses primary key (if available) METHOD MakePrimaryKeyWhere() CLASS TMySQLTable - LOCAL ni, cWhere := " WHERE " + LOCAL ni, cWhere := "" FOR nI := 1 TO Len( ::aFieldStruct ) // search for fields part of a primary key - IF hb_bitAnd( ::aFieldStruct[ nI ][ MYSQL_FS_FLAGS ], PRI_KEY_FLAG ) == PRI_KEY_FLAG .OR.; + IF hb_bitAnd( ::aFieldStruct[ nI ][ MYSQL_FS_FLAGS ], PRI_KEY_FLAG ) == PRI_KEY_FLAG .OR. ; hb_bitAnd( ::aFieldStruct[ nI ][ MYSQL_FS_FLAGS ], MULTIPLE_KEY_FLAG ) == MULTIPLE_KEY_FLAG - cWhere += ::aFieldStruct[ nI ][ MYSQL_FS_NAME ] + "=" + IF ! Empty( cWhere ) + cWhere += " AND " + ENDIF - // if a part of a primary key has been changed, use original value - - cWhere += ClipValue2SQL( ::aOldValue[ nI ] ) - - cWhere += " AND " + cWhere += ::aFieldStruct[ nI ][ MYSQL_FS_NAME ] + "=" + ClipValue2SQL( ::aOldValue[ nI ] ) ENDIF - NEXT - // remove last " AND " - cWhere := Left( cWhere, Len( cWhere ) - 5 ) + IF ! Empty( cWhere ) + cWhere := " WHERE " + cWhere + ENDIF RETURN cWhere - /* ----------------------------------------------------------------------------------------*/ // Every available MySQL server @@ -1648,7 +1641,7 @@ METHOD TableStruct( cTable ) CLASS TMySQLServer aSFIeld[ DBS_DEC ] := 8 EXIT - CASE MYSQL_MEDIUM_BLOB_TYPE + CASE MYSQL_TYPE_MEDIUM_BLOB aSField[ DBS_TYPE ] := "B" aSField[ DBS_LEN ] := aField[ MSQL_FS_LENGTH ] EXIT