From 9520fe2efd457bc65e333ec6f9b6f85a7c02cd29 Mon Sep 17 00:00:00 2001 From: Mattia Tollari Date: Fri, 6 Jul 2018 16:30:37 +0200 Subject: [PATCH] Patch level : 12.0 598 Files correlati : cg, ve, ba, fp Commento : Prima release del modulo fp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BA: - Aggiunto campo "Modalità di Pagamento" alla tabella "Ulteriore classificazione" - Aggiunto campo "Tipo di pagamento SDI" al programma di gestione dei tipi pagamento CG: Modifiche programma clienti/fornitori: - Rinominato gruppo da "Numeri telefonici" a "Contatti" - Spostati e modificati campi delle email per aggiungere la PEC Modifiche cgpagame: - Aggiunto _cond_pag e gestione del campo VE: Modifiche ai tipidoc - Aggiunto tipo documenti SDI - Aggiunto il regime fiscale FP: - prima implementazione del modulo Interne: - In applicat rimosso blocco in caso di programma non abilitato per rangers - Aggiunto in modaut il nuovo programma fp - Resa cid2index static con metodo in xvtility - Perfezionata libreria tsdb + xvtdb grazie ai test fatti da me medesimo per l'fp --- build/ba_masktab.vcxproj | 32 +- build/ba_masktab.vcxproj.filters | 92 + lib/sqlapi.lib | Bin 208002 -> 217246 bytes lib/sqlapid.lib | Bin 208784 -> 218058 bytes libraries/SQLAPI/include/SQLAPI.h | 82 +- libraries/SQLAPI/include/cubeSqlAPI.h | 124 + libraries/SQLAPI/include/cubesql/cubesql.h | 177 + libraries/SQLAPI/include/ibase/ib_util.h | 26 +- libraries/SQLAPI/include/ibase/ibase.h | 4494 ++++++++++------- libraries/SQLAPI/include/ibase/iberror.h | 1140 +---- libraries/SQLAPI/include/odbcAPI.h | 18 +- libraries/SQLAPI/include/oraAPI.h | 1121 ++-- libraries/SQLAPI/include/pgAPI.h | 10 +- libraries/SQLAPI/include/sbAPI.h | 3 +- libraries/SQLAPI/include/sl3API.h | 18 + libraries/SQLAPI/include/sqlbase/sqlbase.h | 1774 +++++++ libraries/SQLAPI/include/ssNcliAPI.h | 1110 ++-- libraries/SQLAPI/include/ssOleDbAPI.h | 2 + libraries/SQLAPI/include/sybAPI.h | 1 + src/ba/ba3700.cpp | 49 +- src/ba/ba3700.h | 33 +- src/ba/ba3700a.uml | 9 + src/ba/batbclr.h | 7 +- src/ba/batbclr.uml | 32 + src/cg/cg0200.cpp | 15 + src/cg/cg0200.h | 1 + src/cg/cg0200a.uml | 38 +- src/cg/cgpagame.cpp | 1 + src/cg/cgpagame.h | 4 +- src/cg/f17.dir | 2 +- src/cg/f17.trr | 2 +- src/cg/f20.dir | 2 +- src/cg/f20.trr | 3 +- ...del_tracciato_FatturaPA_versione_1.2.1.xls | Bin 0 -> 186880 bytes src/fp/fp0.cpp | 17 + src/fp/fp0.h | 8 + src/fp/fp0100.cpp | 126 + src/fp/fp0100a.h | 6 + src/fp/fp0100a.uml | 64 + src/fp/fp0200.cpp | 1757 +++++++ src/fp/fp0200.cpp~RF1e8fd00e.TMP | 1757 +++++++ src/fp/fp0200a.h | 0 src/fp/fp0200a.uml | 467 ++ src/fp/fp0200b.h | 308 ++ src/fp/fp0300.cpp | 1849 +++++++ src/fp/fp0300.cpp~RF5235131.TMP | 1652 ++++++ src/fp/fp0300a.h | 26 + src/fp/fp0300a.uml | 223 + src/fp/fplib01.cpp | 102 + src/fp/fplib01.h | 13 + src/fp/sql/fp0100.sql | 1656 ++++++ src/include/applicat.cpp | 11 +- src/include/campo.aut | 9 +- src/include/modaut.h | 2 +- src/include/msksheet.cpp | 7 +- src/include/tsdb.cpp | 2 +- src/include/tsdb.h | 101 +- src/include/utility.cpp | 10 + src/include/utility.h | 3 + src/include/xvtility.cpp | 8 +- src/include/xvtility.h | 2 + src/ve/velib.h | 6 +- src/ve/vetbtip.h | 3 +- src/ve/vetbtip.uml | 45 +- src/xvtdb/xvtdb.cpp | 24 +- 65 files changed, 16483 insertions(+), 4203 deletions(-) create mode 100644 libraries/SQLAPI/include/cubeSqlAPI.h create mode 100644 libraries/SQLAPI/include/cubesql/cubesql.h create mode 100644 libraries/SQLAPI/include/sqlbase/sqlbase.h create mode 100644 src/fp/Rappresentazione_tabellare_del_tracciato_FatturaPA_versione_1.2.1.xls create mode 100644 src/fp/fp0.cpp create mode 100644 src/fp/fp0.h create mode 100644 src/fp/fp0100.cpp create mode 100644 src/fp/fp0100a.h create mode 100644 src/fp/fp0100a.uml create mode 100644 src/fp/fp0200.cpp create mode 100644 src/fp/fp0200.cpp~RF1e8fd00e.TMP create mode 100644 src/fp/fp0200a.h create mode 100644 src/fp/fp0200a.uml create mode 100644 src/fp/fp0200b.h create mode 100644 src/fp/fp0300.cpp create mode 100644 src/fp/fp0300.cpp~RF5235131.TMP create mode 100644 src/fp/fp0300a.h create mode 100644 src/fp/fp0300a.uml create mode 100644 src/fp/fplib01.cpp create mode 100644 src/fp/fplib01.h create mode 100644 src/fp/sql/fp0100.sql diff --git a/build/ba_masktab.vcxproj b/build/ba_masktab.vcxproj index 3831942d1..653d9e9fc 100644 --- a/build/ba_masktab.vcxproj +++ b/build/ba_masktab.vcxproj @@ -13,7 +13,7 @@ {D53794B2-2BDD-4D8F-BEFF-A65DA01D5B03} ba_masktab - 10.0.16299.0 + 10.0.17134.0 @@ -403,6 +403,36 @@ Document + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/ba_masktab.vcxproj.filters b/build/ba_masktab.vcxproj.filters index 8e8240d93..c8cc14e17 100644 --- a/build/ba_masktab.vcxproj.filters +++ b/build/ba_masktab.vcxproj.filters @@ -19,6 +19,9 @@ {d07d5cc7-7455-46b6-a38b-52bf67307d98} + + {753adcac-715d-4825-b50c-58fdf0db114b} + @@ -159,6 +162,9 @@ Mask + + Mask + @@ -384,4 +390,90 @@ Trr + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + + \ No newline at end of file diff --git a/lib/sqlapi.lib b/lib/sqlapi.lib index 9e16cfe92c6579c865228d4d55b89b8420f67601..02d83277c57667c774ef8c3fd97a47c6456963f5 100644 GIT binary patch literal 217246 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 diff --git a/lib/sqlapid.lib b/lib/sqlapid.lib index f26c36c436b59bdb4f9e63262d7ee2d7c7e64414..52b82071fd41b7feffc2b7daafd6fd13de1e6ffa 100644 GIT binary patch literal 218058 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 LSKa#*)=B>lRF7`9 literal 208784 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 K!}}=D>HiNwchKno diff --git a/libraries/SQLAPI/include/SQLAPI.h b/libraries/SQLAPI/include/SQLAPI.h index dc6b55fc1..88eb88988 100644 --- a/libraries/SQLAPI/include/SQLAPI.h +++ b/libraries/SQLAPI/include/SQLAPI.h @@ -35,8 +35,16 @@ #endif #include #include +#if (defined(_MSC_VER) && _MSC_VER >= 1600) || (defined(__BORLANDC__) && __BORLANDC__ >= 0x0630) || defined(__GNUC__) || defined(__SUNPRO_C) +#define SA_HAVE_STDINT_H +#include +#endif #include +#ifndef SIZE_MAX +#define SIZE_MAX ULONG_MAX +#endif + #ifdef SQLAPI_WINDOWS // 64-bit integer typedef __int64 sa_int64_t; @@ -53,10 +61,7 @@ typedef unsigned long long int sa_uint64_t; #ifdef SA_USE_STL #include -#endif - -#ifndef SIZE_MAX -#define SIZE_MAX UINT_MAX +#include #endif class ISAClient; @@ -115,6 +120,8 @@ typedef SA_SQLite_Client, //! SQL Anywere SA_SQLAnywhere_Client, + //! CubeSQL + SA_CubeSQL_Client, _SA_Client_Reserverd = (int)(((unsigned int)(-1))/2) } SAClient_t; @@ -127,11 +134,31 @@ typedef SA_UserGenerated_Error, //! the Library-generated error SA_Library_Error, - //! DBMS API error occured + //! DBMS API error occurred SA_DBMS_API_Error, _SA_ErrorClass_Reserved = (int)(((unsigned int)(-1))/2) } SAErrorClass_t; +typedef +enum eSALibraryErrorType +{ + SA_Library_Error_Nomem, + SA_Library_Error_ClientNotSet, + SA_Library_Error_ClientNotSupported, + SA_Library_Error_LoadLibraryFails, + SA_Library_Error_GetLibraryVersionFails, + SA_Library_Error_ClienVersionOld, + SA_Library_Error_ClientInitFails, + SA_Library_Error_BindVarNotFound, + SA_Library_Error_FieldNotFound, + SA_Library_Error_UnknownDataType, + SA_Library_Error_UnknownParameterType, + SA_Library_Error_UnknownColumnType, + SA_Library_Error_WrongConversion, + SA_Library_Error_WrongDatetime, + _SA_Library_Error_Reserved = (int)(((unsigned int)(-1)) / 2) +} SALibraryErrorType_t; + typedef enum eSAIsolationLevel { @@ -319,7 +346,7 @@ public: SAString(const wchar_t *lpch, size_t nLength); //! Initializes SAString from unsigned characters (converts to SAChar) SAString(const unsigned char *psz); - //! Special constructor for binary data (no converion to SAChar) + //! Special constructor for binary data (no conversion to SAChar) SAString(const void *pBuffer, size_t nLengthInBytes); // Attributes & Operations @@ -413,12 +440,12 @@ public: //! Remove continuous occurrences of chTarget starting from right void TrimRight(SAChar chTarget); - //! Remove continuous occcurrences of characters in passed string, + //! Remove continuous occurrences of characters in passed string, // starting from right void TrimRight(const SAChar *lpszTargets); //! Remove continuous occurrences of chTarget starting from left void TrimLeft(SAChar chTarget); - //! Remove continuous occcurrences of characters in + //! Remove continuous occurrences of characters in // passed string, starting from left void TrimLeft(const SAChar *lpszTargets); @@ -498,14 +525,14 @@ public: const char *GetUTF8Chars() const; // get string length (in UTF8 characters) size_t GetUTF8CharsLength() const; - // assing UTF8 data + // assign UTF8 data void SetUTF8Chars(const char* szSrc, size_t nSrcLen = SIZE_MAX); #endif // SA_UNICODE // return pointer to const UTF16 string const void *GetUTF16Chars() const; // get string length (in UTF16 characters) size_t GetUTF16CharsLength() const; - // assing UTF16 data + // assign UTF16 data void SetUTF16Chars(const void* szSrc, size_t nSrcLen = SIZE_MAX); // Implementation @@ -539,10 +566,6 @@ protected: public: SAString(const std::string &stringSrc); SAString(const std::wstring &stringSrc); - const SAString &operator=(const std::string &stringSrc); - const SAString &operator=(const std::wstring &stringSrc); - const SAString &operator+=(const std::string &stringSrc); - const SAString &operator+=(const std::wstring &stringSrc); #endif }; @@ -640,7 +663,6 @@ public: private: double m_interval; - unsigned int m_nFraction; // 0..999999999 }; //! Provides support for manipulating date/time values @@ -739,8 +761,12 @@ public: class SQLAPI_API saOptions { +#ifdef SA_USE_STL + std::hash_map *m_pOptions; +#else int m_nOptionCount; SAParam **m_ppOptions; +#endif private: // disable copy constructor @@ -754,6 +780,8 @@ public: SAString &operator[](const SAString &sOptionName); SAString operator[](const SAString &sOptionName) const; + int size() const; + SAString operator[](int nIndex) const; }; //! Represents an unique session with a data source @@ -822,6 +850,8 @@ public: SAString &setOption(const SAString &sOptionName); SAString Option(const SAString &sOptionName) const; + int TotalOptions() const; + SAString Option(int nIndex) const; saAPI *NativeAPI() const SQLAPI_THROW(SAException); saConnectionHandles *NativeHandles() SQLAPI_THROW(SAException); @@ -910,7 +940,8 @@ private: size_t nFieldSize, int nFieldPrecision, int nFieldScale, - bool bFieldRequired); + bool bFieldRequired, + int nTotalFieldCount); void DestroyFields(); // parses sql statement and create bind parameters array if any (In) @@ -1006,6 +1037,8 @@ public: SAString &setOption(const SAString &sOptionName); SAString Option(const SAString &sOptionName) const; + int TotalOptions() const; + SAString Option(int nIndex) const; saCommandHandles *NativeHandles() SQLAPI_THROW(SAException); void setBatchExceptionPreHandler(PreHandleException_t fnHandler, void* pAddlData); @@ -1037,6 +1070,7 @@ class SQLAPI_API SAValueRead friend class Isl3Cursor; friend class IssNCliCursor; friend class IasaCursor; + friend class IcubeSqlCursor; protected: SALongOrLobReaderModes_t m_eReaderMode; @@ -1184,6 +1218,7 @@ class SQLAPI_API SAValue : public SAValueRead friend class Isl3Cursor; friend class IssNCliCursor; friend class IasaCursor; + friend class IcubeSqlCursor; private: bool m_bInternalUseDefault; @@ -1203,6 +1238,12 @@ protected: size_t nCallerMaxSize, void *&pBuf); +private: + // disable copy constructor + SAValue(const SAValue &); + // disable assignment operator + SAValue &operator = (const SAValue &); + public: SAValue(SADataType_t eDataType); virtual ~SAValue(); @@ -1461,6 +1502,8 @@ public: SAString &setOption(const SAString &sOptionName); SAString Option(const SAString &sOptionName) const; + int TotalOptions() const; + SAString Option(int nIndex) const; }; class SQLAPI_API SAException @@ -1515,6 +1558,9 @@ public: SQLAPI_EXCEPTION_HAS_CUSTOM_MEMBERS #endif +public: + SAException& operator=(const SAException &other); + protected: SAErrorClass_t m_eErrorClass; int m_nNativeError; @@ -1569,8 +1615,8 @@ public: }; #define SQLAPI_VER_MAJOR 4 -#define SQLAPI_VER_MINOR 1 -#define SQLAPI_VER_BUILD 5 +#define SQLAPI_VER_MINOR 2 +#define SQLAPI_VER_BUILD 2 #endif // !defined(__SQLAPI_H__) diff --git a/libraries/SQLAPI/include/cubeSqlAPI.h b/libraries/SQLAPI/include/cubeSqlAPI.h new file mode 100644 index 000000000..b105af0d5 --- /dev/null +++ b/libraries/SQLAPI/include/cubeSqlAPI.h @@ -0,0 +1,124 @@ +////////////////////////////////////////////////////////////////////// +// cubeSqlAPI.h +////////////////////////////////////////////////////////////////////// + +#if !defined(__CUBESQLAPI_H__) +#define __CUBESQLAPI_H__ + +#include +#include + +extern void AddCubeSqlSupport(const SAConnection * pCon); +extern void ReleaseCubeSqlSupport(); + +typedef int (*cubesql_connect_t)(csqldb **db, const char *host, int port, const char *username, const char *password, int timeout, int encryption); +typedef int (*cubesql_connect_ssl_t)(csqldb **db, const char *host, int port, const char *username, const char *password, int timeout, char *ssl_certificate_path); +typedef void (*cubesql_disconnect_t)(csqldb *db, int gracefully); +typedef int (*cubesql_execute_t)(csqldb *db, const char *sql); +typedef csqlc* (*cubesql_select_t)(csqldb *db, const char *sql, int unused); +typedef int (*cubesql_commit_t)(csqldb *db); +typedef int (*cubesql_rollback_t)(csqldb *db); +typedef int (*cubesql_bind_t)(csqldb *db, const char *sql, char **colvalue, int *colsize, int *coltype, int ncols); +typedef int (*cubesql_ping_t)(csqldb *db); +typedef void (*cubesql_cancel_t)(csqldb *db); +typedef int (*cubesql_errcode_t)(csqldb *db); +typedef char* (*cubesql_errmsg_t)(csqldb *db); +typedef int64 (*cubesql_changes_t)(csqldb *db); +typedef void (*cubesql_trace_t)(csqldb *db, trace_function trace, void *arg); + +typedef csqlvm* (*cubesql_vmprepare_t)(csqldb *db, const char *sql); +typedef int (*cubesql_vmbind_int_t)(csqlvm *vm, int index, int value); +typedef int (*cubesql_vmbind_double_t)(csqlvm *vm, int index, double value); +typedef int (*cubesql_vmbind_text_t)(csqlvm *vm, int index, char *value, int len); +typedef int (*cubesql_vmbind_blob_t)(csqlvm *vm, int index, void *value, int len); +typedef int (*cubesql_vmbind_null_t)(csqlvm *vm, int index); +typedef int (*cubesql_vmbind_int64_t)(csqlvm *vm, int index, int64 value); +typedef int (*cubesql_vmbind_zeroblob_t)(csqlvm *vm, int index, int len); +typedef int (*cubesql_vmexecute_t)(csqlvm *vm); +typedef csqlc* (*cubesql_vmselect_t)(csqlvm *vm); +typedef int (*cubesql_vmclose_t)(csqlvm *vm); + +typedef int (*cubesql_cursor_numrows_t)(csqlc *c); +typedef int (*cubesql_cursor_numcolumns_t)(csqlc *c); +typedef int (*cubesql_cursor_currentrow_t)(csqlc *c); +typedef int (*cubesql_cursor_seek_t)(csqlc *c, int index); +typedef int (*cubesql_cursor_iseof_t)(csqlc *c); +typedef int (*cubesql_cursor_columntype_t)(csqlc *c, int index); +typedef char* (*cubesql_cursor_field_t)(csqlc *c, int row, int column, int *len); +typedef int64 (*cubesql_cursor_rowid_t)(csqlc *c, int row); +typedef int64 (*cubesql_cursor_int64_t)(csqlc *c, int row, int column, int64 default_value); +typedef int (*cubesql_cursor_int_t)(csqlc *c, int row, int column, int default_value); +typedef double (*cubesql_cursor_double_t)(csqlc *c, int row, int column, double default_value); +typedef char* (*cubesql_cursor_cstring_t)(csqlc *c, int row, int column); +typedef char* (*cubesql_cursor_cstring_static_t)(csqlc *c, int row, int column, char *static_buffer, int bufferlen); +typedef void (*cubesql_cursor_free_t)(csqlc *c); + +// API declarations +class SQLAPI_API cubeSqlAPI : public saAPI +{ +public: + cubeSqlAPI(); + + cubesql_connect_t cubesql_connect; + cubesql_connect_ssl_t cubesql_connect_ssl; + cubesql_disconnect_t cubesql_disconnect; + cubesql_execute_t cubesql_execute; + cubesql_select_t cubesql_select; + cubesql_commit_t cubesql_commit; + cubesql_rollback_t cubesql_rollback; + cubesql_bind_t cubesql_bind; + cubesql_ping_t cubesql_ping; + cubesql_cancel_t cubesql_cancel; + cubesql_errcode_t cubesql_errcode; + cubesql_errmsg_t cubesql_errmsg; + cubesql_changes_t cubesql_changes; + cubesql_trace_t cubesql_trace; + + cubesql_vmprepare_t cubesql_vmprepare; + cubesql_vmbind_int_t cubesql_vmbind_int; + cubesql_vmbind_double_t cubesql_vmbind_double; + cubesql_vmbind_text_t cubesql_vmbind_text; + cubesql_vmbind_blob_t cubesql_vmbind_blob; + cubesql_vmbind_null_t cubesql_vmbind_null; + cubesql_vmbind_int64_t cubesql_vmbind_int64; + cubesql_vmbind_zeroblob_t cubesql_vmbind_zeroblob; + cubesql_vmexecute_t cubesql_vmexecute; + cubesql_vmselect_t cubesql_vmselect; + cubesql_vmclose_t cubesql_vmclose; + + cubesql_cursor_numrows_t cubesql_cursor_numrows; + cubesql_cursor_numcolumns_t cubesql_cursor_numcolumns; + cubesql_cursor_currentrow_t cubesql_cursor_currentrow; + cubesql_cursor_seek_t cubesql_cursor_seek; + cubesql_cursor_iseof_t cubesql_cursor_iseof; + cubesql_cursor_columntype_t cubesql_cursor_columntype; + cubesql_cursor_field_t cubesql_cursor_field; + cubesql_cursor_rowid_t cubesql_cursor_rowid; + cubesql_cursor_int64_t cubesql_cursor_int64; + cubesql_cursor_int_t cubesql_cursor_int; + cubesql_cursor_double_t cubesql_cursor_double; + cubesql_cursor_cstring_t cubesql_cursor_cstring; + cubesql_cursor_cstring_static_t cubesql_cursor_cstring_static; + cubesql_cursor_free_t cubesql_cursor_free; +}; + +class SQLAPI_API cubeSqlConnectionHandles : public saConnectionHandles +{ +public: + cubeSqlConnectionHandles(); + + csqldb *pDb; +}; + +class SQLAPI_API cubeSqlCommandHandles : public saCommandHandles +{ +public: + cubeSqlCommandHandles(); + + csqlvm *pVm; + csqlc *pC; +}; + +extern cubeSqlAPI g_cubeSqlAPI; + +#endif //__CUBESQLAPI_H__ diff --git a/libraries/SQLAPI/include/cubesql/cubesql.h b/libraries/SQLAPI/include/cubesql/cubesql.h new file mode 100644 index 000000000..d840d8363 --- /dev/null +++ b/libraries/SQLAPI/include/cubesql/cubesql.h @@ -0,0 +1,177 @@ +/* + * cubesql.h + * + * This file is the public interface for the cubeSQL Server SDK. + * You just need to include this header file in your projects. + * + * (c) 2006-2011 SQLabs s.r.l. -- All Rights Reserved + * Author: Marco Bambini (MB) + * + */ + +#ifndef CUBESQLSDK_H +#define CUBESQLSDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef CUBESQL_BUILD_DLL +#define CUBESQL_APIEXPORT __declspec(dllexport) +#else +#define CUBESQL_APIEXPORT +#endif + +// custom boolean values +#ifndef kTRUE +#define kTRUE 1 +#endif + +#ifndef kFALSE +#define kFALSE 0 +#endif + +// default values +#define kDEFAULT_PORT 4430 +#define kDEFAULT_TIMEOUT 12 +#define kNOERR 0 +#define kERR -1 + +// client side errors +#define kMEMORY_ERROR -2 +#define kPARAMETER_ERROR -3 +#define kPROTOCOL_ERROR -4 +#define kZLIB_ERROR -5 +#define kSSL_ERROR -6 +#define kSSL_CERT_ERROR -7 + +// encryption flags used in cubesql_connect +#define kAESNONE 0 +#define kAES128 2 +#define kAES192 3 +#define kAES256 4 +#define kSSL 8 +#define kSSL_AES128 kSSL+kAES128 +#define kSSL_AES192 kSSL+kAES192 +#define kSSL_AES256 kSSL+kAES256 + +// flag used in cubesql_cursor_getfield +#define kCUBESQL_COLNAME 0 +#define kCUBESQL_CURROW -1 +#define kCUBESQL_COLTABLE -2 +#define kCUBESQL_ROWID -666 + +// flag used in cubesql_cursor_seek +#define kCUBESQL_SEEKNEXT -2 +#define kCUBESQL_SEEKFIRST -3 +#define kCUBESQL_SEEKLAST -4 +#define kCUBESQL_SEEKPREV -5 + +// SSL +#define kSSL_LIBRARY_PATH 1 +#define kCRYPTO_LIBRARY_PATH 2 + +#ifndef int64 +#ifdef WIN32 +typedef __int64 int64; +#else +typedef long long int int64; +#endif +#endif + +// column types coming from the server +enum { + TYPE_None = 0, + TYPE_Integer = 1, + TYPE_Float = 2, + TYPE_Text = 3, + TYPE_Blob = 4, + TYPE_Boolean = 5, + TYPE_Date = 6, + TYPE_Time = 7, + TYPE_Timestamp = 8, + TYPE_Currency = 9 +}; + +// column types to specify in the cubesql_bind command (coltype) +#define kBIND_INTEGER 1 +#define kBIND_DOUBLE 2 +#define kBIND_TEXT 3 +#define kBIND_BLOB 4 +#define kBIND_NULL 5 +#define kBIND_INT64 8 +#define kBIND_ZEROBLOB 9 + +// define opaque datatypes +typedef struct csqldb csqldb; +typedef struct csqlc csqlc; +typedef struct csqlvm csqlvm; +typedef void (*trace_function) (const char*, void*); + +// function prototypes +CUBESQL_APIEXPORT int cubesql_connect (csqldb **db, const char *host, int port, const char *username, const char *password, int timeout, int encryption); +CUBESQL_APIEXPORT int cubesql_connect_ssl (csqldb **db, const char *host, int port, const char *username, const char *password, int timeout, char *ssl_certificate_path); +CUBESQL_APIEXPORT void cubesql_disconnect (csqldb *db, int gracefully); +CUBESQL_APIEXPORT int cubesql_execute (csqldb *db, const char *sql); +CUBESQL_APIEXPORT csqlc *cubesql_select (csqldb *db, const char *sql, int unused); +CUBESQL_APIEXPORT int cubesql_commit (csqldb *db); +CUBESQL_APIEXPORT int cubesql_rollback (csqldb *db); +CUBESQL_APIEXPORT int cubesql_bind (csqldb *db, const char *sql, char **colvalue, int *colsize, int *coltype, int ncols); +CUBESQL_APIEXPORT int cubesql_ping (csqldb *db); +CUBESQL_APIEXPORT void cubesql_cancel (csqldb *db); +CUBESQL_APIEXPORT int cubesql_errcode (csqldb *db); +CUBESQL_APIEXPORT char *cubesql_errmsg (csqldb *db); +CUBESQL_APIEXPORT int64 cubesql_changes (csqldb *db); +CUBESQL_APIEXPORT void cubesql_trace (csqldb *db, trace_function trace, void *arg); + +CUBESQL_APIEXPORT csqlvm *cubesql_vmprepare (csqldb *db, const char *sql); +CUBESQL_APIEXPORT int cubesql_vmbind_int (csqlvm *vm, int index, int value); +CUBESQL_APIEXPORT int cubesql_vmbind_double (csqlvm *vm, int index, double value); +CUBESQL_APIEXPORT int cubesql_vmbind_text (csqlvm *vm, int index, char *value, int len); +CUBESQL_APIEXPORT int cubesql_vmbind_blob (csqlvm *vm, int index, void *value, int len); +CUBESQL_APIEXPORT int cubesql_vmbind_null (csqlvm *vm, int index); +CUBESQL_APIEXPORT int cubesql_vmbind_int64 (csqlvm *vm, int index, int64 value); +CUBESQL_APIEXPORT int cubesql_vmbind_zeroblob (csqlvm *vm, int index, int len); +CUBESQL_APIEXPORT int cubesql_vmexecute (csqlvm *vm); +CUBESQL_APIEXPORT csqlc *cubesql_vmselect (csqlvm *vm); +CUBESQL_APIEXPORT int cubesql_vmclose (csqlvm *vm); + +CUBESQL_APIEXPORT int cubesql_cursor_numrows (csqlc *c); +CUBESQL_APIEXPORT int cubesql_cursor_numcolumns (csqlc *c); +CUBESQL_APIEXPORT int cubesql_cursor_currentrow (csqlc *c); +CUBESQL_APIEXPORT int cubesql_cursor_seek (csqlc *c, int index); +CUBESQL_APIEXPORT int cubesql_cursor_iseof (csqlc *c); +CUBESQL_APIEXPORT int cubesql_cursor_columntype (csqlc *c, int index); +CUBESQL_APIEXPORT char *cubesql_cursor_field (csqlc *c, int row, int column, int *len); +CUBESQL_APIEXPORT int64 cubesql_cursor_rowid (csqlc *c, int row); +CUBESQL_APIEXPORT int64 cubesql_cursor_int64 (csqlc *c, int row, int column, int64 default_value); +CUBESQL_APIEXPORT int cubesql_cursor_int (csqlc *c, int row, int column, int default_value); +CUBESQL_APIEXPORT double cubesql_cursor_double (csqlc *c, int row, int column, double default_value); +CUBESQL_APIEXPORT char *cubesql_cursor_cstring (csqlc *c, int row, int column); +CUBESQL_APIEXPORT char *cubesql_cursor_cstring_static (csqlc *c, int row, int column, char *static_buffer, int bufferlen); +CUBESQL_APIEXPORT void cubesql_cursor_free (csqlc *c); + +// private functions +int cubesql_connect_token (csqldb **db, const char *host, int port, const char *username, const char *password, + int timeout, int encryption, char *token, int useOldProtocol, const char *ssl_certificate, + const char *root_certificate, const char *ssl_certificate_password, const char *ssl_chiper_list); +int cubesql_connect_old_protocol (csqldb **db, const char *host, int port, const char *username, const char *password, int timeout, int encryption); +void cubesql_clear_errors (csqldb *db); +csqldb *cubesql_cursor_db (csqlc *cursor); +csqlc *cubesql_cursor_create (csqldb *db, int nrows, int ncolumns, int *types, char **names); +int cubesql_cursor_addrow (csqlc *cursor, char **row, int *len); +int cubesql_cursor_columntypebind (csqlc *c, int index); +void cubesql_setuserptr (csqldb *db, void *userptr); +void *cubesql_getuserptr (csqldb *db); +void cubesql_settoken (csqldb *db, char *token); +void cubesql_sethostverification (csqldb *db, char *hostverification); +char *cubesql_gettoken (csqldb *db); +void cubesql_setpath (int type, char *path); +void cubesql_seterror (csqldb *db, int errcode, char *errmsg); +const char *cubesql_sslversion (void); + +#ifdef __cplusplus +} /* End of the 'extern "C"' block */ +#endif + +#endif diff --git a/libraries/SQLAPI/include/ibase/ib_util.h b/libraries/SQLAPI/include/ibase/ib_util.h index d0bc1828e..a63876bca 100644 --- a/libraries/SQLAPI/include/ibase/ib_util.h +++ b/libraries/SQLAPI/include/ibase/ib_util.h @@ -3,35 +3,13 @@ * MODULE: ib_util.h * DESCRIPTION: Prototype header file for ib_util.c * - * The contents of this file are subject to the Interbase Public - * License Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy - * of the License at http://www.Inprise.com/IPL.html - * - * Software distributed under the License is distributed on an - * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express - * or implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code was created by Inprise Corporation - * and its predecessors. Portions created by Inprise Corporation are - * Copyright (C) Inprise Corporation. - * + * Copyright (C) 1986-2010 Embarcadero Technologies Inc. * All Rights Reserved. - * Contributor(s): ______________________________________. */ #ifndef _IB_UTIL_H #define _IB_UTIL_H -#ifdef __cplusplus -extern "C" { -#endif - -extern void *ib_util_malloc(long); - -#ifdef __cplusplus -} /* extern "C" */ -#endif +extern void * ib_util_malloc (int); #endif /* _IB_UTIL_H */ diff --git a/libraries/SQLAPI/include/ibase/ibase.h b/libraries/SQLAPI/include/ibase/ibase.h index 115dd5a33..00fb93423 100644 --- a/libraries/SQLAPI/include/ibase/ibase.h +++ b/libraries/SQLAPI/include/ibase/ibase.h @@ -2,49 +2,17 @@ * MODULE: ibase.h * DESCRIPTION: OSRI entrypoints and defines * - * The contents of this file are subject to the Interbase Public - * License Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy - * of the License at http://www.Inprise.com/IPL.html - * - * Software distributed under the License is distributed on an - * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express - * or implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code was created by Inprise Corporation - * and its predecessors. Portions created by Inprise Corporation are - * Copyright (C) Inprise Corporation. - * + * Copyright (C) 1986-2010 Embarcadero Technologies Inc. * All Rights Reserved. - * Contributor(s): ______________________________________. - * - * 2001.07.28: John Bellardo: Added blr_skip - * 2001.09.18: Ann Harrison: New info codes - * 17-Oct-2001 Mike Nordell: CPU affinity - * 2001-04-16 Paul Beach: ISC_TIME_SECONDS_PRECISION_SCALE modified for HP10 - * Compiler Compatibility - * 2002.02.15 Sean Leyne - Code Cleanup, removed obsolete ports: - * - EPSON, XENIX, MAC (MAC_AUX), Cray and OS/2 - * 2002.10.29 Nickolay Samofatov: Added support for savepoints - * - * 2002.10.29 Sean Leyne - Removed support for obsolete IPX/SPX Protocol - * - * 2006.09.06 Steve Boyd - Added various prototypes required by Cobol ESQL - * isc_embed_dsql_length - * isc_event_block_a - * isc_sqlcode_s - * isc_embed_dsql_fetch_a - * isc_event_block_s - * isc_baddress - * isc_baddress_s - * */ -#ifndef JRD_IBASE_H -#define JRD_IBASE_H +#ifndef _JRD_IBASE_H_ +#define _JRD_IBASE_H_ + +#ifndef HARBOR_MERGE +#define HARBOR_MERGE +#endif -#define FB_API_VER 20 #define isc_version4 #define ISC_TRUE 1 @@ -54,27 +22,34 @@ #define ISC__FALSE ISC_FALSE #endif -#define ISC_FAR +/* UNIX 64-bit platform defines, if needed +#if (defined __osf__ && defined __alpha) || \ + (defined __sparc && defined __sparcv9) || \ + (defined __APPLE_CC__ && defined __x86_64__) || \ + (defined LINUX && defined __x86_64__) + */ +#define ISC_LONG int +#define ISC_ULONG unsigned int -#if defined _MSC_VER && _MSC_VER >= 1300 -#define FB_API_DEPRECATED __declspec(deprecated) -#elif defined __GNUC__ && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) -#define FB_API_DEPRECATED __attribute__((__deprecated__)) -#else -#define FB_API_DEPRECATED +#ifndef ISC_BOOLEAN +#define ISC_BOOLEAN signed short #endif +#define ISC_USHORT unsigned short - -#ifndef INCLUDE_TYPES_PUB_H -#define INCLUDE_TYPES_PUB_H - -#include - -#if defined(__GNUC__) -#include +#if (defined _WIN32 || defined _WIN64) +#include +#if (defined __BORLANDC__ && __BORLANDC__ >= 0x0560) +#include +#endif #else - -#if !defined(_INTPTR_T_DEFINED) +#include +#endif +#if (defined(__BORLANDC__) && defined(__WIN32__)) +typedef long ISC_STATUS; +#elif (defined(__BORLANDC__) && defined(_WIN64)) +typedef long long ISC_STATUS; +#else +#if !defined(_INTPTR_T_DEFINED) && !defined(SA_HAVE_STDINT_H) #if defined(_WIN64) typedef __int64 intptr_t; typedef unsigned __int64 uintptr_t; @@ -83,748 +58,863 @@ typedef long intptr_t; typedef unsigned long uintptr_t; #endif #endif - -#endif - -#if defined(_LP64) || defined(__LP64__) || defined(__arch64__) || defined(_WIN64) -typedef unsigned int FB_API_HANDLE; -#else -typedef void* FB_API_HANDLE; -#endif - typedef intptr_t ISC_STATUS; - -#define ISC_STATUS_LENGTH 20 -typedef ISC_STATUS ISC_STATUS_ARRAY[ISC_STATUS_LENGTH]; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) - #define ISC_EXPORT __stdcall - #define ISC_EXPORT_VARARG __cdecl -#else - #define ISC_EXPORT - #define ISC_EXPORT_VARARG #endif -#if defined(_LP64) || defined(__LP64__) || defined(__arch64__) -typedef int ISC_LONG; -typedef unsigned int ISC_ULONG; +/* START CONVERT TAG */ +#define DSQL_close 1 +#define DSQL_drop 2 +#define DSQL_cancel 4 + +#define METADATALENGTH 68 + +/* END CONVERT TAG */ + +/******************************************************************/ +/* Define type, export and other stuff based on c/c++ and Windows */ +/******************************************************************/ + +#if (defined(_MSC_VER) && defined(_WIN32)) || \ + (defined(__BORLANDC__) && (defined(__WIN32__) || defined(__OS2__))) || \ + (defined(_WIN64)) +#define ISC_FAR +#define ISC_EXPORT __stdcall +#define ISC_EXPORT_VARARG __cdecl +typedef __int64 ISC_INT64; +typedef unsigned __int64 ISC_UINT64; +#define ISC_INT64_DEFINED +#else /* Not Windows/NT */ +#if (defined(__IBMC__) && defined(__OS2__)) +#define ISC_FAR +#define ISC_EXPORT _System +#define ISC_EXPORT_VARARG ISC_EXPORT +#else /* not IBM C Set++ for OS/2 */ +#if ( defined( _Windows) || defined( _WINDOWS)) +#define ISC_FAR +#define ISC_EXPORT ISC_FAR __cdecl __export +#define ISC_EXPORT_VARARG ISC_EXPORT +#else /* Not Windows/NT, OS/2 or Windows */ +#define ISC_FAR +#define ISC_EXPORT +#define ISC_EXPORT_VARARG +#endif /* Windows and Not Windows/NT or OS/2 */ +#endif /* IBM C Set++ for OS/2 */ +#endif /* Windows/NT */ + +/*******************************************************************/ +/* 64 bit Integers */ +/*******************************************************************/ + +#ifndef ISC_INT64_DEFINED +typedef long long int ISC_INT64; +typedef unsigned long long int ISC_UINT64; #else -typedef signed long ISC_LONG; -typedef unsigned long ISC_ULONG; +#undef ISC_INT64_DEFINED #endif -typedef signed short ISC_SHORT; -typedef unsigned short ISC_USHORT; -typedef unsigned char ISC_UCHAR; -typedef char ISC_SCHAR; +/*******************************************************************/ +/* Time & Date Support */ +/*******************************************************************/ -#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(__GNUC__) -typedef __int64 ISC_INT64; -typedef unsigned __int64 ISC_UINT64; -#else -typedef long long int ISC_INT64; -typedef unsigned long long int ISC_UINT64; -#endif - -#ifndef ISC_TIMESTAMP_DEFINED -typedef int ISC_DATE; -typedef unsigned int ISC_TIME; -typedef struct -{ - ISC_DATE timestamp_date; - ISC_TIME timestamp_time; +#ifndef _ISC_TIMESTAMP_ +typedef ISC_LONG ISC_DATE; +typedef ISC_ULONG ISC_TIME; +typedef struct isc_timestamp{ + ISC_DATE timestamp_date; + ISC_TIME timestamp_time; } ISC_TIMESTAMP; -#define ISC_TIMESTAMP_DEFINED -#endif +#define _ISC_TIMESTAMP_ 1 +#endif -struct GDS_QUAD_t { - ISC_LONG gds_quad_high; - ISC_ULONG gds_quad_low; -}; - -typedef struct GDS_QUAD_t GDS_QUAD; -typedef struct GDS_QUAD_t ISC_QUAD; - -#define isc_quad_high gds_quad_high -#define isc_quad_low gds_quad_low - -#endif - -/********************************/ -/* Firebird Handle Definitions */ -/********************************/ - -typedef FB_API_HANDLE isc_att_handle; -typedef FB_API_HANDLE isc_blob_handle; -typedef FB_API_HANDLE isc_db_handle; -typedef FB_API_HANDLE isc_req_handle; -typedef FB_API_HANDLE isc_stmt_handle; -typedef FB_API_HANDLE isc_svc_handle; -typedef FB_API_HANDLE isc_tr_handle; -typedef void (* isc_callback) (); -typedef ISC_LONG isc_resv_handle; - -typedef void (*ISC_PRINT_CALLBACK) (void*, ISC_SHORT, const char*); -typedef void (*ISC_VERSION_CALLBACK)(void*, const char*); -typedef void (*ISC_EVENT_CALLBACK)(void*, ISC_USHORT, const ISC_UCHAR*); +#define ISC_TIME_SECONDS_PRECISION 10000L +#define ISC_TIME_SECONDS_PRECISION_SCALE -4 /*******************************************************************/ /* Blob id structure */ /*******************************************************************/ -#if !(defined __cplusplus) -typedef GDS_QUAD GDS__QUAD; -#endif /* !(defined __cplusplus) */ +typedef struct { + ISC_LONG gds_quad_high; + unsigned ISC_LONG gds_quad_low; +} GDS_QUAD; +//#if !(defined __cplusplus || defined DEFINED_GDS_QUAD) +#if !(defined DEFINED_GDS_QUAD) +typedef GDS_QUAD GDS__QUAD; +#define DEFINED_GDS_QUAD +#endif /* !(defined __cplusplus) */ -typedef struct -{ - short array_bound_lower; - short array_bound_upper; +#define ISC_QUAD GDS_QUAD +#define isc_quad_high gds_quad_high +#define isc_quad_low gds_quad_low + +typedef struct { + short array_bound_lower; + short array_bound_upper; } ISC_ARRAY_BOUND; -typedef struct -{ - ISC_UCHAR array_desc_dtype; - ISC_SCHAR array_desc_scale; - unsigned short array_desc_length; - ISC_SCHAR array_desc_field_name[32]; - ISC_SCHAR array_desc_relation_name[32]; - short array_desc_dimensions; - short array_desc_flags; - ISC_ARRAY_BOUND array_desc_bounds[16]; -} ISC_ARRAY_DESC; +typedef struct { + short array_desc_version; + unsigned char array_desc_dtype; + unsigned char array_desc_subtype; + char array_desc_scale; + unsigned short array_desc_length; + char array_desc_field_name [METADATALENGTH]; + char array_desc_relation_name [METADATALENGTH]; + short array_desc_dimensions; + short array_desc_flags; + ISC_ARRAY_BOUND array_desc_bounds [16]; +} ISC_ARRAY_DESC_V2; -typedef struct -{ - short blob_desc_subtype; - short blob_desc_charset; - short blob_desc_segment_size; - ISC_UCHAR blob_desc_field_name[32]; - ISC_UCHAR blob_desc_relation_name[32]; -} ISC_BLOB_DESC; +#define ARR_DESC_VERSION2 2 +#define ARR_DESC_CURRENT_VERSION ARR_DESC_VERSION2 +typedef struct { + short blob_desc_version; + short blob_desc_subtype; + short blob_desc_charset; + short blob_desc_segment_size; + unsigned char blob_desc_field_name [METADATALENGTH]; + unsigned char blob_desc_relation_name [METADATALENGTH]; +} ISC_BLOB_DESC_V2; + +#define BLB_DESC_VERSION2 2 +#define BLB_DESC_CURRENT_VERSION BLB_DESC_VERSION2 + +/*********************************/ +/* Descriptor control structure */ +/*********************************/ +typedef struct isc_dsc { + unsigned char dsc_version; + unsigned char dsc_dtype; + char dsc_scale; + char dsc_precision; + unsigned short dsc_length; + short dsc_sub_type; + unsigned short dsc_flags; + short dsc_encryption; + unsigned char *dsc_address; +} ISC_DSC; + +#define DSC_VERSION2 2 +#define DSC_CURRENT_VERSION DSC_VERSION2 + +#define DSC_VERSION1_TO_CURRENT 0 +#define DSC_CURRENT_TO_VERSION1 1 + +/* values for dsc_flags */ +/* Note: DSC_null is only reliably set for local variables + (blr_variable) */ +#define DSC_null 1 +#define DSC_no_subtype 2 /* dsc has no sub type specified */ +#define DSC_nullable 4 /* not stored. instead, is derived + from metadata primarily to flag + SQLDA (in DSQL) */ +#define DSC_system 8 /* dsc for system field */ + +/* Overload text typing information into the dsc_sub_type field. + See intl.h for definitions of text types */ + +#ifndef dsc_ttype +#define dsc_ttype dsc_sub_type +#endif + +#define DSC_GET_CHARSET(dsc) (((dsc)->dsc_ttype) & 0x00FF) +#define DSC_GET_COLLATE(dsc) (((dsc)->dsc_ttype) >> 8) + + /***************************/ /* Blob control structure */ /***************************/ -typedef struct isc_blob_ctl -{ - ISC_STATUS (* ctl_source)(); /* Source filter */ - struct isc_blob_ctl* ctl_source_handle; /* Argument to pass to source filter */ - short ctl_to_sub_type; /* Target type */ - short ctl_from_sub_type; /* Source type */ - unsigned short ctl_buffer_length; /* Length of buffer */ - unsigned short ctl_segment_length; /* Length of current segment */ - unsigned short ctl_bpb_length; /* Length of blob parameter block */ - /* Internally, this is const UCHAR*, but this public struct probably can't change. */ - ISC_SCHAR* ctl_bpb; /* Address of blob parameter block */ - ISC_UCHAR* ctl_buffer; /* Address of segment buffer */ - ISC_LONG ctl_max_segment; /* Length of longest segment */ - ISC_LONG ctl_number_segments; /* Total number of segments */ - ISC_LONG ctl_total_length; /* Total length of blob */ - ISC_STATUS* ctl_status; /* Address of status vector */ - long ctl_data[8]; /* Application specific data */ -} * ISC_BLOB_CTL; +typedef struct isc_blob_ctl{ + ISC_STATUS (ISC_FAR *ctl_source)(); /* Source filter */ + struct isc_blob_ctl ISC_FAR *ctl_source_handle; /* Argument to pass to source */ + /* filter */ + short ctl_to_sub_type; /* Target type */ + short ctl_from_sub_type; /* Source type */ + unsigned short ctl_buffer_length; /* Length of buffer */ + unsigned short ctl_segment_length; /* Length of current segment */ + unsigned short ctl_bpb_length; /* Length of blob parameter */ + /* block */ + char ISC_FAR *ctl_bpb; /* Address of blob parameter */ + /* block */ + unsigned char ISC_FAR *ctl_buffer; /* Address of segment buffer */ + ISC_LONG ctl_max_segment; /* Length of longest segment */ + ISC_LONG ctl_number_segments; /* Total number of segments */ + ISC_LONG ctl_total_length; /* Total length of blob */ + ISC_STATUS ISC_FAR *ctl_status; /* Address of status vector */ +#if (defined(__BORLANDC__) && defined(__WIN32__)) + long ctl_data [8]; /* Application specific data */ +#elif (defined(__BORLANDC__) && defined(_WIN64)) + long long ctl_data [8]; +#else + intptr_t ctl_data [8]; /* Application specific data */ +#endif +} ISC_FAR *ISC_BLOB_CTL; /***************************/ -/* Blob stream definitions */ +/* Blob stream definitions */ /***************************/ -typedef struct bstream -{ - isc_blob_handle bstr_blob; /* Blob handle */ - ISC_SCHAR * bstr_buffer; /* Address of buffer */ - ISC_SCHAR * bstr_ptr; /* Next character */ - short bstr_length; /* Length of buffer */ - short bstr_cnt; /* Characters in buffer */ - char bstr_mode; /* (mode) ? OUTPUT : INPUT */ +typedef struct bstream { + void ISC_FAR *bstr_blob; /* Blob handle */ + char ISC_FAR *bstr_buffer; /* Address of buffer */ + char ISC_FAR *bstr_ptr; /* Next character */ + short bstr_length; /* Length of buffer */ + short bstr_cnt; /* Characters in buffer */ + char bstr_mode; /* (mode) ? OUTPUT : INPUT */ } BSTREAM; -/* Three ugly macros, one even using octal radix... sigh... */ #define getb(p) (--(p)->bstr_cnt >= 0 ? *(p)->bstr_ptr++ & 0377: BLOB_get (p)) #define putb(x,p) (((x) == '\n' || (!(--(p)->bstr_cnt))) ? BLOB_put ((x),p) : ((int) (*(p)->bstr_ptr++ = (unsigned) (x)))) #define putbx(x,p) ((!(--(p)->bstr_cnt)) ? BLOB_put ((x),p) : ((int) (*(p)->bstr_ptr++ = (unsigned) (x)))) + -/********************************************************************/ -/* CVC: Public blob interface definition held in val.h. */ -/* For some unknown reason, it was only documented in langRef */ -/* and being the structure passed by the engine to UDFs it never */ -/* made its way into this public definitions file. */ -/* Being its original name "blob", I renamed it blobcallback here. */ -/* I did the full definition with the proper parameters instead of */ -/* the weak C declaration with any number and type of parameters. */ -/* Since the first parameter -BLB- is unknown outside the engine, */ -/* it's more accurate to use void* than int* as the blob pointer */ -/********************************************************************/ +/*********************************************************************** + * Older and obsolete XSQLVAR_V1, ISC_BLOB_DESC, ISC_ARRAY_DESC structures. + * NOTE: The older structures above are now deprecated and are + * provided here only for backward compatibility. + * Please refrain from using these old structures. + * It is strongly recommended to use the newer SQLDA version + * and related XSQLVAR, ISC_BLOB_DESC_V2, ISC_ARRAY_DESC_V2 structures. + ***********************************************************************/ +typedef struct { + short sqltype; /* datatype of field */ + short sqlscale; /* scale factor */ + short sqlsubtype; /* datatype subtype */ + short sqllen; /* length of data area */ + char ISC_FAR *sqldata; /* address of data */ + short ISC_FAR *sqlind; /* address of indicator variable */ + short sqlname_length; /* length of sqlname field */ + char sqlname [32]; /* name of field, name length + space */ + /* for NULL */ + short relname_length; /* length of relation name */ + char relname [32]; /* field's relation name + space for */ + /* NULL */ + short ownname_length; /* length of owner name */ + char ownname [32]; /* relation's owner name + space for */ + /* NULL */ + short aliasname_length; /* length of alias name */ + char aliasname [32]; /* relation's alias name + space for */ + /* NULL */ +} XSQLVAR_V1; +#define SQLDA_VERSION1 1 -#if !defined(JRD_VAL_H) && !defined(REQUESTER) -/* Blob passing structure */ +typedef struct { + unsigned char array_desc_dtype; + char array_desc_scale; + unsigned short array_desc_length; + char array_desc_field_name [32]; + char array_desc_relation_name [32]; + short array_desc_dimensions; + short array_desc_flags; + ISC_ARRAY_BOUND array_desc_bounds [16]; +} ISC_ARRAY_DESC; -/* This enum applies to parameter "mode" in blob_lseek */ -enum blob_lseek_mode {blb_seek_relative = 1, blb_seek_from_tail = 2}; -/* This enum applies to the value returned by blob_get_segment */ -enum blob_get_result {blb_got_fragment = -1, blb_got_eof = 0, blb_got_full_segment = 1}; +typedef struct { + short blob_desc_subtype; + short blob_desc_charset; + short blob_desc_segment_size; + unsigned char blob_desc_field_name [32]; + unsigned char blob_desc_relation_name [32]; +} ISC_BLOB_DESC; -typedef struct blobcallback { - short (*blob_get_segment) - (void* hnd, ISC_UCHAR* buffer, ISC_USHORT buf_size, ISC_USHORT* result_len); - void* blob_handle; - ISC_LONG blob_number_segments; - ISC_LONG blob_max_segment; - ISC_LONG blob_total_length; - void (*blob_put_segment) - (void* hnd, const ISC_UCHAR* buffer, ISC_USHORT buf_size); - ISC_LONG (*blob_lseek) - (void* hnd, ISC_USHORT mode, ISC_LONG offset); -} *BLOBCALLBACK; -#endif /* !defined(JRD_VAL_H) && !defined(REQUESTER) */ - - -/********************************************************************/ -/* CVC: Public descriptor interface held in dsc2.h. */ -/* We need it documented to be able to recognize NULL in UDFs. */ -/* Being its original name "dsc", I renamed it paramdsc here. */ -/* Notice that I adjust to the original definition: contrary to */ -/* other cases, the typedef is the same struct not the pointer. */ -/* I included the enumeration of dsc_dtype possible values. */ -/* Ultimately, dsc2.h should be part of the public interface. */ -/********************************************************************/ - -#if !defined(JRD_DSC_H) -/* This is the famous internal descriptor that UDFs can use, too. */ -typedef struct paramdsc { - ISC_UCHAR dsc_dtype; - signed char dsc_scale; - ISC_USHORT dsc_length; - short dsc_sub_type; - ISC_USHORT dsc_flags; - ISC_UCHAR *dsc_address; -} PARAMDSC; - -#if !defined(JRD_VAL_H) -/* This is a helper struct to work with varchars. */ -typedef struct paramvary { - ISC_USHORT vary_length; - ISC_UCHAR vary_string[1]; -} PARAMVARY; -#endif /* !defined(JRD_VAL_H) */ - - -#ifndef JRD_DSC_PUB_H -#define JRD_DSC_PUB_H - -#define DSC_null 1 -#define DSC_no_subtype 2 -#define DSC_nullable 4 - -#define dtype_unknown 0 -#define dtype_text 1 -#define dtype_cstring 2 -#define dtype_varying 3 - -#define dtype_packed 6 -#define dtype_byte 7 -#define dtype_short 8 -#define dtype_long 9 -#define dtype_quad 10 -#define dtype_real 11 -#define dtype_double 12 -#define dtype_d_float 13 -#define dtype_sql_date 14 -#define dtype_sql_time 15 -#define dtype_timestamp 16 -#define dtype_blob 17 -#define dtype_array 18 -#define dtype_int64 19 -#define DTYPE_TYPE_MAX 20 - -#define ISC_TIME_SECONDS_PRECISION 10000 -#define ISC_TIME_SECONDS_PRECISION_SCALE (-4) - -#endif - - -#endif /* !defined(JRD_DSC_H) */ +/***********************************************/ /***************************/ /* Dynamic SQL definitions */ /***************************/ + +/******************************/ +/* Declare the extended SQLDA */ +/******************************/ - -#ifndef DSQL_SQLDA_PUB_H -#define DSQL_SQLDA_PUB_H - -#define DSQL_close 1 -#define DSQL_drop 2 - -typedef struct -{ - ISC_SHORT sqltype; - ISC_SHORT sqlscale; - ISC_SHORT sqlsubtype; - ISC_SHORT sqllen; - ISC_SCHAR* sqldata; - ISC_SHORT* sqlind; - ISC_SHORT sqlname_length; - ISC_SCHAR sqlname[32]; - ISC_SHORT relname_length; - ISC_SCHAR relname[32]; - ISC_SHORT ownname_length; - ISC_SCHAR ownname[32]; - ISC_SHORT aliasname_length; - ISC_SCHAR aliasname[32]; +typedef struct { + short sqltype; /* datatype of field */ + short sqlscale; /* scale factor */ + short sqlprecision; /* precision : Reserved for future */ + short sqlsubtype; /* datatype subtype */ + short sqllen; /* length of data area */ + char ISC_FAR *sqldata; /* address of data */ + short ISC_FAR *sqlind; /* address of indicator variable */ + short sqlname_length; /* length of sqlname field */ + char sqlname [METADATALENGTH]; /* name of field, name length + space */ + /* for NULL */ + short relname_length; /* length of relation name */ + char relname [METADATALENGTH]; /* field's relation name + space for */ + /* NULL */ + short ownname_length; /* length of owner name */ + char ownname [METADATALENGTH]; /* relation's owner name + space for */ + /* NULL */ + short aliasname_length; /* length of alias name */ + char aliasname [METADATALENGTH]; /* relation's alias name + space for */ + /* NULL */ } XSQLVAR; -#define SQLDA_VERSION1 1 - -typedef struct -{ - ISC_SHORT version; - ISC_SCHAR sqldaid[8]; - ISC_LONG sqldabc; - ISC_SHORT sqln; - ISC_SHORT sqld; - XSQLVAR sqlvar[1]; +typedef struct { + short version; /* version of this XSQLDA */ + char sqldaid [8]; /* XSQLDA name field */ + ISC_LONG sqldabc; /* length in bytes of SQLDA */ + short sqln; /* number of fields allocated */ + short sqld; /* actual number of fields */ + XSQLVAR sqlvar[1]; /* first field address */ } XSQLDA; -#define XSQLDA_LENGTH(n) (sizeof (XSQLDA) + (n - 1) * sizeof (XSQLVAR)) -#define SQL_TEXT 452 -#define SQL_VARYING 448 -#define SQL_SHORT 500 -#define SQL_LONG 496 -#define SQL_FLOAT 482 -#define SQL_DOUBLE 480 -#define SQL_D_FLOAT 530 -#define SQL_TIMESTAMP 510 -#define SQL_BLOB 520 -#define SQL_ARRAY 540 -#define SQL_QUAD 550 -#define SQL_TYPE_TIME 560 -#define SQL_TYPE_DATE 570 -#define SQL_INT64 580 +#define SQLDA_VERSION2 2 +#define SQLDA_CURRENT_VERSION SQLDA_VERSION2 -#define SQL_DATE SQL_TIMESTAMP +#define XSQLDA_LENGTH(n) (sizeof (XSQLDA) + (n-1) * sizeof (XSQLVAR)) +#define XSQLVAR_LENGTH(num_rows, num_vars) (sizeof(XSQLVAR) * num_rows * num_vars) +/* START CONVERT TAG */ +#define SQL_DIALECT_V5 1 /* meaning is same as DIALECT_xsqlda */ +#define SQL_DIALECT_V6_TRANSITION 2 /* flagging anything that is delimited + by double quotes as an error and + flagging keyword DATE as an error */ +#define SQL_DIALECT_V6 3 /* supports SQL delimited identifier, + SQLDATE/DATE, TIME, TIMESTAMP, + CURRENT_DATE, CURRENT_TIME, + CURRENT_TIMESTAMP, and 64-bit exact + numeric type */ +#define SQL_DIALECT_CURRENT SQL_DIALECT_V6 /* latest IB DIALECT */ +/* END CONVERT TAG */ -#define SQL_DIALECT_V5 1 -#define SQL_DIALECT_V6_TRANSITION 2 -#define SQL_DIALECT_V6 3 -#define SQL_DIALECT_CURRENT SQL_DIALECT_V6 +/* START CONVERT TAG */ +/* Bit flag definitions for SQLVAR.sqlind output variable */ -#endif +#define SQLIND_NULL (short) (1 << 15) +#define SQLIND_INSERT (1 << 0) +#define SQLIND_UPDATE (1 << 1) +#define SQLIND_DELETE (1 << 2) +#define SQLIND_CHANGE (1 << 3) +#define SQLIND_TRUNCATE (1 << 4) +#define SQLIND_CHANGE_VIEW (1 << 5) +/* END CONVERT TAG */ + +/********************************/ +/* InterBase Handle Definitions */ +/********************************/ +typedef void ISC_FAR *isc_att_handle; +typedef void ISC_FAR *isc_blob_handle; +typedef void ISC_FAR *isc_db_handle; +typedef void ISC_FAR *isc_form_handle; +typedef void ISC_FAR *isc_req_handle; +typedef void ISC_FAR *isc_stmt_handle; +typedef void ISC_FAR *isc_svc_handle; +typedef void ISC_FAR *isc_tr_handle; +typedef void ISC_FAR *isc_win_handle; +typedef void (ISC_FAR *isc_callback)(); +typedef ISC_LONG isc_resv_handle; + /***************************/ /* OSRI database functions */ /***************************/ +#if defined(__cplusplus) || defined(__STDC__) || defined(_Windows) || \ + (defined(_MSC_VER) && defined(_WIN32)) || defined( _WINDOWS) || \ + (defined(__BORLANDC__) && (defined(__WIN32__) || defined(__OS2__))) || \ + (defined(_WIN64)) || \ + (defined(__IBMC__) && defined(__OS2__)) || defined(AIX_PPC) + #ifdef __cplusplus extern "C" { #endif -ISC_STATUS ISC_EXPORT isc_attach_database(ISC_STATUS*, - short, - const ISC_SCHAR*, - isc_db_handle*, - short, - const ISC_SCHAR*); - -ISC_STATUS ISC_EXPORT isc_array_gen_sdl(ISC_STATUS*, - const ISC_ARRAY_DESC*, - ISC_SHORT*, - ISC_UCHAR*, - ISC_SHORT*); - -ISC_STATUS ISC_EXPORT isc_array_get_slice(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - ISC_QUAD*, - const ISC_ARRAY_DESC*, - void*, - ISC_LONG*); - -ISC_STATUS ISC_EXPORT isc_array_lookup_bounds(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - const ISC_SCHAR*, - const ISC_SCHAR*, - ISC_ARRAY_DESC*); - -ISC_STATUS ISC_EXPORT isc_array_lookup_desc(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - const ISC_SCHAR*, - const ISC_SCHAR*, - ISC_ARRAY_DESC*); - -ISC_STATUS ISC_EXPORT isc_array_set_desc(ISC_STATUS*, - const ISC_SCHAR*, - const ISC_SCHAR*, - const short*, - const short*, - const short*, - ISC_ARRAY_DESC*); - -ISC_STATUS ISC_EXPORT isc_array_put_slice(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - ISC_QUAD*, - const ISC_ARRAY_DESC*, - void*, - ISC_LONG *); - -void ISC_EXPORT isc_blob_default_desc(ISC_BLOB_DESC*, - const ISC_UCHAR*, - const ISC_UCHAR*); - -ISC_STATUS ISC_EXPORT isc_blob_gen_bpb(ISC_STATUS*, - const ISC_BLOB_DESC*, - const ISC_BLOB_DESC*, - unsigned short, - ISC_UCHAR*, - unsigned short*); - -ISC_STATUS ISC_EXPORT isc_blob_info(ISC_STATUS*, - isc_blob_handle*, - short, - const ISC_SCHAR*, - short, - ISC_SCHAR*); - -ISC_STATUS ISC_EXPORT isc_blob_lookup_desc(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - const ISC_UCHAR*, - const ISC_UCHAR*, - ISC_BLOB_DESC*, - ISC_UCHAR*); - -ISC_STATUS ISC_EXPORT isc_blob_set_desc(ISC_STATUS*, - const ISC_UCHAR*, - const ISC_UCHAR*, - short, - short, - short, - ISC_BLOB_DESC*); - -ISC_STATUS ISC_EXPORT isc_cancel_blob(ISC_STATUS *, - isc_blob_handle *); - -ISC_STATUS ISC_EXPORT isc_cancel_events(ISC_STATUS *, - isc_db_handle *, - ISC_LONG *); - -ISC_STATUS ISC_EXPORT isc_close_blob(ISC_STATUS *, - isc_blob_handle *); - -ISC_STATUS ISC_EXPORT isc_commit_retaining(ISC_STATUS *, - isc_tr_handle *); - -ISC_STATUS ISC_EXPORT isc_commit_transaction(ISC_STATUS *, - isc_tr_handle *); - -ISC_STATUS ISC_EXPORT isc_create_blob(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - isc_blob_handle*, - ISC_QUAD*); - -ISC_STATUS ISC_EXPORT isc_create_blob2(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - isc_blob_handle*, - ISC_QUAD*, - short, - const ISC_SCHAR*); - -ISC_STATUS ISC_EXPORT isc_create_database(ISC_STATUS*, - short, - const ISC_SCHAR*, - isc_db_handle*, - short, - const ISC_SCHAR*, - short); - -ISC_STATUS ISC_EXPORT isc_database_info(ISC_STATUS*, - isc_db_handle*, - short, - const ISC_SCHAR*, - short, - ISC_SCHAR*); - -void ISC_EXPORT isc_decode_date(const ISC_QUAD*, - void*); - -void ISC_EXPORT isc_decode_sql_date(const ISC_DATE*, - void*); - -void ISC_EXPORT isc_decode_sql_time(const ISC_TIME*, - void*); - -void ISC_EXPORT isc_decode_timestamp(const ISC_TIMESTAMP*, - void*); - -ISC_STATUS ISC_EXPORT isc_detach_database(ISC_STATUS *, - isc_db_handle *); - -ISC_STATUS ISC_EXPORT isc_drop_database(ISC_STATUS *, - isc_db_handle *); - -ISC_STATUS ISC_EXPORT isc_dsql_allocate_statement(ISC_STATUS *, - isc_db_handle *, - isc_stmt_handle *); - -ISC_STATUS ISC_EXPORT isc_dsql_alloc_statement2(ISC_STATUS *, - isc_db_handle *, - isc_stmt_handle *); - -ISC_STATUS ISC_EXPORT isc_dsql_describe(ISC_STATUS *, - isc_stmt_handle *, - unsigned short, - XSQLDA *); - -ISC_STATUS ISC_EXPORT isc_dsql_describe_bind(ISC_STATUS *, - isc_stmt_handle *, - unsigned short, - XSQLDA *); - -ISC_STATUS ISC_EXPORT isc_dsql_exec_immed2(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - XSQLDA*, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_dsql_execute(ISC_STATUS*, - isc_tr_handle*, - isc_stmt_handle*, - unsigned short, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_dsql_execute2(ISC_STATUS*, - isc_tr_handle*, - isc_stmt_handle*, - unsigned short, - XSQLDA*, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_dsql_execute_immediate(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_dsql_fetch(ISC_STATUS *, - isc_stmt_handle *, - unsigned short, - XSQLDA *); - -ISC_STATUS ISC_EXPORT isc_dsql_finish(isc_db_handle *); - -ISC_STATUS ISC_EXPORT isc_dsql_free_statement(ISC_STATUS *, - isc_stmt_handle *, - unsigned short); - -ISC_STATUS ISC_EXPORT isc_dsql_insert(ISC_STATUS*, - isc_stmt_handle*, - unsigned short, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_dsql_prepare(ISC_STATUS*, - isc_tr_handle*, - isc_stmt_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_dsql_set_cursor_name(ISC_STATUS*, - isc_stmt_handle*, - const ISC_SCHAR*, - unsigned short); - -ISC_STATUS ISC_EXPORT isc_dsql_sql_info(ISC_STATUS*, - isc_stmt_handle*, - short, - const ISC_SCHAR*, - short, - ISC_SCHAR*); - -void ISC_EXPORT isc_encode_date(const void*, - ISC_QUAD*); - -void ISC_EXPORT isc_encode_sql_date(const void*, - ISC_DATE*); - -void ISC_EXPORT isc_encode_sql_time(const void*, - ISC_TIME*); - -void ISC_EXPORT isc_encode_timestamp(const void*, - ISC_TIMESTAMP*); - -ISC_LONG ISC_EXPORT_VARARG isc_event_block(ISC_UCHAR**, - ISC_UCHAR**, - ISC_USHORT, ...); - -ISC_USHORT ISC_EXPORT isc_event_block_a(ISC_SCHAR**, - ISC_SCHAR**, - ISC_USHORT, - ISC_SCHAR**); - -void ISC_EXPORT isc_event_block_s(ISC_SCHAR**, - ISC_SCHAR**, - ISC_USHORT, - ISC_SCHAR**, - ISC_USHORT*); - -void ISC_EXPORT isc_event_counts(ISC_ULONG*, - short, - ISC_UCHAR*, - const ISC_UCHAR *); - -/* 17 May 2001 - isc_expand_dpb is DEPRECATED */ -void FB_API_DEPRECATED ISC_EXPORT_VARARG isc_expand_dpb(ISC_SCHAR**, - short*, ...); - -int ISC_EXPORT isc_modify_dpb(ISC_SCHAR**, - short*, - unsigned short, - const ISC_SCHAR*, - short); - -ISC_LONG ISC_EXPORT isc_free(ISC_SCHAR *); - -ISC_STATUS ISC_EXPORT isc_get_segment(ISC_STATUS *, - isc_blob_handle *, - unsigned short *, - unsigned short, - ISC_SCHAR *); - -ISC_STATUS ISC_EXPORT isc_get_slice(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - ISC_QUAD*, - short, - const ISC_SCHAR*, - short, - const ISC_LONG*, - ISC_LONG, - void*, - ISC_LONG*); - -/* CVC: This non-const signature is needed for compatibility, see gds.cpp. */ -ISC_LONG FB_API_DEPRECATED ISC_EXPORT isc_interprete(ISC_SCHAR*, - ISC_STATUS**); - -/* This const params version used in the engine and other places. */ -ISC_LONG ISC_EXPORT fb_interpret(ISC_SCHAR*, - unsigned int, - const ISC_STATUS**); - -ISC_STATUS ISC_EXPORT isc_open_blob(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - isc_blob_handle*, - ISC_QUAD*); - -ISC_STATUS ISC_EXPORT isc_open_blob2(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - isc_blob_handle*, - ISC_QUAD*, - ISC_USHORT, - const ISC_UCHAR*); - -ISC_STATUS ISC_EXPORT isc_prepare_transaction2(ISC_STATUS*, - isc_tr_handle*, - ISC_USHORT, - const ISC_UCHAR*); - -void ISC_EXPORT isc_print_sqlerror(ISC_SHORT, - const ISC_STATUS*); - -ISC_STATUS ISC_EXPORT isc_print_status(const ISC_STATUS*); - -ISC_STATUS ISC_EXPORT isc_put_segment(ISC_STATUS*, - isc_blob_handle*, - unsigned short, - const ISC_SCHAR*); - -ISC_STATUS ISC_EXPORT isc_put_slice(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - ISC_QUAD*, - short, - const ISC_SCHAR*, - short, - const ISC_LONG*, - ISC_LONG, - void*); - -ISC_STATUS ISC_EXPORT isc_que_events(ISC_STATUS*, - isc_db_handle*, - ISC_LONG*, - short, - const ISC_UCHAR*, - ISC_EVENT_CALLBACK, - void*); - -ISC_STATUS ISC_EXPORT isc_rollback_retaining(ISC_STATUS *, - isc_tr_handle *); - -ISC_STATUS ISC_EXPORT isc_rollback_transaction(ISC_STATUS *, - isc_tr_handle *); - -ISC_STATUS ISC_EXPORT isc_start_multiple(ISC_STATUS *, - isc_tr_handle *, - short, - void *); - -ISC_STATUS ISC_EXPORT_VARARG isc_start_transaction(ISC_STATUS *, - isc_tr_handle *, - short, ...); - -ISC_LONG ISC_EXPORT isc_sqlcode(const ISC_STATUS*); - -void ISC_EXPORT isc_sqlcode_s(const ISC_STATUS*, - ISC_ULONG*); - -void ISC_EXPORT isc_sql_interprete(short, - ISC_SCHAR*, - short); - -ISC_STATUS ISC_EXPORT isc_transaction_info(ISC_STATUS*, - isc_tr_handle*, - short, - const ISC_SCHAR*, - short, - ISC_SCHAR*); - -ISC_STATUS ISC_EXPORT isc_transact_request(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - ISC_SCHAR*, - unsigned short, - ISC_SCHAR*); - -ISC_LONG ISC_EXPORT isc_vax_integer(const ISC_SCHAR*, - short); - -ISC_INT64 ISC_EXPORT isc_portable_integer(const ISC_UCHAR*, - short); +ISC_STATUS ISC_EXPORT isc_attach_database (ISC_STATUS ISC_FAR *, + short, + char ISC_FAR *, + isc_db_handle ISC_FAR *, + short, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_gen_sdl (ISC_STATUS ISC_FAR *, + ISC_ARRAY_DESC ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + short ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_gen_sdl2 (ISC_STATUS ISC_FAR *, + ISC_ARRAY_DESC_V2 ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + short ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_get_slice (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + ISC_QUAD ISC_FAR *, + ISC_ARRAY_DESC ISC_FAR *, + void ISC_FAR *, + ISC_LONG ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_get_slice2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + ISC_QUAD ISC_FAR *, + ISC_ARRAY_DESC_V2 ISC_FAR *, + void ISC_FAR *, + ISC_LONG ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_lookup_bounds (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + char ISC_FAR *, + ISC_ARRAY_DESC ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_lookup_bounds2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + char ISC_FAR *, + ISC_ARRAY_DESC_V2 ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_lookup_desc (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + char ISC_FAR *, + ISC_ARRAY_DESC ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_lookup_desc2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + char ISC_FAR *, + ISC_ARRAY_DESC_V2 ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_set_desc (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + char ISC_FAR *, + short ISC_FAR *, + short ISC_FAR *, + short ISC_FAR *, + ISC_ARRAY_DESC ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_set_desc2 (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + char ISC_FAR *, + short ISC_FAR *, + short ISC_FAR *, + short ISC_FAR *, + ISC_ARRAY_DESC_V2 ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_put_slice (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + ISC_QUAD ISC_FAR *, + ISC_ARRAY_DESC ISC_FAR *, + void ISC_FAR *, + ISC_LONG ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_array_put_slice2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + ISC_QUAD ISC_FAR *, + ISC_ARRAY_DESC_V2 ISC_FAR *, + void ISC_FAR *, + ISC_LONG ISC_FAR *); + +void ISC_EXPORT isc_blob_default_desc (ISC_BLOB_DESC ISC_FAR *, + unsigned char ISC_FAR *, + unsigned char ISC_FAR *); + +void ISC_EXPORT isc_blob_default_desc2 (ISC_BLOB_DESC_V2 ISC_FAR *, + unsigned char ISC_FAR *, + unsigned char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_blob_gen_bpb (ISC_STATUS ISC_FAR *, + ISC_BLOB_DESC ISC_FAR *, + ISC_BLOB_DESC ISC_FAR *, + unsigned short, + unsigned char ISC_FAR *, + unsigned short ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_blob_gen_bpb2 (ISC_STATUS ISC_FAR *, + ISC_BLOB_DESC_V2 ISC_FAR *, + ISC_BLOB_DESC_V2 ISC_FAR *, + unsigned short, + unsigned char ISC_FAR *, + unsigned short ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_blob_info (ISC_STATUS ISC_FAR *, + isc_blob_handle ISC_FAR *, + short, + char ISC_FAR *, + short, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_blob_lookup_desc (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned char ISC_FAR *, + unsigned char ISC_FAR *, + ISC_BLOB_DESC ISC_FAR *, + unsigned char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_blob_lookup_desc2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned char ISC_FAR *, + unsigned char ISC_FAR *, + ISC_BLOB_DESC_V2 ISC_FAR *, + unsigned char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_blob_set_desc (ISC_STATUS ISC_FAR *, + unsigned char ISC_FAR *, + unsigned char ISC_FAR *, + short, + short, + short, + ISC_BLOB_DESC ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_blob_set_desc2 (ISC_STATUS ISC_FAR *, + unsigned char ISC_FAR *, + unsigned char ISC_FAR *, + short, + short, + short, + ISC_BLOB_DESC_V2 ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_cancel_blob (ISC_STATUS ISC_FAR *, + isc_blob_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_cancel_events (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + ISC_LONG ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_close_blob (ISC_STATUS ISC_FAR *, + isc_blob_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_commit_retaining (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_commit_transaction (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_create_blob (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_blob_handle ISC_FAR *, + ISC_QUAD ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_create_blob2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_blob_handle ISC_FAR *, + ISC_QUAD ISC_FAR *, + short, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_create_database (ISC_STATUS ISC_FAR *, + short, + char ISC_FAR *, + isc_db_handle ISC_FAR *, + short, + char ISC_FAR *, + short); + +ISC_STATUS ISC_EXPORT isc_database_info (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + short, + char ISC_FAR *, + short, + char ISC_FAR *); + +void ISC_EXPORT isc_decode_date (ISC_QUAD ISC_FAR *, + void ISC_FAR *); + +void ISC_EXPORT isc_decode_sql_date (ISC_DATE ISC_FAR *, + void ISC_FAR *); + +void ISC_EXPORT isc_decode_sql_time (ISC_TIME ISC_FAR *, + void ISC_FAR *); + +void ISC_EXPORT isc_decode_timestamp (ISC_TIMESTAMP ISC_FAR *, + void ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_detach_database (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_drop_database (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_allocate_statement (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_alloc_statement2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_describe (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_describe_bind (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_exec_immed2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_execute (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_execute2 (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_batch_execute_immed (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + int, + ISC_ULONG, + char ISC_FAR **, + ISC_ULONG ISC_FAR *); +ISC_STATUS ISC_EXPORT isc_dsql_batch_exec_immed3_m (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned short, + ISC_ULONG, + unsigned char ISC_FAR *, + unsigned short, + ISC_ULONG ISC_FAR * + ); +ISC_STATUS ISC_EXPORT isc_dsql_batch_execute (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *, + unsigned short, + XSQLVAR ISC_FAR *, + ISC_ULONG ISC_FAR *); +ISC_STATUS ISC_EXPORT isc_dsql_execute_immediate (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_fetch (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_finish (isc_db_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_free_statement (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short); + +ISC_STATUS ISC_EXPORT isc_dsql_insert (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_prepare (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_dsql_set_cursor_name (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + char ISC_FAR *, + unsigned short); + +ISC_STATUS ISC_EXPORT isc_dsql_sql_info (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + short, + char ISC_FAR *, + short, + char ISC_FAR *); + +void ISC_EXPORT isc_encode_date (void ISC_FAR *, + ISC_QUAD ISC_FAR *); + +void ISC_EXPORT isc_encode_sql_date (void ISC_FAR *, + ISC_DATE ISC_FAR *); + +void ISC_EXPORT isc_encode_sql_time (void ISC_FAR *, + ISC_TIME ISC_FAR *); + +void ISC_EXPORT isc_encode_timestamp (void ISC_FAR *, + ISC_TIMESTAMP ISC_FAR *); + +ISC_LONG ISC_EXPORT_VARARG isc_event_block (char ISC_FAR * ISC_FAR *, + char ISC_FAR * ISC_FAR *, + unsigned short, ...); + +ISC_USHORT ISC_EXPORT isc_event_block_a (char ISC_FAR * ISC_FAR *, + char ISC_FAR * ISC_FAR *, + unsigned short, + char ISC_FAR * ISC_FAR *); + +void ISC_EXPORT isc_event_counts (ISC_ULONG ISC_FAR *, + short, + char ISC_FAR *, + char ISC_FAR *); + +void ISC_EXPORT_VARARG isc_expand_dpb (char ISC_FAR * ISC_FAR *, + short ISC_FAR *, + ...); + +int ISC_EXPORT isc_modify_dpb (char ISC_FAR * ISC_FAR *, + short ISC_FAR *, unsigned short, + char ISC_FAR *, short ); + +ISC_LONG ISC_EXPORT isc_free (char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_get_segment (ISC_STATUS ISC_FAR *, + isc_blob_handle ISC_FAR *, + unsigned short ISC_FAR *, + unsigned short, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_get_slice (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + ISC_QUAD ISC_FAR *, + short, + char ISC_FAR *, + short, + ISC_LONG ISC_FAR *, + ISC_LONG, + void ISC_FAR *, + ISC_LONG ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_interprete (char ISC_FAR *, + ISC_STATUS ISC_FAR * ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_open_blob (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_blob_handle ISC_FAR *, + ISC_QUAD ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_open_blob2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_blob_handle ISC_FAR *, + ISC_QUAD ISC_FAR *, + short, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_prepare_transaction2 (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + short, + char ISC_FAR *); + +void ISC_EXPORT isc_print_sqlerror (short, + ISC_STATUS ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_print_status (ISC_STATUS ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_put_segment (ISC_STATUS ISC_FAR *, + isc_blob_handle ISC_FAR *, + unsigned short, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_put_slice (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + ISC_QUAD ISC_FAR *, + short, + char ISC_FAR *, + short, + ISC_LONG ISC_FAR *, + ISC_LONG, + void ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_que_events (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + ISC_LONG ISC_FAR *, + short, + char ISC_FAR *, + isc_callback, + void ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_release_savepoint (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_rollback_retaining (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_rollback_savepoint (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + unsigned short); + +ISC_STATUS ISC_EXPORT isc_rollback_transaction (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_start_multiple (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + short, + void ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_start_savepoint (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT_VARARG isc_start_transaction (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + short, ...); + +ISC_LONG ISC_EXPORT isc_sqlcode (ISC_STATUS ISC_FAR *); + +void ISC_EXPORT isc_sql_interprete (short, + char ISC_FAR *, + short); + +ISC_STATUS ISC_EXPORT isc_transaction_info (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + short, + char ISC_FAR *, + short, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_transact_request (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + char ISC_FAR *); + +ISC_LONG ISC_EXPORT isc_vax_integer (char ISC_FAR *, + short); + +ISC_INT64 ISC_EXPORT isc_portable_integer (unsigned char ISC_FAR *, + short); /*************************************/ /* Security Functions and structures */ /*************************************/ - #define sec_uid_spec 0x01 #define sec_gid_spec 0x02 #define sec_server_spec 0x04 @@ -838,487 +928,694 @@ ISC_INT64 ISC_EXPORT isc_portable_integer(const ISC_UCHAR*, #define sec_protocol_tcpip 1 #define sec_protocol_netbeui 2 -#define sec_protocol_spx 3 /* -- Deprecated Protocol. Declaration retained for compatibility */ +#define sec_protocol_spx 3 #define sec_protocol_local 4 typedef struct { - short sec_flags; /* which fields are specified */ - int uid; /* the user's id */ - int gid; /* the user's group id */ - int protocol; /* protocol to use for connection */ - ISC_SCHAR *server; /* server to administer */ - ISC_SCHAR *user_name; /* the user's name */ - ISC_SCHAR *password; /* the user's password */ - ISC_SCHAR *group_name; /* the group name */ - ISC_SCHAR *first_name; /* the user's first name */ - ISC_SCHAR *middle_name; /* the user's middle name */ - ISC_SCHAR *last_name; /* the user's last name */ - ISC_SCHAR *dba_user_name; /* the dba user name */ - ISC_SCHAR *dba_password; /* the dba password */ + short sec_flags; /* which fields are specified */ + int uid; /* the user's id */ + int gid; /* the user's group id */ + int protocol; /* protocol to use for connection */ + char ISC_FAR *server; /* server to administer */ + char ISC_FAR *user_name; /* the user's name */ + char ISC_FAR *password; /* the user's password */ + char ISC_FAR *group_name; /* the group name */ + char ISC_FAR *first_name; /* the user's first name */ + char ISC_FAR *middle_name; /* the user's middle name */ + char ISC_FAR *last_name; /* the user's last name */ + char ISC_FAR *dba_user_name; /* the dba user name */ + char ISC_FAR *dba_password; /* the dba password */ } USER_SEC_DATA; -ISC_STATUS ISC_EXPORT isc_add_user(ISC_STATUS*, const USER_SEC_DATA*); +int ISC_EXPORT isc_add_user (ISC_STATUS ISC_FAR *, USER_SEC_DATA *); -ISC_STATUS ISC_EXPORT isc_delete_user(ISC_STATUS*, const USER_SEC_DATA*); +int ISC_EXPORT isc_delete_user (ISC_STATUS ISC_FAR *, USER_SEC_DATA *); -ISC_STATUS ISC_EXPORT isc_modify_user(ISC_STATUS*, const USER_SEC_DATA*); +int ISC_EXPORT isc_modify_user (ISC_STATUS ISC_FAR *, USER_SEC_DATA *); /**********************************/ /* Other OSRI functions */ /**********************************/ + +ISC_STATUS ISC_EXPORT isc_compile_request (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_compile_request(ISC_STATUS*, - isc_db_handle*, - isc_req_handle*, - short, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_compile_request2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_compile_request2(ISC_STATUS*, - isc_db_handle*, - isc_req_handle*, - short, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_ddl (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_ddl(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - short, - const ISC_SCHAR*); - -ISC_STATUS ISC_EXPORT isc_prepare_transaction(ISC_STATUS*, - isc_tr_handle*); +ISC_STATUS ISC_EXPORT isc_prepare_transaction (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_receive(ISC_STATUS*, - isc_req_handle*, - short, - short, - void*, - short); +ISC_STATUS ISC_EXPORT isc_receive (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *, + short, + short, + void ISC_FAR *, + short); -ISC_STATUS ISC_EXPORT isc_reconnect_transaction(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - short, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_reconnect_transaction (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_release_request(ISC_STATUS*, - isc_req_handle*); +ISC_STATUS ISC_EXPORT isc_release_request (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_request_info(ISC_STATUS*, - isc_req_handle*, - short, - short, - const ISC_SCHAR*, - short, - ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_request_info (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *, + short, + short, + char ISC_FAR *, + short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_seek_blob(ISC_STATUS*, - isc_blob_handle*, - short, - ISC_LONG, - ISC_LONG*); +ISC_STATUS ISC_EXPORT isc_seek_blob (ISC_STATUS ISC_FAR *, + isc_blob_handle ISC_FAR *, + short, + ISC_LONG, + ISC_LONG ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_send(ISC_STATUS*, - isc_req_handle*, - short, - short, - const void*, - short); +ISC_STATUS ISC_EXPORT isc_send (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *, + short, + short, + void ISC_FAR *, + short); -ISC_STATUS ISC_EXPORT isc_start_and_send(ISC_STATUS*, - isc_req_handle*, - isc_tr_handle*, - short, - short, - const void*, - short); +ISC_STATUS ISC_EXPORT isc_start_and_send (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + short, + short, + void ISC_FAR *, + short); -ISC_STATUS ISC_EXPORT isc_start_request(ISC_STATUS *, - isc_req_handle *, - isc_tr_handle *, - short); - -ISC_STATUS ISC_EXPORT isc_unwind_request(ISC_STATUS *, - isc_tr_handle *, - short); - -ISC_STATUS ISC_EXPORT isc_wait_for_event(ISC_STATUS*, - isc_db_handle*, - short, - const ISC_UCHAR*, - ISC_UCHAR*); +ISC_STATUS ISC_EXPORT isc_start_request (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + short); +ISC_STATUS ISC_EXPORT isc_unwind_request (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + short); +ISC_STATUS ISC_EXPORT isc_wait_for_event (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + short, + char ISC_FAR *, + char ISC_FAR *); + /*****************************/ /* Other Sql functions */ /*****************************/ -ISC_STATUS ISC_EXPORT isc_close(ISC_STATUS*, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_close (ISC_STATUS ISC_FAR *, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_declare(ISC_STATUS*, - const ISC_SCHAR*, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_declare (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_describe(ISC_STATUS*, - const ISC_SCHAR*, - XSQLDA *); +ISC_STATUS ISC_EXPORT isc_describe (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_describe_bind(ISC_STATUS*, - const ISC_SCHAR*, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_describe_bind (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_execute(ISC_STATUS*, - isc_tr_handle*, - const ISC_SCHAR*, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_execute (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_execute_immediate(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - short*, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_execute_immediate (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_fetch(ISC_STATUS*, - const ISC_SCHAR*, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_open(ISC_STATUS*, - isc_tr_handle*, - const ISC_SCHAR*, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_prepare(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - const ISC_SCHAR*, - short*, - const ISC_SCHAR*, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_fetch (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + XSQLDA ISC_FAR *); +ISC_STATUS ISC_EXPORT isc_open (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + XSQLDA ISC_FAR *); +ISC_STATUS ISC_EXPORT isc_prepare (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + XSQLDA ISC_FAR *); + /*************************************/ /* Other Dynamic sql functions */ /*************************************/ -ISC_STATUS ISC_EXPORT isc_dsql_execute_m(ISC_STATUS*, - isc_tr_handle*, - isc_stmt_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_dsql_execute_m (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_dsql_execute2_m(ISC_STATUS*, - isc_tr_handle*, - isc_stmt_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - const ISC_SCHAR*, - unsigned short, - ISC_SCHAR*, - unsigned short, - unsigned short, - ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_dsql_execute2_m (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_dsql_execute_immediate_m(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_dsql_batch_execute2_m (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *, + unsigned short, + ISC_ULONG ISC_FAR *); +ISC_STATUS ISC_EXPORT isc_dsql_execute_immediate_m (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_dsql_exec_immed3_m(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - ISC_SCHAR*, - unsigned short, - ISC_SCHAR*, - unsigned short, - unsigned short, - ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_dsql_exec_immed3_m (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_dsql_fetch_m(ISC_STATUS*, - isc_stmt_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_dsql_fetch_m (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_dsql_insert_m(ISC_STATUS*, - isc_stmt_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_dsql_insert_m (ISC_STATUS ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_dsql_prepare_m(ISC_STATUS*, - isc_tr_handle*, - isc_stmt_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - unsigned short, - const ISC_SCHAR*, - unsigned short, - ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_dsql_prepare_m (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_stmt_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + unsigned short, + char ISC_FAR *, + unsigned short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_dsql_release(ISC_STATUS*, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_dsql_release (ISC_STATUS ISC_FAR *, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_close(ISC_STATUS*, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_close (ISC_STATUS ISC_FAR *, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_declare(ISC_STATUS*, - const ISC_SCHAR*, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_declare (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_describe(ISC_STATUS*, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_describe (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_describe_bind(ISC_STATUS*, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_describe_bind (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_execute(ISC_STATUS*, - isc_tr_handle*, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_execute (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_execute2(ISC_STATUS*, - isc_tr_handle*, - const ISC_SCHAR*, - unsigned short, - XSQLDA*, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_execute2 (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_execute_immed(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_execute_immed (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_fetch(ISC_STATUS*, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_exec_immed2 (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_fetch_a(ISC_STATUS*, - int*, - const ISC_SCHAR*, - ISC_USHORT, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_fetch (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); -void ISC_EXPORT isc_embed_dsql_length(const ISC_UCHAR*, - ISC_USHORT*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_open (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_open(ISC_STATUS*, - isc_tr_handle*, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_open2 (ISC_STATUS ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_open2(ISC_STATUS*, - isc_tr_handle*, - const ISC_SCHAR*, - unsigned short, - XSQLDA*, - XSQLDA*); +ISC_STATUS ISC_EXPORT isc_embed_dsql_insert (ISC_STATUS ISC_FAR *, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_embed_dsql_insert(ISC_STATUS*, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_embed_dsql_prepare(ISC_STATUS*, - isc_db_handle*, - isc_tr_handle*, - const ISC_SCHAR*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - XSQLDA*); - -ISC_STATUS ISC_EXPORT isc_embed_dsql_release(ISC_STATUS*, - const ISC_SCHAR*); +void ISC_EXPORT isc_embed_dsql_length (char ISC_FAR *, + unsigned short *); +ISC_STATUS ISC_EXPORT isc_embed_dsql_prepare (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + char ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + XSQLDA ISC_FAR *); +ISC_STATUS ISC_EXPORT isc_embed_dsql_release (ISC_STATUS ISC_FAR *, + char ISC_FAR *); + /******************************/ /* Other Blob functions */ /******************************/ -BSTREAM* ISC_EXPORT BLOB_open(isc_blob_handle, - ISC_SCHAR*, - int); +BSTREAM ISC_FAR * ISC_EXPORT BLOB_open (isc_blob_handle, + char ISC_FAR *, + int); -int ISC_EXPORT BLOB_put(ISC_SCHAR, - BSTREAM*); +int ISC_EXPORT BLOB_put (char, + BSTREAM ISC_FAR *); -int ISC_EXPORT BLOB_close(BSTREAM*); +int ISC_EXPORT BLOB_close (BSTREAM ISC_FAR *); -int ISC_EXPORT BLOB_get(BSTREAM*); +int ISC_EXPORT BLOB_get (BSTREAM ISC_FAR *); -int ISC_EXPORT BLOB_display(ISC_QUAD*, - isc_db_handle, - isc_tr_handle, - const ISC_SCHAR*); +int ISC_EXPORT BLOB_display (ISC_QUAD ISC_FAR *, + isc_db_handle, + isc_tr_handle, + char ISC_FAR *); -int ISC_EXPORT BLOB_dump(ISC_QUAD*, - isc_db_handle, - isc_tr_handle, - const ISC_SCHAR*); +int ISC_EXPORT BLOB_dump (ISC_QUAD ISC_FAR *, + isc_db_handle, + isc_tr_handle, + char ISC_FAR *); -int ISC_EXPORT BLOB_edit(ISC_QUAD*, - isc_db_handle, - isc_tr_handle, - const ISC_SCHAR*); +int ISC_EXPORT BLOB_edit (ISC_QUAD ISC_FAR *, + isc_db_handle, + isc_tr_handle, + char ISC_FAR *); -int ISC_EXPORT BLOB_load(ISC_QUAD*, - isc_db_handle, - isc_tr_handle, - const ISC_SCHAR*); +int ISC_EXPORT BLOB_load (ISC_QUAD ISC_FAR *, + isc_db_handle, + isc_tr_handle, + char ISC_FAR *); -int ISC_EXPORT BLOB_text_dump(ISC_QUAD*, - isc_db_handle, - isc_tr_handle, - const ISC_SCHAR*); +int ISC_EXPORT BLOB_text_dump (ISC_QUAD ISC_FAR *, + isc_db_handle, + isc_tr_handle, + char ISC_FAR *); -int ISC_EXPORT BLOB_text_load(ISC_QUAD*, - isc_db_handle, - isc_tr_handle, - const ISC_SCHAR*); - -BSTREAM* ISC_EXPORT Bopen(ISC_QUAD*, - isc_db_handle, - isc_tr_handle, - const ISC_SCHAR*); - -/* Disabled, not found anywhere. -BSTREAM* ISC_EXPORT Bopen2(ISC_QUAD*, - isc_db_handle, - isc_tr_handle, - const ISC_SCHAR*, - unsigned short); -*/ +int ISC_EXPORT BLOB_text_load (ISC_QUAD ISC_FAR *, + isc_db_handle, + isc_tr_handle, + char ISC_FAR *); +BSTREAM ISC_FAR * ISC_EXPORT Bopen (ISC_QUAD ISC_FAR *, + isc_db_handle, + isc_tr_handle, + char ISC_FAR *); +BSTREAM ISC_FAR * ISC_EXPORT Bopen2 (ISC_QUAD ISC_FAR *, + isc_db_handle, + isc_tr_handle, + char ISC_FAR *, + unsigned short); + /******************************/ /* Other Misc functions */ /******************************/ -ISC_LONG ISC_EXPORT isc_ftof(const ISC_SCHAR*, - const unsigned short, - ISC_SCHAR*, - const unsigned short); +ISC_LONG ISC_EXPORT isc_ftof (char ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short); -ISC_STATUS ISC_EXPORT isc_print_blr(const ISC_SCHAR*, - ISC_PRINT_CALLBACK, - void*, - short); +ISC_STATUS ISC_EXPORT isc_print_blr (char ISC_FAR *, + isc_callback, + void ISC_FAR *, + short); -void ISC_EXPORT isc_set_debug(int); +void ISC_EXPORT isc_set_debug (int); -void ISC_EXPORT isc_qtoq(const ISC_QUAD*, - ISC_QUAD*); +void ISC_EXPORT isc_qtoq (ISC_QUAD ISC_FAR *, + ISC_QUAD ISC_FAR *); -void ISC_EXPORT isc_vtof(const ISC_SCHAR*, - ISC_SCHAR*, - unsigned short); +void ISC_EXPORT isc_vtof (char ISC_FAR *, + char ISC_FAR *, + unsigned short); -void ISC_EXPORT isc_vtov(const ISC_SCHAR*, - ISC_SCHAR*, - short); +void ISC_EXPORT isc_vtov (char ISC_FAR *, + char ISC_FAR *, + short); -int ISC_EXPORT isc_version(isc_db_handle*, - ISC_VERSION_CALLBACK, - void*); - -ISC_LONG ISC_EXPORT isc_reset_fpe(ISC_USHORT); - -uintptr_t ISC_EXPORT isc_baddress(ISC_SCHAR*); -void ISC_EXPORT isc_baddress_s(const ISC_SCHAR*, - uintptr_t*); +int ISC_EXPORT isc_version (isc_db_handle ISC_FAR *, + isc_callback, + void ISC_FAR *); +ISC_LONG ISC_EXPORT isc_reset_fpe (unsigned short); + /*****************************************/ /* Service manager functions */ /*****************************************/ -#define ADD_SPB_LENGTH(p, length) {*(p)++ = (length); \ - *(p)++ = (length) >> 8;} +#define ADD_SPB_LENGTH(p, length) {*(p)++ = (char) (((ISC_USHORT)length) >> 0); \ + *(p)++ = (char) (((ISC_USHORT)length) >> 8);} -#define ADD_SPB_NUMERIC(p, data) {*(p)++ = (ISC_SCHAR) (data); \ - *(p)++ = (ISC_SCHAR) ((data) >> 8); \ - *(p)++ = (ISC_SCHAR) ((data) >> 16); \ - *(p)++ = (ISC_SCHAR) ((data) >> 24);} +#define ADD_SPB_NUMERIC(p, data) {*(p)++ = (char) (((ISC_ULONG)data) >> 0); \ + *(p)++ = (char) (((ISC_ULONG)data) >> 8); \ + *(p)++ = (char) (((ISC_ULONG)data) >> 16); \ + *(p)++ = (char) (((ISC_ULONG)data) >> 24);} -ISC_STATUS ISC_EXPORT isc_service_attach(ISC_STATUS*, - unsigned short, - const ISC_SCHAR*, - isc_svc_handle*, - unsigned short, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_service_attach (ISC_STATUS ISC_FAR *, + unsigned short, + char ISC_FAR *, + isc_svc_handle ISC_FAR *, + unsigned short, + char ISC_FAR *); -ISC_STATUS ISC_EXPORT isc_service_detach(ISC_STATUS *, - isc_svc_handle *); - -ISC_STATUS ISC_EXPORT isc_service_query(ISC_STATUS*, - isc_svc_handle*, - isc_resv_handle*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - const ISC_SCHAR*, - unsigned short, - ISC_SCHAR*); - -ISC_STATUS ISC_EXPORT isc_service_start(ISC_STATUS*, - isc_svc_handle*, - isc_resv_handle*, - unsigned short, - const ISC_SCHAR*); +ISC_STATUS ISC_EXPORT isc_service_detach (ISC_STATUS ISC_FAR *, + isc_svc_handle ISC_FAR *); +ISC_STATUS ISC_EXPORT isc_service_query (ISC_STATUS ISC_FAR *, + isc_svc_handle ISC_FAR *, + isc_resv_handle ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + char ISC_FAR *, + unsigned short, + char ISC_FAR *); +ISC_STATUS ISC_EXPORT isc_service_start (ISC_STATUS ISC_FAR *, + isc_svc_handle ISC_FAR *, + isc_resv_handle ISC_FAR *, + unsigned short, + char ISC_FAR*); + /********************************/ /* Client information functions */ /********************************/ - -void ISC_EXPORT isc_get_client_version ( ISC_SCHAR *); +void ISC_EXPORT isc_get_client_version ( char ISC_FAR *); int ISC_EXPORT isc_get_client_major_version (); int ISC_EXPORT isc_get_client_minor_version (); + +/*******************************/ +/* Forms functions */ +/*******************************/ + +ISC_STATUS ISC_EXPORT isc_compile_map (ISC_STATUS ISC_FAR *, + isc_form_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_compile_menu (ISC_STATUS ISC_FAR *, + isc_form_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_compile_sub_map (ISC_STATUS ISC_FAR *, + isc_win_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_create_window (ISC_STATUS ISC_FAR *, + isc_win_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + short ISC_FAR *, + short ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_delete_window (ISC_STATUS ISC_FAR *, + isc_win_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_drive_form (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_win_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + unsigned char ISC_FAR *, + unsigned char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_drive_menu (ISC_STATUS ISC_FAR *, + isc_win_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + short ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + ISC_LONG ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_form_delete (ISC_STATUS ISC_FAR *, + isc_form_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_form_fetch (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + unsigned char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_form_insert (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + unsigned char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_get_entree (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + ISC_LONG ISC_FAR *, + short ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_initialize_menu (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_menu (ISC_STATUS ISC_FAR *, + isc_win_handle ISC_FAR *, + isc_req_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_load_form (ISC_STATUS ISC_FAR *, + isc_db_handle ISC_FAR *, + isc_tr_handle ISC_FAR *, + isc_form_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_pop_window (ISC_STATUS ISC_FAR *, + isc_win_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_put_entree (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *, + short ISC_FAR *, + char ISC_FAR *, + ISC_LONG ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_reset_form (ISC_STATUS ISC_FAR *, + isc_req_handle ISC_FAR *); + +ISC_STATUS ISC_EXPORT isc_suspend_window (ISC_STATUS ISC_FAR *, + isc_win_handle ISC_FAR *); + #ifdef __cplusplus -} /* extern "C" */ +}; #endif + +#else /* __cplusplus || __STDC__ */ + +ISC_STATUS ISC_EXPORT isc_attach_database(); +ISC_STATUS ISC_EXPORT isc_array_gen_sdl(); +ISC_STATUS ISC_EXPORT isc_array_get_slice(); +ISC_STATUS ISC_EXPORT isc_array_get_slice2(); +ISC_STATUS ISC_EXPORT isc_array_lookup_bounds(); +ISC_STATUS ISC_EXPORT isc_array_lookup_desc(); +ISC_STATUS ISC_EXPORT isc_array_set_desc(); +ISC_STATUS ISC_EXPORT isc_array_put_slice(); +ISC_STATUS ISC_EXPORT isc_array_put_slice2(); +ISC_STATUS ISC_EXPORT isc_blob_gen_bpb(); +ISC_STATUS ISC_EXPORT isc_blob_info(); +ISC_STATUS ISC_EXPORT isc_blob_lookup_desc(); +ISC_STATUS ISC_EXPORT isc_blob_set_desc(); +ISC_STATUS ISC_EXPORT isc_cancel_blob(); +ISC_STATUS ISC_EXPORT isc_cancel_events(); +ISC_STATUS ISC_EXPORT isc_close_blob(); +ISC_STATUS ISC_EXPORT isc_commit_retaining(); +ISC_STATUS ISC_EXPORT isc_commit_transaction(); +ISC_STATUS ISC_EXPORT isc_compile_request(); +ISC_STATUS ISC_EXPORT isc_compile_request2(); +ISC_STATUS ISC_EXPORT isc_create_blob(); +ISC_STATUS ISC_EXPORT isc_create_blob2(); +ISC_STATUS ISC_EXPORT isc_create_database(); +ISC_STATUS ISC_EXPORT isc_database_info(); +ISC_STATUS ISC_EXPORT isc_ddl(); +void ISC_EXPORT isc_decode_date(); +void ISC_EXPORT isc_decode_sql_date(); +void ISC_EXPORT isc_decode_sql_time(); +void ISC_EXPORT isc_decode_timestamp(); +ISC_STATUS ISC_EXPORT isc_detach_database(); +ISC_STATUS ISC_EXPORT isc_drop_database(); +void ISC_EXPORT isc_encode_date(); +void ISC_EXPORT isc_encode_sql_date(); +void ISC_EXPORT isc_encode_sql_time(); +void ISC_EXPORT isc_encode_timestamp(); +ISC_LONG ISC_EXPORT isc_event_block(); +ISC_USHORT ISC_EXPORT isc_event_block_a(); +void ISC_EXPORT isc_event_counts(); +void ISC_EXPORT isc_expand_dpb(); +int ISC_EXPORT isc_modify_dpb(); +ISC_LONG ISC_EXPORT isc_free(); +ISC_STATUS ISC_EXPORT isc_get_segment(); +ISC_STATUS ISC_EXPORT isc_get_slice(); +ISC_STATUS ISC_EXPORT isc_interprete(); +ISC_STATUS ISC_EXPORT isc_open_blob(); +ISC_STATUS ISC_EXPORT isc_open_blob2(); +ISC_STATUS ISC_EXPORT isc_prepare_transaction(); +ISC_STATUS ISC_EXPORT isc_prepare_transaction2(); +void ISC_EXPORT isc_print_sqlerror(); +ISC_STATUS ISC_EXPORT isc_print_status(); +ISC_STATUS ISC_EXPORT isc_put_segment(); +ISC_STATUS ISC_EXPORT isc_put_slice(); +ISC_STATUS ISC_EXPORT isc_que_events(); +ISC_STATUS ISC_EXPORT isc_receive(); +ISC_STATUS ISC_EXPORT isc_reconnect_transaction(); +ISC_STATUS ISC_EXPORT isc_release_request(); +ISC_STATUS ISC_EXPORT isc_release_savepoint(); +ISC_STATUS ISC_EXPORT isc_request_info(); +ISC_LONG ISC_EXPORT isc_reset_fpe (); +ISC_STATUS ISC_EXPORT isc_rollback_transaction(); +ISC_STATUS ISC_EXPORT isc_rollback_retaining(); +ISC_STATUS ISC_EXPORT isc_rollback_savepoint(); +ISC_STATUS ISC_EXPORT isc_seek_blob(); +ISC_STATUS ISC_EXPORT isc_send(); +ISC_STATUS ISC_EXPORT isc_service_attach(); +ISC_STATUS ISC_EXPORT isc_service_detach(); +ISC_STATUS ISC_EXPORT isc_service_query(); +ISC_STATUS ISC_EXPORT isc_service_start(); +ISC_STATUS ISC_EXPORT isc_start_and_send(); +ISC_STATUS ISC_EXPORT isc_start_multiple(); +ISC_STATUS ISC_EXPORT isc_start_request(); +ISC_STATUS ISC_EXPORT isc_start_savepoint(); +ISC_STATUS ISC_EXPORT isc_start_transaction(); +ISC_LONG ISC_EXPORT isc_sqlcode(); +ISC_STATUS ISC_EXPORT isc_transaction_info(); +ISC_STATUS ISC_EXPORT isc_transact_request(); +ISC_STATUS ISC_EXPORT isc_unwind_request(); +ISC_STATUS ISC_EXPORT isc_wait_for_event(); +ISC_LONG ISC_EXPORT isc_ftof(); +ISC_STATUS ISC_EXPORT isc_print_blr(); +void ISC_EXPORT isc_set_debug(); +void ISC_EXPORT isc_qtoq(); +ISC_LONG ISC_EXPORT isc_vax_integer(); +void ISC_EXPORT isc_vtof(); +void ISC_EXPORT isc_vtov(); +int ISC_EXPORT isc_version(); +#ifndef __STDC__ +/******************/ +/* Blob functions */ +/******************/ + +BSTREAM ISC_FAR * ISC_EXPORT Bopen(); +BSTREAM ISC_FAR * ISC_EXPORT BLOB_open(); +BSTREAM ISC_FAR * ISC_EXPORT Bopen2(); +#endif /* __STDC__ */ + +#endif /* __cplusplus || __STDC__ */ + /***************************************************/ /* Actions to pass to the blob filter (ctl_source) */ /***************************************************/ - #define isc_blob_filter_open 0 #define isc_blob_filter_get_segment 1 #define isc_blob_filter_close 2 @@ -1328,281 +1625,288 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_blob_filter_free 6 #define isc_blob_filter_seek 7 +/* START CONVERT TAG */ /*******************/ /* Blr definitions */ /*******************/ +/* END CONVERT TAG */ + +#ifndef _JRD_BLR_H_ + +#define blr_word(n) ((n) % 256), ((n) / 256) + +/* START CONVERT TAG */ +#define blr_text 14 +#define blr_text2 15 +#define blr_short 7 +#define blr_long 8 +#define blr_quad 9 +#define blr_int64 16 +#define blr_float 10 +#define blr_double 27 +#define blr_d_float 11 +#define blr_timestamp 35 +#define blr_varying 37 +#define blr_varying2 38 +#define blr_blob 261 +#define blr_cstring 40 +#define blr_cstring2 41 +#define blr_blob_id 45 +#define blr_sql_date 12 +#define blr_sql_time 13 +#define blr_boolean_dtype 17 -#ifndef JRD_BLR_H -#define JRD_BLR_H +/* Historical alias for pre V6 applications */ +#define blr_date blr_timestamp -#define blr_text (unsigned char)14 -#define blr_text2 (unsigned char)15 -#define blr_short (unsigned char)7 -#define blr_long (unsigned char)8 -#define blr_quad (unsigned char)9 -#define blr_float (unsigned char)10 -#define blr_double (unsigned char)27 -#define blr_d_float (unsigned char)11 -#define blr_timestamp (unsigned char)35 -#define blr_varying (unsigned char)37 -#define blr_varying2 (unsigned char)38 -#define blr_blob (unsigned short)261 -#define blr_cstring (unsigned char)40 -#define blr_cstring2 (unsigned char)41 -#define blr_blob_id (unsigned char)45 -#define blr_sql_date (unsigned char)12 -#define blr_sql_time (unsigned char)13 -#define blr_int64 (unsigned char)16 -#define blr_blob2 (unsigned char)17 -#define blr_domain_name (unsigned char)18 -#define blr_domain_name2 (unsigned char)19 -#define blr_not_nullable (unsigned char)20 +#define blr_inner 0 +#define blr_left 1 +#define blr_right 2 +#define blr_full 3 -#define blr_domain_type_of (unsigned char)0 -#define blr_domain_full (unsigned char)1 +#define blr_gds_code 0 +#define blr_sql_code 1 +#define blr_exception 2 +#define blr_trigger_code 3 +#define blr_default_code 4 -#define blr_date blr_timestamp +#define blr_immediate 0 +#define blr_deferred 1 -#define blr_inner (unsigned char)0 -#define blr_left (unsigned char)1 -#define blr_right (unsigned char)2 -#define blr_full (unsigned char)3 +#define blr_restrict 0 +#define blr_cascade 1 -#define blr_gds_code (unsigned char)0 -#define blr_sql_code (unsigned char)1 -#define blr_exception (unsigned char)2 -#define blr_trigger_code (unsigned char)3 -#define blr_default_code (unsigned char)4 -#define blr_raise (unsigned char)5 -#define blr_exception_msg (unsigned char)6 +#define blr_version4 4 +#define blr_version5 5 +#define blr_eoc 76 +#define blr_end 255 -#define blr_version4 (unsigned char)4 -#define blr_version5 (unsigned char)5 -#define blr_eoc (unsigned char)76 -#define blr_end (unsigned char)255 +#define blr_assignment 1 +#define blr_begin 2 +#define blr_dcl_variable 3 +#define blr_message 4 +#define blr_erase 5 +#define blr_fetch 6 +#define blr_for 7 +#define blr_if 8 +#define blr_loop 9 +#define blr_modify 10 +#define blr_handler 11 +#define blr_receive 12 +#define blr_select 13 +#define blr_send 14 +#define blr_store 15 +#define blr_truncate 16 +#define blr_label 17 +#define blr_leave 18 +#define blr_store2 19 +#define blr_post 20 -#define blr_assignment (unsigned char)1 -#define blr_begin (unsigned char)2 -#define blr_dcl_variable (unsigned char)3 -#define blr_message (unsigned char)4 -#define blr_erase (unsigned char)5 -#define blr_fetch (unsigned char)6 -#define blr_for (unsigned char)7 -#define blr_if (unsigned char)8 -#define blr_loop (unsigned char)9 -#define blr_modify (unsigned char)10 -#define blr_handler (unsigned char)11 -#define blr_receive (unsigned char)12 -#define blr_select (unsigned char)13 -#define blr_send (unsigned char)14 -#define blr_store (unsigned char)15 -#define blr_label (unsigned char)17 -#define blr_leave (unsigned char)18 -#define blr_store2 (unsigned char)19 -#define blr_post (unsigned char)20 -#define blr_literal (unsigned char)21 -#define blr_dbkey (unsigned char)22 -#define blr_field (unsigned char)23 -#define blr_fid (unsigned char)24 -#define blr_parameter (unsigned char)25 -#define blr_variable (unsigned char)26 -#define blr_average (unsigned char)27 -#define blr_count (unsigned char)28 -#define blr_maximum (unsigned char)29 -#define blr_minimum (unsigned char)30 -#define blr_total (unsigned char)31 +#define blr_literal 21 +#define blr_dbkey 22 +#define blr_field 23 +#define blr_fid 24 +#define blr_parameter 25 +#define blr_variable 26 +#define blr_average 27 +#define blr_count 28 +#define blr_maximum 29 +#define blr_minimum 30 +#define blr_total 31 +#define blr_add 34 +#define blr_subtract 35 +#define blr_multiply 36 +#define blr_divide 37 +#define blr_negate 38 +#define blr_concatenate 39 +#define blr_substring 40 +#define blr_parameter2 41 +#define blr_from 42 +#define blr_via 43 +#define blr_user_name 44 +#define blr_null 45 -#define blr_add (unsigned char)34 -#define blr_subtract (unsigned char)35 -#define blr_multiply (unsigned char)36 -#define blr_divide (unsigned char)37 -#define blr_negate (unsigned char)38 -#define blr_concatenate (unsigned char)39 -#define blr_substring (unsigned char)40 -#define blr_parameter2 (unsigned char)41 -#define blr_from (unsigned char)42 -#define blr_via (unsigned char)43 -#define blr_parameter2_old (unsigned char)44 -#define blr_user_name (unsigned char)44 -#define blr_null (unsigned char)45 +#define blr_eql 47 +#define blr_neq 48 +#define blr_gtr 49 +#define blr_geq 50 +#define blr_lss 51 +#define blr_leq 52 +#define blr_containing 53 +#define blr_matching 54 +#define blr_starting 55 +#define blr_between 56 +#define blr_or 57 +#define blr_and 58 +#define blr_not 59 +#define blr_any 60 +#define blr_missing 61 +#define blr_unique 62 +#define blr_like 63 +#define blr_with 64 -#define blr_equiv (unsigned char)46 -#define blr_eql (unsigned char)47 -#define blr_neq (unsigned char)48 -#define blr_gtr (unsigned char)49 -#define blr_geq (unsigned char)50 -#define blr_lss (unsigned char)51 -#define blr_leq (unsigned char)52 -#define blr_containing (unsigned char)53 -#define blr_matching (unsigned char)54 -#define blr_starting (unsigned char)55 -#define blr_between (unsigned char)56 -#define blr_or (unsigned char)57 -#define blr_and (unsigned char)58 -#define blr_not (unsigned char)59 -#define blr_any (unsigned char)60 -#define blr_missing (unsigned char)61 -#define blr_unique (unsigned char)62 -#define blr_like (unsigned char)63 +#define blr_stream 65 +#define blr_set_index 66 +#define blr_rse 67 +#define blr_first 68 +#define blr_project 69 +#define blr_sort 70 +#define blr_boolean 71 +#define blr_ascending 72 +#define blr_descending 73 +#define blr_relation 74 +#define blr_rid 75 +#define blr_union 76 +#define blr_map 77 +#define blr_group_by 78 +#define blr_aggregate 79 +#define blr_join_type 80 +#define blr_rows 81 +#define blr_derived_relation 82 -#define blr_rse (unsigned char)67 -#define blr_first (unsigned char)68 -#define blr_project (unsigned char)69 -#define blr_sort (unsigned char)70 -#define blr_boolean (unsigned char)71 -#define blr_ascending (unsigned char)72 -#define blr_descending (unsigned char)73 -#define blr_relation (unsigned char)74 -#define blr_rid (unsigned char)75 -#define blr_union (unsigned char)76 -#define blr_map (unsigned char)77 -#define blr_group_by (unsigned char)78 -#define blr_aggregate (unsigned char)79 -#define blr_join_type (unsigned char)80 +/* sub parameters for blr_rows */ -#define blr_agg_count (unsigned char)83 -#define blr_agg_max (unsigned char)84 -#define blr_agg_min (unsigned char)85 -#define blr_agg_total (unsigned char)86 -#define blr_agg_average (unsigned char)87 -#define blr_parameter3 (unsigned char)88 -#define blr_run_max (unsigned char)89 -#define blr_run_min (unsigned char)90 -#define blr_run_total (unsigned char)91 -#define blr_run_average (unsigned char)92 -#define blr_agg_count2 (unsigned char)93 -#define blr_agg_count_distinct (unsigned char)94 -#define blr_agg_total_distinct (unsigned char)95 -#define blr_agg_average_distinct (unsigned char)96 +#define blr_ties 0 +#define blr_percent 1 -#define blr_function (unsigned char)100 -#define blr_gen_id (unsigned char)101 -#define blr_prot_mask (unsigned char)102 -#define blr_upcase (unsigned char)103 -#define blr_lock_state (unsigned char)104 -#define blr_value_if (unsigned char)105 -#define blr_matching2 (unsigned char)106 -#define blr_index (unsigned char)107 -#define blr_ansi_like (unsigned char)108 +#define blr_agg_count 83 +#define blr_agg_max 84 +#define blr_agg_min 85 +#define blr_agg_total 86 +#define blr_agg_average 87 +#define blr_parameter3 88 +#define blr_run_count 118 +#define blr_run_max 89 +#define blr_run_min 90 +#define blr_run_total 91 +#define blr_run_average 92 +#define blr_agg_count2 93 +#define blr_agg_count_distinct 94 +#define blr_agg_total_distinct 95 +#define blr_agg_average_distinct 96 -#define blr_seek (unsigned char)112 +#define blr_function 100 +#define blr_gen_id 101 +#define blr_prot_mask 102 +#define blr_upcase 103 +#define blr_lock_state 104 +#define blr_value_if 105 +#define blr_matching2 106 +#define blr_index 107 +#define blr_ansi_like 108 +#define blr_bookmark 109 +#define blr_crack 110 +#define blr_force_crack 111 +#define blr_seek 112 +#define blr_find 113 -#define blr_continue (unsigned char)0 -#define blr_forward (unsigned char)1 -#define blr_backward (unsigned char)2 -#define blr_bof_forward (unsigned char)3 -#define blr_eof_backward (unsigned char)4 +#define blr_continue 0 +#define blr_forward 1 +#define blr_backward 2 +#define blr_bof_forward 3 +#define blr_eof_backward 4 -#define blr_run_count (unsigned char)118 -#define blr_rs_stream (unsigned char)119 -#define blr_exec_proc (unsigned char)120 +#define blr_lock_relation 114 +#define blr_lock_record 115 +#define blr_set_bookmark 116 +#define blr_get_bookmark 117 +#define blr_rs_stream 119 +#define blr_exec_proc 120 +#define blr_begin_range 121 +#define blr_end_range 122 +#define blr_delete_range 123 +#define blr_procedure 124 +#define blr_pid 125 +#define blr_exec_pid 126 +#define blr_singular 127 +#define blr_abort 128 +#define blr_block 129 +#define blr_error_handler 130 +#define blr_cast 131 +#define blr_release_lock 132 +#define blr_release_locks 133 +#define blr_start_savepoint 134 +#define blr_end_savepoint 135 +#define blr_find_dbkey 136 +#define blr_range_relation 137 +#define blr_delete_ranges 138 -#define blr_procedure (unsigned char)124 -#define blr_pid (unsigned char)125 -#define blr_exec_pid (unsigned char)126 -#define blr_singular (unsigned char)127 -#define blr_abort (unsigned char)128 -#define blr_block (unsigned char)129 -#define blr_error_handler (unsigned char)130 +#define blr_plan 139 +#define blr_merge 140 +#define blr_join 141 +#define blr_sequential 142 +#define blr_navigational 143 +#define blr_indices 144 +#define blr_retrieve 145 -#define blr_cast (unsigned char)131 +#define blr_relation2 146 +#define blr_rid2 147 +#define blr_reset_stream 148 +#define blr_release_bookmark 149 +#define blr_set_generator 150 +#define blr_ansi_any 151 +#define blr_exists 152 +#define blr_cardinality 153 -#define blr_start_savepoint (unsigned char)134 -#define blr_end_savepoint (unsigned char)135 +#define blr_record_version 154 /* get tid of record */ +#define blr_stall 155 /* fake server stall */ +#define blr_seek_no_warn 156 +#define blr_find_dbkey_version 157 +#define blr_ansi_all 158 -#define blr_plan (unsigned char)139 -#define blr_merge (unsigned char)140 -#define blr_join (unsigned char)141 -#define blr_sequential (unsigned char)142 -#define blr_navigational (unsigned char)143 -#define blr_indices (unsigned char)144 -#define blr_retrieve (unsigned char)145 +#define blr_extract 159 -#define blr_relation2 (unsigned char)146 -#define blr_rid2 (unsigned char)147 +/* sub parameters for blr_extract */ -#define blr_set_generator (unsigned char)150 +#define blr_extract_year 0 +#define blr_extract_month 1 +#define blr_extract_day 2 +#define blr_extract_hour 3 +#define blr_extract_minute 4 +#define blr_extract_second 5 +#define blr_extract_weekday 6 +#define blr_extract_yearday 7 -#define blr_ansi_any (unsigned char)151 -#define blr_exists (unsigned char)152 +#define blr_current_date 160 +#define blr_current_timestamp 161 +#define blr_current_time 162 -#define blr_record_version (unsigned char)154 -#define blr_stall (unsigned char)155 +/* These verbs were added in 6.0, primarily to support 64-bit integers */ -#define blr_ansi_all (unsigned char)158 +#define blr_add2 163 +#define blr_subtract2 164 +#define blr_multiply2 165 +#define blr_divide2 166 +#define blr_agg_total2 167 +#define blr_agg_total_distinct2 168 +#define blr_agg_average2 169 +#define blr_agg_average_distinct2 170 +#define blr_average2 171 +#define blr_gen_id2 172 +#define blr_set_generator2 173 -#define blr_extract (unsigned char)159 +/* These verbs were added in 7.0 for BOOLEAN dtype supprt */ +#define blr_boolean_true 174 +#define blr_boolean_false 175 -#define blr_extract_year (unsigned char)0 -#define blr_extract_month (unsigned char)1 -#define blr_extract_day (unsigned char)2 -#define blr_extract_hour (unsigned char)3 -#define blr_extract_minute (unsigned char)4 -#define blr_extract_second (unsigned char)5 -#define blr_extract_weekday (unsigned char)6 -#define blr_extract_yearday (unsigned char)7 -#define blr_extract_millisecond (unsigned char)8 -#define blr_extract_week (unsigned char)9 - -#define blr_current_date (unsigned char)160 -#define blr_current_timestamp (unsigned char)161 -#define blr_current_time (unsigned char)162 - -#define blr_post_arg (unsigned char)163 -#define blr_exec_into (unsigned char)164 -#define blr_user_savepoint (unsigned char)165 -#define blr_dcl_cursor (unsigned char)166 -#define blr_cursor_stmt (unsigned char)167 -#define blr_current_timestamp2 (unsigned char)168 -#define blr_current_time2 (unsigned char)169 -#define blr_agg_list (unsigned char)170 -#define blr_agg_list_distinct (unsigned char)171 -#define blr_modify2 (unsigned char)172 - -#define blr_current_role (unsigned char)174 -#define blr_skip (unsigned char)175 - -#define blr_exec_sql (unsigned char)176 -#define blr_internal_info (unsigned char)177 -#define blr_nullsfirst (unsigned char)178 -#define blr_writelock (unsigned char)179 -#define blr_nullslast (unsigned char)180 - -#define blr_lowcase (unsigned char)181 -#define blr_strlen (unsigned char)182 - -#define blr_strlen_bit (unsigned char)0 -#define blr_strlen_char (unsigned char)1 -#define blr_strlen_octet (unsigned char)2 - -#define blr_trim (unsigned char)183 - -#define blr_trim_both (unsigned char)0 -#define blr_trim_leading (unsigned char)1 -#define blr_trim_trailing (unsigned char)2 - -#define blr_trim_spaces (unsigned char)0 -#define blr_trim_characters (unsigned char)1 - -#define blr_savepoint_set (unsigned char)0 -#define blr_savepoint_release (unsigned char)1 -#define blr_savepoint_undo (unsigned char)2 -#define blr_savepoint_release_single (unsigned char)3 - -#define blr_cursor_open (unsigned char)0 -#define blr_cursor_close (unsigned char)1 -#define blr_cursor_fetch (unsigned char)2 - -#define blr_init_variable (unsigned char)184 -#define blr_recurse (unsigned char)185 -#define blr_sys_function (unsigned char)186 - -#endif - - -#ifndef INCLUDE_CONSTS_PUB_H -#define INCLUDE_CONSTS_PUB_H +/* These verbs were added in 7.1 for SQL savepoint support */ +#define blr_start_savepoint2 176 +#define blr_release_savepoint 177 +#define blr_rollback_savepoint 178 +/* added for EXECUTE STATEMENT in 10.0 */ +#define blr_exec_stmt 179 +#define blr_exec_stmt2 180 +/* added for CHANGE VIEW support in 12.0.1 */ +#define blr_changed 181 +#define blr_stored 182 +#define blr_modified 183 +#define blr_erased 184 +#endif /* _JRD_BLR_H_ */ + +/**********************************/ +/* Database parameter block stuff */ +/**********************************/ #define isc_dpb_version1 1 #define isc_dpb_cdd_pathname 1 @@ -1640,7 +1944,7 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dpb_online_dump 33 #define isc_dpb_old_file_size 34 #define isc_dpb_old_num_files 35 -#define isc_dpb_old_file 36 +#define isc_dpb_old_file_name 36 #define isc_dpb_old_start_page 37 #define isc_dpb_old_start_seqno 38 #define isc_dpb_old_start_file 39 @@ -1653,14 +1957,14 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dpb_wal_grp_cmt_wait 46 #define isc_dpb_lc_messages 47 #define isc_dpb_lc_ctype 48 -#define isc_dpb_cache_manager 49 -#define isc_dpb_shutdown 50 -#define isc_dpb_online 51 -#define isc_dpb_shutdown_delay 52 -#define isc_dpb_reserved 53 -#define isc_dpb_overwrite 54 -#define isc_dpb_sec_attach 55 -#define isc_dpb_disable_wal 56 +#define isc_dpb_cache_manager 49 +#define isc_dpb_shutdown 50 +#define isc_dpb_online 51 +#define isc_dpb_shutdown_delay 52 +#define isc_dpb_reserved 53 +#define isc_dpb_overwrite 54 +#define isc_dpb_sec_attach 55 +#define isc_dpb_disable_wal 56 #define isc_dpb_connect_timeout 57 #define isc_dpb_dummy_packet_interval 58 #define isc_dpb_gbak_attach 59 @@ -1670,20 +1974,33 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dpb_sql_dialect 63 #define isc_dpb_set_db_readonly 64 #define isc_dpb_set_db_sql_dialect 65 -#define isc_dpb_gfix_attach 66 -#define isc_dpb_gstat_attach 67 -#define isc_dpb_set_db_charset 68 -#define isc_dpb_gsec_attach 69 -#define isc_dpb_address_path 70 -#define isc_dpb_process_id 71 -#define isc_dpb_no_db_triggers 72 -#define isc_dpb_trusted_auth 73 -#define isc_dpb_process_name 74 +#define isc_dpb_gfix_attach 66 +#define isc_dpb_gstat_attach 67 +#define isc_dpb_gbak_ods_version 68 +#define isc_dpb_gbak_ods_minor_version 69 +#define isc_dpb_set_group_commit 70 +#define isc_dpb_gbak_validate 71 +#define isc_dpb_client_interbase_var 72 +#define isc_dpb_admin_option 73 +#define isc_dpb_flush_interval 74 +#define isc_dpb_instance_name 75 +#define isc_dpb_old_overwrite 76 +#define isc_dpb_archive_database 77 +#define isc_dpb_archive_journals 78 +#define isc_dpb_archive_sweep 79 +#define isc_dpb_archive_dumps 80 +#define isc_dpb_archive_recover 81 +#define isc_dpb_recover_until 82 +#define isc_dpb_force 83 +#define isc_dpb_preallocate 84 +#define isc_dpb_sys_encrypt_password 85 +#define isc_dpb_eua_user_name 86 +#define isc_dpb_transaction 87 /* accepts up to int64 type value */ +#define isc_dpb_ods_version_major 88 -#define isc_dpb_address 1 - -#define isc_dpb_addr_protocol 1 -#define isc_dpb_addr_endpoint 2 +/*********************************/ +/* isc_dpb_verify specific flags */ +/*********************************/ #define isc_dpb_pages 1 #define isc_dpb_records 2 @@ -1693,20 +2010,25 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dpb_repair 32 #define isc_dpb_ignore 64 -#define isc_dpb_shut_cache 0x1 -#define isc_dpb_shut_attachment 0x2 -#define isc_dpb_shut_transaction 0x4 -#define isc_dpb_shut_force 0x8 -#define isc_dpb_shut_mode_mask 0x70 +/***********************************/ +/* isc_dpb_shutdown specific flags */ +/***********************************/ -#define isc_dpb_shut_default 0x0 -#define isc_dpb_shut_normal 0x10 -#define isc_dpb_shut_multi 0x20 -#define isc_dpb_shut_single 0x30 -#define isc_dpb_shut_full 0x40 +#define isc_dpb_shut_cache 1 +#define isc_dpb_shut_attachment 2 +#define isc_dpb_shut_transaction 4 +#define isc_dpb_shut_force 8 + +/**************************************/ +/* Bit assignments in RDB$SYSTEM_FLAG */ +/**************************************/ #define RDB_system 1 #define RDB_id_assigned 2 + +/*************************************/ +/* Transaction parameter block stuff */ +/*************************************/ #define isc_tpb_version1 1 #define isc_tpb_version3 3 @@ -1724,13 +2046,19 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_tpb_verb_time 12 #define isc_tpb_commit_time 13 #define isc_tpb_ignore_limbo 14 -#define isc_tpb_read_committed 15 -#define isc_tpb_autocommit 16 -#define isc_tpb_rec_version 17 -#define isc_tpb_no_rec_version 18 -#define isc_tpb_restart_requests 19 +#define isc_tpb_read_committed 15 +#define isc_tpb_autocommit 16 +#define isc_tpb_rec_version 17 +#define isc_tpb_no_rec_version 18 +#define isc_tpb_restart_requests 19 #define isc_tpb_no_auto_undo 20 -#define isc_tpb_lock_timeout 21 +#define isc_tpb_no_savepoint 21 +#define isc_tpb_exclusivity 22 +#define isc_tpb_wait_time 23 + +/************************/ +/* Blob Parameter Block */ +/************************/ #define isc_bpb_version1 1 #define isc_bpb_source_type 1 @@ -1739,67 +2067,322 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_bpb_source_interp 4 #define isc_bpb_target_interp 5 #define isc_bpb_filter_parameter 6 -#define isc_bpb_storage 7 +#define isc_bpb_target_relation_name 7 +#define isc_bpb_target_field_name 8 -#define isc_bpb_type_segmented 0x0 -#define isc_bpb_type_stream 0x1 -#define isc_bpb_storage_main 0x0 -#define isc_bpb_storage_temp 0x2 +#define isc_bpb_type_segmented 0 +#define isc_bpb_type_stream 1 + +/*********************************/ +/* Service parameter block stuff */ +/*********************************/ #define isc_spb_version1 1 #define isc_spb_current_version 2 -#define isc_spb_version isc_spb_current_version -#define isc_spb_user_name isc_dpb_user_name +#define isc_spb_version isc_spb_current_version +#define isc_spb_user_name isc_dpb_user_name #define isc_spb_sys_user_name isc_dpb_sys_user_name #define isc_spb_sys_user_name_enc isc_dpb_sys_user_name_enc #define isc_spb_password isc_dpb_password #define isc_spb_password_enc isc_dpb_password_enc +#define isc_spb_sys_encrypt_password isc_dpb_sys_encrypt_password #define isc_spb_command_line 105 #define isc_spb_dbname 106 #define isc_spb_verbose 107 #define isc_spb_options 108 -#define isc_spb_address_path 109 -#define isc_spb_process_id 110 -#define isc_spb_trusted_auth 111 -#define isc_spb_process_name 112 +#define isc_spb_user_dbname 109 +#define isc_spb_auth_dbname 110 #define isc_spb_connect_timeout isc_dpb_connect_timeout #define isc_spb_dummy_packet_interval isc_dpb_dummy_packet_interval #define isc_spb_sql_role_name isc_dpb_sql_role_name +#define isc_spb_instance_name isc_dpb_instance_name + +/*********************************/ +/* Information call declarations */ +/*********************************/ -#define isc_action_svc_backup 1 -#define isc_action_svc_restore 2 -#define isc_action_svc_repair 3 -#define isc_action_svc_add_user 4 -#define isc_action_svc_delete_user 5 -#define isc_action_svc_modify_user 6 -#define isc_action_svc_display_user 7 -#define isc_action_svc_properties 8 -#define isc_action_svc_add_license 9 -#define isc_action_svc_remove_license 10 -#define isc_action_svc_db_stats 11 -#define isc_action_svc_get_ib_log 12 -#define isc_action_svc_get_fb_log 12 +/****************************/ +/* Common, structural codes */ +/****************************/ -#define isc_info_svc_svr_db_info 50 -#define isc_info_svc_get_license 51 -#define isc_info_svc_get_license_mask 52 -#define isc_info_svc_get_config 53 -#define isc_info_svc_version 54 -#define isc_info_svc_server_version 55 -#define isc_info_svc_implementation 56 -#define isc_info_svc_capabilities 57 -#define isc_info_svc_user_dbpath 58 -#define isc_info_svc_get_env 59 -#define isc_info_svc_get_env_lock 60 -#define isc_info_svc_get_env_msg 61 -#define isc_info_svc_line 62 -#define isc_info_svc_to_eof 63 -#define isc_info_svc_timeout 64 -#define isc_info_svc_get_licensed_users 65 -#define isc_info_svc_limbo_trans 66 -#define isc_info_svc_running 67 -#define isc_info_svc_get_users 68 +#define isc_info_end 1 +#define isc_info_truncated 2 +#define isc_info_error 3 +#define isc_info_data_not_ready 4 +#define isc_info_flag_end 127 + +/******************************/ +/* Database information items */ +/******************************/ + +#define isc_info_db_id 4 +#define isc_info_reads 5 +#define isc_info_writes 6 +#define isc_info_fetches 7 +#define isc_info_marks 8 +#define isc_info_implementation 11 +#define isc_info_version 12 +#define isc_info_base_level 13 +#define isc_info_svr_maj_ver isc_info_base_level +#define isc_info_page_size 14 +#define isc_info_num_buffers 15 +#define isc_info_limbo 16 +#define isc_info_current_memory 17 +#define isc_info_max_memory 18 +#define isc_info_window_turns 19 +#define isc_info_license 20 +#define isc_info_allocation 21 +#define isc_info_attachment_id 22 +#define isc_info_read_seq_count 23 +#define isc_info_read_idx_count 24 +#define isc_info_insert_count 25 +#define isc_info_update_count 26 +#define isc_info_delete_count 27 +#define isc_info_backout_count 28 +#define isc_info_purge_count 29 +#define isc_info_expunge_count 30 +#define isc_info_sweep_interval 31 +#define isc_info_ods_version 32 +#define isc_info_ods_minor_version 33 +#define isc_info_no_reserve 34 +#define isc_info_logfile 35 +#define isc_info_cur_logfile_name 36 +#define isc_info_cur_log_part_offset 37 +#define isc_info_num_wal_buffers 38 +#define isc_info_wal_buffer_size 39 +#define isc_info_wal_ckpt_length 40 +#define isc_info_wal_cur_ckpt_length 41 +#define isc_info_wal_prv_ckpt_fname 42 +#define isc_info_wal_prv_ckpt_poffset 43 +#define isc_info_wal_recv_ckpt_fname 44 +#define isc_info_wal_recv_ckpt_poffset 45 +#define isc_info_wal_ckpt_interval 47 +#define isc_info_wal_num_io 48 +#define isc_info_wal_avg_io_size 49 +#define isc_info_wal_num_commits 50 +#define isc_info_wal_avg_grpc_size 51 +#define isc_info_forced_writes 52 +#define isc_info_user_names 53 +#define isc_info_page_errors 54 +#define isc_info_record_errors 55 +#define isc_info_bpage_errors 56 +#define isc_info_dpage_errors 57 +#define isc_info_ipage_errors 58 +#define isc_info_ppage_errors 59 +#define isc_info_tpage_errors 60 +#define isc_info_set_page_buffers 61 +#define isc_info_db_sql_dialect 62 +#define isc_info_db_read_only 63 +#define isc_info_db_size_in_pages 64 +#define isc_info_db_reads 65 +#define isc_info_db_writes 66 +#define isc_info_db_fetches 67 +#define isc_info_db_marks 68 +#define isc_info_db_group_commit 69 +#define isc_info_att_charset 70 +#define isc_info_svr_min_ver 71 +#define isc_info_ib_env_var 72 +#define isc_info_server_tcp_port 73 +#define isc_info_db_preallocate 74 +#define isc_info_db_encrypted 75 +#define isc_info_db_encryptions 76 +#define isc_info_db_sep_external 77 +#define isc_info_db_eua_active 78 + +/**************************************/ +/* Database information return values */ +/**************************************/ + +#define isc_info_db_impl_rdb_vms 1 +#define isc_info_db_impl_rdb_eln 2 +#define isc_info_db_impl_rdb_eln_dev 3 +#define isc_info_db_impl_rdb_vms_y 4 +#define isc_info_db_impl_rdb_eln_y 5 +#define isc_info_db_impl_jri 6 +#define isc_info_db_impl_jsv 7 +#define isc_info_db_impl_isc_a 25 +#define isc_info_db_impl_isc_u 26 +#define isc_info_db_impl_isc_v 27 +#define isc_info_db_impl_isc_s 28 +#define isc_info_db_impl_isc_apl_68K 25 +#define isc_info_db_impl_isc_vax_ultr 26 +#define isc_info_db_impl_isc_vms 27 +#define isc_info_db_impl_isc_sun_68k 28 +#define isc_info_db_impl_isc_os2 29 +#define isc_info_db_impl_isc_sun4 30 +#define isc_info_db_impl_isc_hp_ux 31 +#define isc_info_db_impl_isc_sun_386i 32 +#define isc_info_db_impl_isc_vms_orcl 33 +#define isc_info_db_impl_isc_mac_aux 34 +#define isc_info_db_impl_isc_rt_aix 35 +#define isc_info_db_impl_isc_mips_ult 36 +#define isc_info_db_impl_isc_xenix 37 +#define isc_info_db_impl_isc_dg 38 +#define isc_info_db_impl_isc_hp_mpexl 39 +#define isc_info_db_impl_isc_hp_ux68K 40 +#define isc_info_db_impl_isc_sgi 41 +#define isc_info_db_impl_isc_sco_unix 42 +#define isc_info_db_impl_isc_cray 43 +#define isc_info_db_impl_isc_imp 44 +#define isc_info_db_impl_isc_delta 45 +#define isc_info_db_impl_isc_next 46 +#define isc_info_db_impl_isc_dos 47 +#define isc_info_db_impl_isc_winnt 48 +#define isc_info_db_impl_isc_epson 49 + +#define isc_info_db_class_access 1 +#define isc_info_db_class_y_valve 2 +#define isc_info_db_class_rem_int 3 +#define isc_info_db_class_rem_srvr 4 +#define isc_info_db_class_pipe_int 7 +#define isc_info_db_class_pipe_srvr 8 +#define isc_info_db_class_sam_int 9 +#define isc_info_db_class_sam_srvr 10 +#define isc_info_db_class_gateway 11 +#define isc_info_db_class_cache 12 + +/*****************************/ +/* Request information items */ +/*****************************/ + +#define isc_info_number_messages 4 +#define isc_info_max_message 5 +#define isc_info_max_send 6 +#define isc_info_max_receive 7 +#define isc_info_state 8 +#define isc_info_message_number 9 +#define isc_info_message_size 10 +#define isc_info_request_cost 11 +#define isc_info_access_path 12 +#define isc_info_req_select_count 13 +#define isc_info_req_insert_count 14 +#define isc_info_req_update_count 15 +#define isc_info_req_delete_count 16 + +/*********************/ +/* Access path items */ +/*********************/ + +#define isc_info_rsb_end 0 +#define isc_info_rsb_begin 1 +#define isc_info_rsb_type 2 +#define isc_info_rsb_relation 3 +#define isc_info_rsb_plan 4 + +/*************/ +/* Rsb types */ +/*************/ + +#define isc_info_rsb_unknown 1 +#define isc_info_rsb_indexed 2 +#define isc_info_rsb_navigate 3 +#define isc_info_rsb_sequential 4 +#define isc_info_rsb_cross 5 +#define isc_info_rsb_sort 6 +#define isc_info_rsb_first 7 +#define isc_info_rsb_boolean 8 +#define isc_info_rsb_union 9 +#define isc_info_rsb_aggregate 10 +#define isc_info_rsb_merge 11 +#define isc_info_rsb_ext_sequential 12 +#define isc_info_rsb_ext_indexed 13 +#define isc_info_rsb_ext_dbkey 14 +#define isc_info_rsb_left_cross 15 +#define isc_info_rsb_select 16 +#define isc_info_rsb_sql_join 17 +#define isc_info_rsb_simulate 18 +#define isc_info_rsb_sim_cross 19 +#define isc_info_rsb_once 20 +#define isc_info_rsb_procedure 21 + +/**********************/ +/* Bitmap expressions */ +/**********************/ + +#define isc_info_rsb_and 1 +#define isc_info_rsb_or 2 +#define isc_info_rsb_dbkey 3 +#define isc_info_rsb_index 4 + +#define isc_info_req_active 2 +#define isc_info_req_inactive 3 +#define isc_info_req_send 4 +#define isc_info_req_receive 5 +#define isc_info_req_select 6 +#define isc_info_req_sql_stall 7 + +/**************************/ +/* Blob information items */ +/**************************/ + +#define isc_info_blob_num_segments 4 +#define isc_info_blob_max_segment 5 +#define isc_info_blob_total_length 6 +#define isc_info_blob_type 7 + +/*********************************/ +/* Transaction information items */ +/*********************************/ + +#define isc_info_tra_id 4 + +/***************************** + * Service action items * + *****************************/ + +/* Range definitions for service actions. Any action outside of + this range is not supported */ +#define isc_action_min 1 + +#define isc_action_svc_backup 1 /* Starts database backup process on the server */ +#define isc_action_svc_restore 2 /* Starts database restore process on the server */ +#define isc_action_svc_repair 3 /* Starts database repair process on the server */ +#define isc_action_svc_add_user 4 /* Adds a new user to the security database */ +#define isc_action_svc_delete_user 5 /* Deletes a user record from the security database */ +#define isc_action_svc_modify_user 6 /* Modifies a user record in the security database */ +#define isc_action_svc_display_user 7 /* Displays a user record from the security database */ +#define isc_action_svc_properties 8 /* Sets database properties */ +#define isc_action_svc_add_license 9 /* Adds a license to the license file */ +#define isc_action_svc_remove_license 10 /* Removes a license from the license file */ +#define isc_action_svc_db_stats 11 /* Retrieves database statistics */ +#define isc_action_svc_get_ib_log 12 /* Retrieves the InterBase log file from the server */ +#define isc_action_svc_add_db_alias 13 /* Adds a new database alias */ +#define isc_action_svc_delete_db_alias 14 /* Deletes an existing database alias */ +#define isc_action_svc_display_db_alias 15 /* Displays an existing database alias */ +#define isc_action_svc_dump 16 /* Starts database dump process on the server */ + +#define isc_action_max 17 /* 1 more than above actions */ + +/***************************** + * Service information items * + *****************************/ + +#define isc_info_svc_svr_db_info 50 /* Retrieves the number of attachments and databases */ +#define isc_info_svc_get_license 51 /* Retrieves all license keys and IDs from the license file */ +#define isc_info_svc_get_license_mask 52 /* Retrieves a bitmask representing licensed options on the server */ +#define isc_info_svc_get_config 53 /* Retrieves the parameters and values for IB_CONFIG */ +#define isc_info_svc_version 54 /* Retrieves the version of the services manager */ +#define isc_info_svc_server_version 55 /* Retrieves the version of the InterBase server */ +#define isc_info_svc_implementation 56 /* Retrieves the implementation of the InterBase server */ +#define isc_info_svc_capabilities 57 /* Retrieves a bitmask representing the server's capabilities */ +#define isc_info_svc_user_dbpath 58 /* Retrieves the path to the security database in use by the server */ +#define isc_info_svc_get_env 59 /* Retrieves the setting of $INTERBASE */ +#define isc_info_svc_get_env_lock 60 /* Retrieves the setting of $INTERBASE_LCK */ +#define isc_info_svc_get_env_msg 61 /* Retrieves the setting of $INTERBASE_MSG */ +#define isc_info_svc_line 62 /* Retrieves 1 line of service output per call */ +#define isc_info_svc_to_eof 63 /* Retrieves as much of the server output as will fit in the supplied buffer */ +#define isc_info_svc_timeout 64 /* Sets / signifies a timeout value for reading service information */ +#define isc_info_svc_get_licensed_users 65 /* Retrieves the number of users licensed for accessing the server */ +#define isc_info_svc_limbo_trans 66 /* Retrieve the limbo transactions */ +#define isc_info_svc_running 67 /* Checks to see if a service is running on an attachment */ +#define isc_info_svc_get_users 68 /* Returns the user information from isc_action_svc_display_users */ +#define isc_info_svc_get_db_alias 69 /* Returns the database alias information from isc_action_svc_display_db_alias */ +#define isc_info_svc_product_identifier 70 /* Returns embedding application's product identifier, if present in license */ + +/****************************************************** + * Parameters for isc_action_{add|delete|modify)_user * + ******************************************************/ #define isc_spb_sec_userid 5 #define isc_spb_sec_groupid 6 @@ -1810,13 +2393,123 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_spb_sec_middlename 11 #define isc_spb_sec_lastname 12 +/****************************************************** + * Parameters for isc_action_{add|delete|display)_db_alias * + ******************************************************/ + +#define isc_spb_sec_db_alias_name 20 +#define isc_spb_sec_db_alias_dbpath 21 + +/******************************************************* + * Parameters for isc_action_svc_(add|remove)_license, * + * isc_info_svc_get_license * + *******************************************************/ + #define isc_spb_lic_key 5 #define isc_spb_lic_id 6 #define isc_spb_lic_desc 7 -#define isc_spb_bkp_file 5 +/* Parameters for isc_action_svc_properties and isc_action_svc_repair + * share the same namespace; assign values without colliding. + * Options below need to be uniquely identified + * + * Compatible "standalone options" below must be combined together (bit-wise OR), + * and provided as a single value to isc_spb_options + */ +/******************************************** + * Parameters for isc_action_svc_properties * + ********************************************/ + +/* options needing values... */ +#define isc_spb_prp_page_buffers 5 +#define isc_spb_prp_sweep_interval 6 +#define isc_spb_prp_shutdown_db 7 +#define isc_spb_prp_deny_new_attachments 9 +#define isc_spb_prp_deny_new_transactions 10 +#define isc_spb_prp_reserve_space 11 +#define isc_spb_prp_write_mode 12 +#define isc_spb_prp_access_mode 13 +#define isc_spb_prp_set_sql_dialect 14 +#define isc_spb_prp_archive_dumps 42 +#define isc_spb_prp_archive_sweep 43 +/* standalone options for setting property operation... */ +#define isc_spb_prp_activate 0x0100 +#define isc_spb_prp_db_online 0x0200 + +/******************************************** + * Parameters for isc_spb_prp_reserve_space * + ********************************************/ + +#define isc_spb_prp_res_use_full 35 +#define isc_spb_prp_res 36 + +/****************************************** + * Parameters for isc_spb_prp_write_mode * + ******************************************/ + +#define isc_spb_prp_wm_async 37 +#define isc_spb_prp_wm_sync 38 +#define isc_spb_prp_wm_direct 41 + +/****************************************** + * Parameters for isc_spb_prp_access_mode * + ******************************************/ + +#define isc_spb_prp_am_readonly 39 +#define isc_spb_prp_am_readwrite 40 + +/***************************************** + * Parameters for isc_action_svc_repair * + *****************************************/ + +/* options needing values... */ +#define isc_spb_rpr_commit_trans 15 +#define isc_spb_rpr_rollback_trans 34 +#define isc_spb_rpr_recover_two_phase 17 +#define isc_spb_tra_id 18 +#define isc_spb_single_tra_id 19 +#define isc_spb_multi_tra_id 20 +#define isc_spb_tra_state 21 +#define isc_spb_tra_state_limbo 22 +#define isc_spb_tra_state_commit 23 +#define isc_spb_tra_state_rollback 24 +#define isc_spb_tra_state_unknown 25 +#define isc_spb_tra_host_site 26 +#define isc_spb_tra_remote_site 27 +#define isc_spb_tra_db_path 28 +#define isc_spb_tra_advise 29 +#define isc_spb_tra_advise_commit 30 +#define isc_spb_tra_advise_rollback 31 +#define isc_spb_tra_advise_unknown 33 + +/* standalone options for repair operation... */ +#define isc_spb_rpr_validate_db 0x01 +#define isc_spb_rpr_sweep_db 0x02 +#define isc_spb_rpr_mend_db 0x04 +#define isc_spb_rpr_list_limbo_trans 0x08 +#define isc_spb_rpr_check_db 0x10 +#define isc_spb_rpr_ignore_checksum 0x20 +#define isc_spb_rpr_kill_shadows 0x40 +#define isc_spb_rpr_full 0x80 + + +/* Backup, Restore, Dump and Archive operations share a lot of options. + * Options below need to be uniquely identified. + * + * Compatible "standalone options" below must be combined together (bit-wise OR), + * and provided as a single value to isc_spb_options + */ +/***************************************** + * Parameters for isc_action_svc_backup * + *****************************************/ + +/* options needing values... */ +#define isc_spb_bkp_file 5 #define isc_spb_bkp_factor 6 #define isc_spb_bkp_length 7 +#define isc_spb_bkp_preallocate 13 +#define isc_spb_bkp_encrypt_name 14 +/* standalone options for backup operation... */ #define isc_spb_bkp_ignore_checksums 0x01 #define isc_spb_bkp_ignore_limbo 0x02 #define isc_spb_bkp_metadata_only 0x04 @@ -1824,87 +2517,235 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_spb_bkp_old_descriptions 0x10 #define isc_spb_bkp_non_transportable 0x20 #define isc_spb_bkp_convert 0x40 -#define isc_spb_bkp_expand 0x80 +#define isc_spb_bkp_expand 0x80 +/* standalone options for Archive backup operation... */ +#define isc_spb_bkp_archive_database 0x010000 +#define isc_spb_bkp_archive_journals 0x020000 -#define isc_spb_prp_page_buffers 5 -#define isc_spb_prp_sweep_interval 6 -#define isc_spb_prp_shutdown_db 7 -#define isc_spb_prp_deny_new_attachments 9 -#define isc_spb_prp_deny_new_transactions 10 -#define isc_spb_prp_reserve_space 11 -#define isc_spb_prp_write_mode 12 -#define isc_spb_prp_access_mode 13 -#define isc_spb_prp_set_sql_dialect 14 -#define isc_spb_prp_activate 0x0100 -#define isc_spb_prp_db_online 0x0200 +/***************************************** + * Parameters for isc_action_svc_restore * + *****************************************/ -#define isc_spb_prp_res_use_full 35 -#define isc_spb_prp_res 36 +/* options needing values... */ +#define isc_spb_res_buffers 9 +#define isc_spb_res_page_size 10 +#define isc_spb_res_length 11 +#define isc_spb_res_access_mode 12 +#define isc_spb_res_preallocate isc_spb_bkp_preallocate +#define isc_spb_res_decrypt_password 16 +#define isc_spb_res_eua_user_name 17 +#define isc_spb_res_eua_password 18 +#define isc_spb_res_write_mode 19 +#define isc_spb_res_starting_trans 21 /* requires 64bit integer value */ +#define isc_spb_res_ods_version_major 22 +#define isc_spb_res_archive_recover_until 23 +/* standalone options for restore operation... */ +#define isc_spb_res_deactivate_idx 0x0100 +#define isc_spb_res_no_shadow 0x0200 +#define isc_spb_res_no_validity 0x0400 +#define isc_spb_res_one_at_a_time 0x0800 +#define isc_spb_res_replace 0x1000 +#define isc_spb_res_create 0x2000 +#define isc_spb_res_use_all_space 0x4000 +#define isc_spb_res_validate 0x8000 +/* standalone options for Archive recover operation... */ +#define isc_spb_res_archive_recover 0x040000 -#define isc_spb_prp_wm_async 37 -#define isc_spb_prp_wm_sync 38 +/***************************************** + * Parameters for isc_action_svc_dump * + *****************************************/ -#define isc_spb_prp_am_readonly 39 -#define isc_spb_prp_am_readwrite 40 +/* options needing values... */ +#define isc_spb_dmp_file isc_spb_bkp_file +#define isc_spb_dmp_length isc_spb_bkp_length +#define isc_spb_dmp_overwrite 20 /* special case; does not require any values. */ +/* standalone options for dump operation... */ +#define isc_spb_dmp_create 0x080000 -#define isc_spb_rpr_commit_trans 15 -#define isc_spb_rpr_rollback_trans 34 -#define isc_spb_rpr_recover_two_phase 17 -#define isc_spb_tra_id 18 -#define isc_spb_single_tra_id 19 -#define isc_spb_multi_tra_id 20 -#define isc_spb_tra_state 21 -#define isc_spb_tra_state_limbo 22 -#define isc_spb_tra_state_commit 23 -#define isc_spb_tra_state_rollback 24 -#define isc_spb_tra_state_unknown 25 -#define isc_spb_tra_host_site 26 -#define isc_spb_tra_remote_site 27 -#define isc_spb_tra_db_path 28 -#define isc_spb_tra_advise 29 -#define isc_spb_tra_advise_commit 30 -#define isc_spb_tra_advise_rollback 31 -#define isc_spb_tra_advise_unknown 33 +/****************************************** + * Parameters for isc_spb_res_access_mode * + ******************************************/ -#define isc_spb_rpr_validate_db 0x01 -#define isc_spb_rpr_sweep_db 0x02 -#define isc_spb_rpr_mend_db 0x04 -#define isc_spb_rpr_list_limbo_trans 0x08 -#define isc_spb_rpr_check_db 0x10 -#define isc_spb_rpr_ignore_checksum 0x20 -#define isc_spb_rpr_kill_shadows 0x40 -#define isc_spb_rpr_full 0x80 +#define isc_spb_res_am_readonly isc_spb_prp_am_readonly +#define isc_spb_res_am_readwrite isc_spb_prp_am_readwrite -#define isc_spb_res_buffers 9 -#define isc_spb_res_page_size 10 -#define isc_spb_res_length 11 -#define isc_spb_res_access_mode 12 -#define isc_spb_res_deactivate_idx 0x0100 -#define isc_spb_res_no_shadow 0x0200 -#define isc_spb_res_no_validity 0x0400 -#define isc_spb_res_one_at_a_time 0x0800 -#define isc_spb_res_replace 0x1000 -#define isc_spb_res_create 0x2000 -#define isc_spb_res_use_all_space 0x4000 +/****************************************** + * Parameters for isc_spb_res_write_mode * + ******************************************/ -#define isc_spb_res_am_readonly isc_spb_prp_am_readonly -#define isc_spb_res_am_readwrite isc_spb_prp_am_readwrite +#define isc_spb_res_wm_async isc_spb_prp_wm_async +#define isc_spb_res_wm_sync isc_spb_prp_wm_sync +#define isc_spb_res_wm_direct isc_spb_prp_wm_direct -#define isc_spb_num_att 5 -#define isc_spb_num_db 6 +/******************************************* + * Parameters for isc_info_svc_svr_db_info * + *******************************************/ -#define isc_spb_sts_data_pages 0x01 -#define isc_spb_sts_db_log 0x02 -#define isc_spb_sts_hdr_pages 0x04 -#define isc_spb_sts_idx_pages 0x08 -#define isc_spb_sts_sys_relations 0x10 -#define isc_spb_sts_record_versions 0x20 -#define isc_spb_sts_table 0x40 -#define isc_spb_sts_nocreation 0x80 +#define isc_spb_num_att 5 +#define isc_spb_num_db 6 + +/***************************************** + * Parameters for isc_action_svc_db_stats * + *****************************************/ + +#define isc_spb_sts_data_pages 0x01 +#define isc_spb_sts_db_log 0x02 +#define isc_spb_sts_hdr_pages 0x04 +#define isc_spb_sts_idx_pages 0x08 +#define isc_spb_sts_sys_relations 0x10 +#define isc_spb_sts_record_versions 0x20 +#define isc_spb_sts_table 0x40 + +/*************************/ +/* SQL information items */ +/*************************/ + +#define isc_info_sql_select 4 +#define isc_info_sql_bind 5 +#define isc_info_sql_num_variables 6 +#define isc_info_sql_describe_vars 7 +#define isc_info_sql_describe_end 8 +#define isc_info_sql_sqlda_seq 9 +#define isc_info_sql_message_seq 10 +#define isc_info_sql_type 11 +#define isc_info_sql_sub_type 12 +#define isc_info_sql_scale 13 +#define isc_info_sql_length 14 +#define isc_info_sql_null_ind 15 +#define isc_info_sql_field 16 +#define isc_info_sql_relation 17 +#define isc_info_sql_owner 18 +#define isc_info_sql_alias 19 +#define isc_info_sql_sqlda_start 20 +#define isc_info_sql_stmt_type 21 +#define isc_info_sql_get_plan 22 +#define isc_info_sql_records 23 +#define isc_info_sql_batch_fetch 24 +#define isc_info_sql_precision 25 + +/*********************************/ +/* SQL information return values */ +/*********************************/ + +#define isc_info_sql_stmt_select 1 +#define isc_info_sql_stmt_insert 2 +#define isc_info_sql_stmt_update 3 +#define isc_info_sql_stmt_delete 4 +#define isc_info_sql_stmt_ddl 5 +#define isc_info_sql_stmt_get_segment 6 +#define isc_info_sql_stmt_put_segment 7 +#define isc_info_sql_stmt_exec_procedure 8 +#define isc_info_sql_stmt_start_trans 9 +#define isc_info_sql_stmt_commit 10 +#define isc_info_sql_stmt_rollback 11 +#define isc_info_sql_stmt_select_for_upd 12 +#define isc_info_sql_stmt_set_generator 13 +#define isc_info_sql_stmt_set_password 14 +#define isc_info_sql_stmt_set_subscription 15 +#define isc_info_sql_stmt_truncate 16 + +/***********************************/ +/* Server configuration key values */ +/***********************************/ + +#define ISCCFG_LOCKMEM_KEY 0 +#define ISCCFG_LOCKSEM_KEY 1 +#define ISCCFG_LOCKSIG_KEY 2 +#define ISCCFG_EVNTMEM_KEY 3 +#define ISCCFG_DBCACHE_KEY 4 +#define ISCCFG_PRIORITY_KEY 5 +#define ISCCFG_IPCMAP_KEY 6 +#define ISCCFG_MEMMIN_KEY 7 +#define ISCCFG_MEMMAX_KEY 8 +#define ISCCFG_LOCKORDER_KEY 9 +#define ISCCFG_ANYLOCKMEM_KEY 10 +#define ISCCFG_ANYLOCKSEM_KEY 11 +#define ISCCFG_ANYLOCKSIG_KEY 12 +#define ISCCFG_ANYEVNTMEM_KEY 13 +#define ISCCFG_LOCKHASH_KEY 14 +#define ISCCFG_DEADLOCK_KEY 15 +#define ISCCFG_LOCKSPIN_KEY 16 +#define ISCCFG_CONN_TIMEOUT_KEY 17 +#define ISCCFG_DUMMY_INTRVL_KEY 18 +#define ISCCFG_TRACE_POOLS_KEY 19 /* Internal Use only */ +#define ISCCFG_REMOTE_BUFFER_KEY 20 +#define ISCCFG_CPU_AFFINITY_KEY 21 +#define ISCCFG_SWEEP_QUANTUM_KEY 22 +#define ISCCFG_USER_QUANTUM_KEY 23 +#define ISCCFG_SLEEP_TIME_KEY 24 +#define ISCCFG_MAX_THREADS_KEY 25 +#define ISCCFG_ADMIN_DB_KEY 26 +#define ISCCFG_USE_SANCTUARY_KEY 27 +#define ISCCFG_ENABLE_HT_KEY 28 +#define ISCCFG_USE_ROUTER_KEY 29 +#define ISCCFG_SORTMEM_BUFFER_SIZE_KEY 30 +#define ISCCFG_SQL_CMP_RECURSION_KEY 31 +#define ISCCFG_SOL_BOUND_THREADS_KEY 32 +#define ISCCFG_SOL_SYNC_SCOPE_KEY 33 +#define ISCCFG_IDX_RECNUM_MARKER_KEY 34 +#define ISCCFG_IDX_GARBAGE_COLLECTION_KEY 35 +#define ISCCFG_WIN_LOCAL_CONNECT_RETRIES_KEY 36 +#define ISCCFG_EXPAND_MOUNTPOINT_KEY 37 +#define ISCCFG_LOOPBACK_CONNECTION_KEY 38 +#define ISCCFG_THREAD_STACK_SIZE_KEY 39 +#define ISCCFG_MAX_DB_VIRMEM_USE_KEY 40 +#define ISCCFG_MAX_ASSISTANTS_KEY 41 +#define ISCCFG_APPDATA_DIR_KEY 42 +#define ISCCFG_MEMORY_RECLAMATION_KEY 43 +#define ISCCFG_PAGE_CACHE_EXPANSION_KEY 44 +#define ISCCFG_STARTING_TRANSACTION_ID_KEY 45 /* Used internally to test 64-bit transaction ID */ +#define ISCCFG_DATABASE_ODS_VERSION_KEY 46 /* Used internally to test creating databases with older ODS versions */ +#define ISCCFG_HOSTLIC_IMPORT_DIR_KEY 47 +#define ISCCFG_HOSTLIC_INFO_DIR_KEY 48 + + +/***************/ +/* Error codes */ +/***************/ + +#define isc_facility 20 +/* END CONVERT TAG */ +/* START CONVERT TAG Define as long */ +#define isc_err_base 335544320L +/* END CONVERT TAG */ +/* START CONVERT TAG */ +#define isc_err_factor 1 +#define isc_arg_end 0 +#define isc_arg_gds 1 +#define isc_arg_string 2 +#define isc_arg_cstring 3 +#define isc_arg_number 4 +#define isc_arg_interpreted 5 +#define isc_arg_vms 6 +#define isc_arg_unix 7 +#define isc_arg_domain 8 +#define isc_arg_dos 9 +#define isc_arg_mpexl 10 +#define isc_arg_mpexl_ipc 11 +#define isc_arg_next_mach 15 +#define isc_arg_netware 16 +#define isc_arg_win32 17 +#define isc_arg_warning 18 +#define isc_arg_sql 19 +#define isc_arg_int64 20 + +#include + +/**********************************************/ +/* Dynamic Data Definition Language operators */ +/**********************************************/ + +/******************/ +/* Version number */ +/******************/ #define isc_dyn_version_1 1 #define isc_dyn_eoc 255 +/******************************/ +/* Operations (may be nested) */ +/******************************/ + #define isc_dyn_begin 2 #define isc_dyn_end 3 #define isc_dyn_if 4 @@ -1925,16 +2766,26 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_def_shadow 34 #define isc_dyn_def_trigger_msg 17 #define isc_dyn_def_file 36 +#define isc_dyn_def_user 225 +#define isc_dyn_def_journal 203 +#define isc_dyn_def_archive 206 +#define isc_dyn_def_encryption 150 +#define isc_dyn_def_subscription 160 +#define isc_dyn_set_subscription 161 #define isc_dyn_mod_database 39 #define isc_dyn_mod_rel 11 #define isc_dyn_mod_global_fld 13 #define isc_dyn_mod_idx 102 #define isc_dyn_mod_local_fld 14 -#define isc_dyn_mod_sql_fld 216 +#define isc_dyn_mod_sql_fld 216 #define isc_dyn_mod_view 16 #define isc_dyn_mod_security_class 122 #define isc_dyn_mod_trigger 113 #define isc_dyn_mod_trigger_msg 28 +#define isc_dyn_mod_user 226 +#define isc_dyn_mod_journal 204 +#define isc_dyn_mod_archive 207 +#define isc_dyn_mod_encryption 151 #define isc_dyn_delete_database 18 #define isc_dyn_delete_rel 19 #define isc_dyn_delete_global_fld 20 @@ -1946,7 +2797,13 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_delete_trigger_msg 29 #define isc_dyn_delete_filter 32 #define isc_dyn_delete_function 33 +#define isc_dyn_delete_generator 217 #define isc_dyn_delete_shadow 35 +#define isc_dyn_delete_user 227 +#define isc_dyn_delete_journal 205 +#define isc_dyn_delete_archive 208 +#define isc_dyn_delete_encryption 152 +#define isc_dyn_delete_subscription 172 #define isc_dyn_grant 30 #define isc_dyn_revoke 31 #define isc_dyn_def_primary_key 37 @@ -1957,16 +2814,17 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_def_parameter 135 #define isc_dyn_delete_parameter 136 #define isc_dyn_mod_procedure 175 - +#define isc_dyn_def_log_file 176 #define isc_dyn_def_exception 181 #define isc_dyn_mod_exception 182 #define isc_dyn_del_exception 183 +#define isc_dyn_def_default_log 202 +#define isc_dyn_sys_encrypt_passwd 200 +#define isc_dyn_set_password 201 -#define isc_dyn_def_difference 220 -#define isc_dyn_drop_difference 221 -#define isc_dyn_begin_backup 222 -#define isc_dyn_end_backup 223 -#define isc_dyn_debug_info 240 +/***********************/ +/* View specific stuff */ +/***********************/ #define isc_dyn_view_blr 43 #define isc_dyn_view_source 44 @@ -1974,18 +2832,30 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_view_context 46 #define isc_dyn_view_context_name 47 +/**********************/ +/* Generic attributes */ +/**********************/ + #define isc_dyn_rel_name 50 #define isc_dyn_fld_name 51 -#define isc_dyn_new_fld_name 215 +#define isc_dyn_new_fld_name 215 #define isc_dyn_idx_name 52 #define isc_dyn_description 53 #define isc_dyn_security_class 54 #define isc_dyn_system_flag 55 #define isc_dyn_update_flag 56 +#define isc_dyn_enc_name 57 +#define isc_dyn_sub_name 162 #define isc_dyn_prc_name 166 #define isc_dyn_prm_name 137 #define isc_dyn_sql_object 196 #define isc_dyn_fld_character_set_name 174 +#define isc_dyn_reserve_space 195 +#define isc_dyn_restrict_or_cascade 220 + +/********************************/ +/* Relation specific attributes */ +/********************************/ #define isc_dyn_rel_dbkey_length 61 #define isc_dyn_rel_store_trig 62 @@ -1998,10 +2868,12 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_rel_sql_protection 69 #define isc_dyn_rel_constraint 162 #define isc_dyn_delete_rel_constraint 163 +#define isc_dyn_rel_sql_scope 218 +#define isc_dyn_rel_sql_on_commit 219 -#define isc_dyn_rel_temporary 238 -#define isc_dyn_rel_temp_global_preserve 1 -#define isc_dyn_rel_temp_global_delete 2 +/************************************/ +/* Global field specific attributes */ +/************************************/ #define isc_dyn_fld_type 70 #define isc_dyn_fld_length 71 @@ -2026,19 +2898,36 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_del_default 197 #define isc_dyn_del_validation 198 #define isc_dyn_single_validation 199 +#define isc_dyn_fld_encrypt 200 +#define isc_dyn_fld_decrypt_dflt_value 201 +#define isc_dyn_fld_decrypt_dflt_source 202 #define isc_dyn_fld_character_set 203 +/***********************************/ +/* Local field specific attributes */ +/***********************************/ + +#define isc_dyn_fld_derived 89 #define isc_dyn_fld_source 90 #define isc_dyn_fld_base_fld 91 #define isc_dyn_fld_position 92 #define isc_dyn_fld_update_flag 93 +#define isc_dyn_fld_all 94 + +/*****************************/ +/* Index specific attributes */ +/*****************************/ #define isc_dyn_idx_unique 100 #define isc_dyn_idx_inactive 101 #define isc_dyn_idx_type 103 #define isc_dyn_idx_foreign_key 104 #define isc_dyn_idx_ref_column 105 -#define isc_dyn_idx_statistic 204 +#define isc_dyn_idx_statistic 204 + +/*******************************/ +/* Trigger specific attributes */ +/*******************************/ #define isc_dyn_trg_type 110 #define isc_dyn_trg_blr 111 @@ -2049,25 +2938,61 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_trg_msg_number 117 #define isc_dyn_trg_msg 118 +/**************************************/ +/* Security Class specific attributes */ +/**************************************/ + #define isc_dyn_scl_acl 121 #define isc_dyn_grant_user 130 -#define isc_dyn_grant_user_explicit 219 #define isc_dyn_grant_proc 186 #define isc_dyn_grant_trig 187 #define isc_dyn_grant_view 188 #define isc_dyn_grant_options 132 #define isc_dyn_grant_user_group 205 -#define isc_dyn_grant_role 218 + + +/**********************************/ +/* Dimension specific information */ +/**********************************/ #define isc_dyn_dim_lower 141 #define isc_dyn_dim_upper 142 +/****************************/ +/* File specific attributes */ +/****************************/ + #define isc_dyn_file_name 125 #define isc_dyn_file_start 126 #define isc_dyn_file_length 127 #define isc_dyn_shadow_number 128 #define isc_dyn_shadow_man_auto 129 #define isc_dyn_shadow_conditional 130 +#define isc_dyn_file_prealloc 131 + +/********************************/ +/* Log file specific attributes */ +/********************************/ + +#define isc_dyn_log_file_sequence 177 +#define isc_dyn_log_file_partitions 178 +#define isc_dyn_log_file_serial 179 +#define isc_dyn_log_file_directory 200 +#define isc_dyn_log_file_raw 201 + +/***************************/ +/* Log specific attributes */ +/***************************/ + +#define isc_dyn_log_check_point_interval 189 +#define isc_dyn_log_buffer_size 190 +#define isc_dyn_log_check_point_length 191 +#define isc_dyn_log_num_of_buffers 192 +#define isc_dyn_log_timestamp_name 193 + +/********************************/ +/* Function specific attributes */ +/********************************/ #define isc_dyn_function_name 145 #define isc_dyn_function_type 146 @@ -2079,35 +3004,64 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_filter_in_subtype 152 #define isc_dyn_filter_out_subtype 153 -#define isc_dyn_description2 154 -#define isc_dyn_fld_computed_source2 155 -#define isc_dyn_fld_edit_string2 156 -#define isc_dyn_fld_query_header2 157 -#define isc_dyn_fld_validation_source2 158 -#define isc_dyn_trg_msg2 159 -#define isc_dyn_trg_source2 160 -#define isc_dyn_view_source2 161 -#define isc_dyn_xcp_msg2 184 + +#define isc_dyn_description2 154 +#define isc_dyn_fld_computed_source2 155 +#define isc_dyn_fld_edit_string2 156 +#define isc_dyn_fld_query_header2 157 +#define isc_dyn_fld_validation_source2 158 +#define isc_dyn_trg_msg2 159 +#define isc_dyn_trg_source2 160 +#define isc_dyn_view_source2 161 +#define isc_dyn_xcp_msg2 184 + +/*********************************/ +/* Generator specific attributes */ +/*********************************/ #define isc_dyn_generator_name 95 #define isc_dyn_generator_id 96 +/*********************************/ +/* Procedure specific attributes */ +/*********************************/ + #define isc_dyn_prc_inputs 167 #define isc_dyn_prc_outputs 168 #define isc_dyn_prc_source 169 #define isc_dyn_prc_blr 170 #define isc_dyn_prc_source2 171 -#define isc_dyn_prc_type 239 -#define isc_dyn_prc_t_selectable 1 -#define isc_dyn_prc_t_executable 2 +/*********************************/ +/* Parameter specific attributes */ +/*********************************/ #define isc_dyn_prm_number 138 #define isc_dyn_prm_type 139 -#define isc_dyn_prm_mechanism 241 + +/********************************/ +/* Relation specific attributes */ +/********************************/ #define isc_dyn_xcp_msg 185 +/********************************/ +/* Subscription specific attributes */ +/********************************/ + +#define isc_dyn_change_type 163 +#define isc_dyn_insert 165 +#define isc_dyn_update 166 +#define isc_dyn_delete 167 +#define isc_dyn_change 168 +#define isc_dyn_sub_active 169 +#define isc_dyn_sub_inactive 170 +#define isc_dyn_sub_dest 171 +#define isc_dyn_sub_rel_counter 172 + +/**********************************************/ +/* Cascading referential integrity values */ +/**********************************************/ #define isc_dyn_foreign_key_update 205 #define isc_dyn_foreign_key_delete 206 #define isc_dyn_foreign_key_cascade 207 @@ -2115,31 +3069,76 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_dyn_foreign_key_null 209 #define isc_dyn_foreign_key_none 210 +/***********************/ +/* SQL role values */ +/***********************/ #define isc_dyn_def_sql_role 211 #define isc_dyn_sql_role_name 212 #define isc_dyn_grant_admin_options 213 #define isc_dyn_del_sql_role 214 -#define isc_dyn_delete_generator 217 +/***********************/ +/* ADMIN OPTION values */ +/***********************/ +#define isc_dyn_add_admin 221 +#define isc_dyn_drop_admin 222 +#define isc_dyn_admin_active 223 +#define isc_dyn_admin_inactive 224 -#define isc_dyn_mod_function 224 -#define isc_dyn_mod_filter 225 -#define isc_dyn_mod_generator 226 -#define isc_dyn_mod_sql_role 227 -#define isc_dyn_mod_charset 228 -#define isc_dyn_mod_collation 229 -#define isc_dyn_mod_prc_parameter 230 +/****************************/ +/* User specific attributes */ +/****************************/ +#define isc_dyn_user_sys_name 11 +#define isc_dyn_user_grp_name 12 +#define isc_dyn_user_uid 13 +#define isc_dyn_user_gid 14 +#define isc_dyn_user_password 15 +#define isc_dyn_user_active 16 +#define isc_dyn_user_inactive 17 +#define isc_dyn_user_description 18 +#define isc_dyn_user_first_name 19 +#define isc_dyn_user_middle_name 20 +#define isc_dyn_user_last_name 21 +#define isc_dyn_user_default_role 22 -#define isc_dyn_def_collation 231 -#define isc_dyn_coll_for_charset 232 -#define isc_dyn_coll_from 233 -#define isc_dyn_coll_from_external 239 -#define isc_dyn_coll_attribute 234 -#define isc_dyn_coll_specific_attributes_charset 235 -#define isc_dyn_coll_specific_attributes 236 -#define isc_dyn_del_collation 237 +/****************************/ +/* Database specific attributes */ +/****************************/ +#define isc_dyn_db_passwd_digest 37 +#define isc_dyn_db_page_all_checksum 38 +#define isc_dyn_db_page_enc_checksum 39 +#define isc_dyn_db_page_off_checksum 40 +#define isc_dyn_db_page_cache 41 +#define isc_dyn_db_proc_cache 42 +#define isc_dyn_db_rel_cache 43 +#define isc_dyn_db_trig_cache 44 +#define isc_dyn_db_flush_int 45 +#define isc_dyn_db_linger_int 46 +#define isc_dyn_db_reclaim_int 47 +#define isc_dyn_db_sweep_int 48 +#define isc_dyn_db_group_commit 49 -#define isc_dyn_last_dyn_value 242 +/****************************/ +/* Encryption specific attributes */ +/****************************/ +#define isc_dyn_enc_default 50 +#define isc_dyn_enc_cipher 51 +#define isc_dyn_enc_length 52 +#define isc_dyn_enc_password 54 +#define isc_dyn_enc_init_vector 55 +#define isc_dyn_enc_pad 56 +#define isc_dyn_encrypt 57 +#define isc_dyn_decrypt 58 + +/****************************/ +/* Last $dyn value assigned */ +/****************************/ + +#define isc_dyn_last_dyn_value 227 + +/******************************************/ +/* Array slice description language (SDL) */ +/******************************************/ #define isc_sdl_version1 1 #define isc_sdl_eoc 255 @@ -2179,371 +3178,68 @@ int ISC_EXPORT isc_get_client_minor_version (); #define isc_sdl_do1 35 #define isc_sdl_element 36 +/********************************************/ +/* International text interpretation values */ +/********************************************/ + #define isc_interp_eng_ascii 0 #define isc_interp_jpn_sjis 5 #define isc_interp_jpn_euc 6 -#define isc_blob_untyped 0 +/*******************/ +/* SQL definitions */ +/*******************/ -#define isc_blob_text 1 -#define isc_blob_blr 2 -#define isc_blob_acl 3 -#define isc_blob_ranges 4 -#define isc_blob_summary 5 -#define isc_blob_format 6 -#define isc_blob_tra 7 -#define isc_blob_extfile 8 -#define isc_blob_debug_info 9 -#define isc_blob_max_predefined_subtype 10 +#define SQL_TEXT 452 +#define SQL_VARYING 448 +#define SQL_SHORT 500 +#define SQL_LONG 496 +#define SQL_FLOAT 482 +#define SQL_DOUBLE 480 +#define SQL_D_FLOAT 530 +#define SQL_TIMESTAMP 510 +#define SQL_BLOB 520 +#define SQL_ARRAY 540 +#define SQL_QUAD 550 +#define SQL_TYPE_TIME 560 +#define SQL_TYPE_DATE 570 +#define SQL_INT64 580 +#define SQL_BOOLEAN 590 -#define isc_blob_formatted_memo 20 -#define isc_blob_paradox_ole 21 -#define isc_blob_graphic 22 -#define isc_blob_dbase_ole 23 -#define isc_blob_typed_binary 24 +/* Historical alias for pre V6 applications */ +#define SQL_DATE SQL_TIMESTAMP + +/*****************/ +/* Blob Subtypes */ +/*****************/ + +/* types less than zero are reserved for customer use */ + +#define isc_blob_untyped 0 + +/* internal subtypes */ + +#define isc_blob_text 1 +#define isc_blob_blr 2 +#define isc_blob_acl 3 +#define isc_blob_ranges 4 +#define isc_blob_summary 5 +#define isc_blob_format 6 +#define isc_blob_tra 7 +#define isc_blob_extfile 8 + +/* the range 20-30 is reserved for dBASE and Paradox types */ + +#define isc_blob_formatted_memo 20 +#define isc_blob_paradox_ole 21 +#define isc_blob_graphic 22 +#define isc_blob_dbase_ole 23 +#define isc_blob_typed_binary 24 + +/* Deprecated definitions maintained for compatibility only */ #define isc_info_db_SQL_dialect 62 #define isc_dpb_SQL_dialect 63 #define isc_dpb_set_db_SQL_dialect 65 - -#define fb_dbg_version 1 -#define fb_dbg_end 255 -#define fb_dbg_map_src2blr 2 -#define fb_dbg_map_varname 3 -#define fb_dbg_map_argument 4 - -#define fb_dbg_arg_input 0 -#define fb_dbg_arg_output 1 - -#endif - -/*********************************/ -/* Information call declarations */ -/*********************************/ - - -#ifndef JRD_INF_PUB_H -#define JRD_INF_PUB_H - -#define isc_info_end 1 -#define isc_info_truncated 2 -#define isc_info_error 3 -#define isc_info_data_not_ready 4 -#define isc_info_length 126 -#define isc_info_flag_end 127 - -enum db_info_types -{ - isc_info_db_id = 4, - isc_info_reads = 5, - isc_info_writes = 6, - isc_info_fetches = 7, - isc_info_marks = 8, - - isc_info_implementation = 11, - isc_info_isc_version = 12, - isc_info_base_level = 13, - isc_info_page_size = 14, - isc_info_num_buffers = 15, - isc_info_limbo = 16, - isc_info_current_memory = 17, - isc_info_max_memory = 18, - isc_info_window_turns = 19, - isc_info_license = 20, - - isc_info_allocation = 21, - isc_info_attachment_id = 22, - isc_info_read_seq_count = 23, - isc_info_read_idx_count = 24, - isc_info_insert_count = 25, - isc_info_update_count = 26, - isc_info_delete_count = 27, - isc_info_backout_count = 28, - isc_info_purge_count = 29, - isc_info_expunge_count = 30, - - isc_info_sweep_interval = 31, - isc_info_ods_version = 32, - isc_info_ods_minor_version = 33, - isc_info_no_reserve = 34, - - isc_info_logfile = 35, - isc_info_cur_logfile_name = 36, - isc_info_cur_log_part_offset = 37, - isc_info_num_wal_buffers = 38, - isc_info_wal_buffer_size = 39, - isc_info_wal_ckpt_length = 40, - - isc_info_wal_cur_ckpt_interval = 41, - isc_info_wal_prv_ckpt_fname = 42, - isc_info_wal_prv_ckpt_poffset = 43, - isc_info_wal_recv_ckpt_fname = 44, - isc_info_wal_recv_ckpt_poffset = 45, - isc_info_wal_grpc_wait_usecs = 47, - isc_info_wal_num_io = 48, - isc_info_wal_avg_io_size = 49, - isc_info_wal_num_commits = 50, - isc_info_wal_avg_grpc_size = 51, - - isc_info_forced_writes = 52, - isc_info_user_names = 53, - isc_info_page_errors = 54, - isc_info_record_errors = 55, - isc_info_bpage_errors = 56, - isc_info_dpage_errors = 57, - isc_info_ipage_errors = 58, - isc_info_ppage_errors = 59, - isc_info_tpage_errors = 60, - - isc_info_set_page_buffers = 61, - isc_info_db_sql_dialect = 62, - isc_info_db_read_only = 63, - isc_info_db_size_in_pages = 64, - - frb_info_att_charset = 101, - isc_info_db_class = 102, - isc_info_firebird_version = 103, - isc_info_oldest_transaction = 104, - isc_info_oldest_active = 105, - isc_info_oldest_snapshot = 106, - isc_info_next_transaction = 107, - isc_info_db_provider = 108, - isc_info_active_transactions = 109, - isc_info_active_tran_count = 110, - isc_info_creation_date = 111, - isc_info_db_file_size = 112, - - isc_info_db_last_value -}; - -#define isc_info_version isc_info_isc_version - -enum info_db_implementations -{ - isc_info_db_impl_rdb_vms = 1, - isc_info_db_impl_rdb_eln = 2, - isc_info_db_impl_rdb_eln_dev = 3, - isc_info_db_impl_rdb_vms_y = 4, - isc_info_db_impl_rdb_eln_y = 5, - isc_info_db_impl_jri = 6, - isc_info_db_impl_jsv = 7, - - isc_info_db_impl_isc_apl_68K = 25, - isc_info_db_impl_isc_vax_ultr = 26, - isc_info_db_impl_isc_vms = 27, - isc_info_db_impl_isc_sun_68k = 28, - isc_info_db_impl_isc_os2 = 29, - isc_info_db_impl_isc_sun4 = 30, - - isc_info_db_impl_isc_hp_ux = 31, - isc_info_db_impl_isc_sun_386i = 32, - isc_info_db_impl_isc_vms_orcl = 33, - isc_info_db_impl_isc_mac_aux = 34, - isc_info_db_impl_isc_rt_aix = 35, - isc_info_db_impl_isc_mips_ult = 36, - isc_info_db_impl_isc_xenix = 37, - isc_info_db_impl_isc_dg = 38, - isc_info_db_impl_isc_hp_mpexl = 39, - isc_info_db_impl_isc_hp_ux68K = 40, - - isc_info_db_impl_isc_sgi = 41, - isc_info_db_impl_isc_sco_unix = 42, - isc_info_db_impl_isc_cray = 43, - isc_info_db_impl_isc_imp = 44, - isc_info_db_impl_isc_delta = 45, - isc_info_db_impl_isc_next = 46, - isc_info_db_impl_isc_dos = 47, - isc_info_db_impl_m88K = 48, - isc_info_db_impl_unixware = 49, - isc_info_db_impl_isc_winnt_x86 = 50, - - isc_info_db_impl_isc_epson = 51, - isc_info_db_impl_alpha_osf = 52, - isc_info_db_impl_alpha_vms = 53, - isc_info_db_impl_netware_386 = 54, - isc_info_db_impl_win_only = 55, - isc_info_db_impl_ncr_3000 = 56, - isc_info_db_impl_winnt_ppc = 57, - isc_info_db_impl_dg_x86 = 58, - isc_info_db_impl_sco_ev = 59, - isc_info_db_impl_i386 = 60, - - isc_info_db_impl_freebsd = 61, - isc_info_db_impl_netbsd = 62, - isc_info_db_impl_darwin_ppc = 63, - isc_info_db_impl_sinixz = 64, - - isc_info_db_impl_linux_sparc = 65, - isc_info_db_impl_linux_amd64 = 66, - - isc_info_db_impl_freebsd_amd64 = 67, - - isc_info_db_impl_winnt_amd64 = 68, - - isc_info_db_impl_linux_ppc = 69, - isc_info_db_impl_darwin_x86 = 70, - isc_info_db_impl_linux_mipsel = 71, - isc_info_db_impl_linux_mips = 72, - isc_info_db_impl_darwin_x64 = 73, - - isc_info_db_impl_last_value -}; - -#define isc_info_db_impl_isc_a isc_info_db_impl_isc_apl_68K -#define isc_info_db_impl_isc_u isc_info_db_impl_isc_vax_ultr -#define isc_info_db_impl_isc_v isc_info_db_impl_isc_vms -#define isc_info_db_impl_isc_s isc_info_db_impl_isc_sun_68k - -enum info_db_class -{ - isc_info_db_class_access = 1, - isc_info_db_class_y_valve = 2, - isc_info_db_class_rem_int = 3, - isc_info_db_class_rem_srvr = 4, - isc_info_db_class_pipe_int = 7, - isc_info_db_class_pipe_srvr = 8, - isc_info_db_class_sam_int = 9, - isc_info_db_class_sam_srvr = 10, - isc_info_db_class_gateway = 11, - isc_info_db_class_cache = 12, - isc_info_db_class_classic_access = 13, - isc_info_db_class_server_access = 14, - - isc_info_db_class_last_value -}; - -enum info_db_provider -{ - isc_info_db_code_rdb_eln = 1, - isc_info_db_code_rdb_vms = 2, - isc_info_db_code_interbase = 3, - isc_info_db_code_firebird = 4, - - isc_info_db_code_last_value -}; - -#define isc_info_number_messages 4 -#define isc_info_max_message 5 -#define isc_info_max_send 6 -#define isc_info_max_receive 7 -#define isc_info_state 8 -#define isc_info_message_number 9 -#define isc_info_message_size 10 -#define isc_info_request_cost 11 -#define isc_info_access_path 12 -#define isc_info_req_select_count 13 -#define isc_info_req_insert_count 14 -#define isc_info_req_update_count 15 -#define isc_info_req_delete_count 16 - -#define isc_info_rsb_end 0 -#define isc_info_rsb_begin 1 -#define isc_info_rsb_type 2 -#define isc_info_rsb_relation 3 -#define isc_info_rsb_plan 4 - -#define isc_info_rsb_unknown 1 -#define isc_info_rsb_indexed 2 -#define isc_info_rsb_navigate 3 -#define isc_info_rsb_sequential 4 -#define isc_info_rsb_cross 5 -#define isc_info_rsb_sort 6 -#define isc_info_rsb_first 7 -#define isc_info_rsb_boolean 8 -#define isc_info_rsb_union 9 -#define isc_info_rsb_aggregate 10 -#define isc_info_rsb_merge 11 -#define isc_info_rsb_ext_sequential 12 -#define isc_info_rsb_ext_indexed 13 -#define isc_info_rsb_ext_dbkey 14 -#define isc_info_rsb_left_cross 15 -#define isc_info_rsb_select 16 -#define isc_info_rsb_sql_join 17 -#define isc_info_rsb_simulate 18 -#define isc_info_rsb_sim_cross 19 -#define isc_info_rsb_once 20 -#define isc_info_rsb_procedure 21 -#define isc_info_rsb_skip 22 -#define isc_info_rsb_virt_sequential 23 -#define isc_info_rsb_recursive 24 - -#define isc_info_rsb_and 1 -#define isc_info_rsb_or 2 -#define isc_info_rsb_dbkey 3 -#define isc_info_rsb_index 4 - -#define isc_info_req_active 2 -#define isc_info_req_inactive 3 -#define isc_info_req_send 4 -#define isc_info_req_receive 5 -#define isc_info_req_select 6 -#define isc_info_req_sql_stall 7 - -#define isc_info_blob_num_segments 4 -#define isc_info_blob_max_segment 5 -#define isc_info_blob_total_length 6 -#define isc_info_blob_type 7 - -#define isc_info_tra_id 4 -#define isc_info_tra_oldest_interesting 5 -#define isc_info_tra_oldest_snapshot 6 -#define isc_info_tra_oldest_active 7 -#define isc_info_tra_isolation 8 -#define isc_info_tra_access 9 -#define isc_info_tra_lock_timeout 10 - -#define isc_info_tra_consistency 1 -#define isc_info_tra_concurrency 2 -#define isc_info_tra_read_committed 3 - -#define isc_info_tra_no_rec_version 0 -#define isc_info_tra_rec_version 1 - -#define isc_info_tra_readonly 0 -#define isc_info_tra_readwrite 1 - -#define isc_info_sql_select 4 -#define isc_info_sql_bind 5 -#define isc_info_sql_num_variables 6 -#define isc_info_sql_describe_vars 7 -#define isc_info_sql_describe_end 8 -#define isc_info_sql_sqlda_seq 9 -#define isc_info_sql_message_seq 10 -#define isc_info_sql_type 11 -#define isc_info_sql_sub_type 12 -#define isc_info_sql_scale 13 -#define isc_info_sql_length 14 -#define isc_info_sql_null_ind 15 -#define isc_info_sql_field 16 -#define isc_info_sql_relation 17 -#define isc_info_sql_owner 18 -#define isc_info_sql_alias 19 -#define isc_info_sql_sqlda_start 20 -#define isc_info_sql_stmt_type 21 -#define isc_info_sql_get_plan 22 -#define isc_info_sql_records 23 -#define isc_info_sql_batch_fetch 24 -#define isc_info_sql_relation_alias 25 - -#define isc_info_sql_stmt_select 1 -#define isc_info_sql_stmt_insert 2 -#define isc_info_sql_stmt_update 3 -#define isc_info_sql_stmt_delete 4 -#define isc_info_sql_stmt_ddl 5 -#define isc_info_sql_stmt_get_segment 6 -#define isc_info_sql_stmt_put_segment 7 -#define isc_info_sql_stmt_exec_procedure 8 -#define isc_info_sql_stmt_start_trans 9 -#define isc_info_sql_stmt_commit 10 -#define isc_info_sql_stmt_rollback 11 -#define isc_info_sql_stmt_select_for_upd 12 -#define isc_info_sql_stmt_set_generator 13 -#define isc_info_sql_stmt_savepoint 14 - -#endif - - -#include "iberror.h" - -#endif /* JRD_IBASE_H */ - +/* END CONVERT TAG */ +#endif /* _JRD_IBASE_H_ */ diff --git a/libraries/SQLAPI/include/ibase/iberror.h b/libraries/SQLAPI/include/ibase/iberror.h index 80770ffc5..4c0077eda 100644 --- a/libraries/SQLAPI/include/ibase/iberror.h +++ b/libraries/SQLAPI/include/ibase/iberror.h @@ -1,911 +1,20 @@ - -#ifndef JRD_GEN_IBERROR_H -#define JRD_GEN_IBERROR_H -/* - * The contents of this file are subject to the Interbase Public - * License Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy - * of the License at http://www.Inprise.com/IPL.html - * - * Software distributed under the License is distributed on an - * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express - * or implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The content of this file was generated by the Firebird project - * using the program jrd/codes.epp - */ -/* - * - * *** WARNING *** - This file is automatically generated by codes.epp - do not edit! - * - */ /* * MODULE: iberror.h * DESCRIPTION: ISC error codes * */ +/* + * Copyright (C) 1986-2010 Embarcadero Technologies Inc. + * All Rights Reserved. + */ +/* START CONVERT TAG Define as public long */ /***********************/ /* ISC Error Codes */ /***********************/ - -#ifdef __cplusplus /* c++ definitions */ - -const ISC_LONG isc_facility = 20; -const ISC_LONG isc_base = 335544320L; -const ISC_LONG isc_factor = 1; -const ISC_LONG isc_arg_end = 0; // end of argument list -const ISC_LONG isc_arg_gds = 1; // generic DSRI status value -const ISC_LONG isc_arg_string = 2; // string argument -const ISC_LONG isc_arg_cstring = 3; // count & string argument -const ISC_LONG isc_arg_number = 4; // numeric argument (long) -const ISC_LONG isc_arg_interpreted = 5; // interpreted status code (string) -const ISC_LONG isc_arg_vms = 6; // VAX/VMS status code (long) -const ISC_LONG isc_arg_unix = 7; // UNIX error code -const ISC_LONG isc_arg_domain = 8; // Apollo/Domain error code -const ISC_LONG isc_arg_dos = 9; // MSDOS/OS2 error code -const ISC_LONG isc_arg_mpexl = 10; // HP MPE/XL error code -const ISC_LONG isc_arg_mpexl_ipc = 11; // HP MPE/XL IPC error code -const ISC_LONG isc_arg_next_mach = 15; // NeXT/Mach error code -const ISC_LONG isc_arg_netware = 16; // NetWare error code -const ISC_LONG isc_arg_win32 = 17; // Win32 error code -const ISC_LONG isc_arg_warning = 18; // warning argument - -const ISC_LONG isc_arith_except = 335544321L; -const ISC_LONG isc_bad_dbkey = 335544322L; -const ISC_LONG isc_bad_db_format = 335544323L; -const ISC_LONG isc_bad_db_handle = 335544324L; -const ISC_LONG isc_bad_dpb_content = 335544325L; -const ISC_LONG isc_bad_dpb_form = 335544326L; -const ISC_LONG isc_bad_req_handle = 335544327L; -const ISC_LONG isc_bad_segstr_handle = 335544328L; -const ISC_LONG isc_bad_segstr_id = 335544329L; -const ISC_LONG isc_bad_tpb_content = 335544330L; -const ISC_LONG isc_bad_tpb_form = 335544331L; -const ISC_LONG isc_bad_trans_handle = 335544332L; -const ISC_LONG isc_bug_check = 335544333L; -const ISC_LONG isc_convert_error = 335544334L; -const ISC_LONG isc_db_corrupt = 335544335L; -const ISC_LONG isc_deadlock = 335544336L; -const ISC_LONG isc_excess_trans = 335544337L; -const ISC_LONG isc_from_no_match = 335544338L; -const ISC_LONG isc_infinap = 335544339L; -const ISC_LONG isc_infona = 335544340L; -const ISC_LONG isc_infunk = 335544341L; -const ISC_LONG isc_integ_fail = 335544342L; -const ISC_LONG isc_invalid_blr = 335544343L; -const ISC_LONG isc_io_error = 335544344L; -const ISC_LONG isc_lock_conflict = 335544345L; -const ISC_LONG isc_metadata_corrupt = 335544346L; -const ISC_LONG isc_not_valid = 335544347L; -const ISC_LONG isc_no_cur_rec = 335544348L; -const ISC_LONG isc_no_dup = 335544349L; -const ISC_LONG isc_no_finish = 335544350L; -const ISC_LONG isc_no_meta_update = 335544351L; -const ISC_LONG isc_no_priv = 335544352L; -const ISC_LONG isc_no_recon = 335544353L; -const ISC_LONG isc_no_record = 335544354L; -const ISC_LONG isc_no_segstr_close = 335544355L; -const ISC_LONG isc_obsolete_metadata = 335544356L; -const ISC_LONG isc_open_trans = 335544357L; -const ISC_LONG isc_port_len = 335544358L; -const ISC_LONG isc_read_only_field = 335544359L; -const ISC_LONG isc_read_only_rel = 335544360L; -const ISC_LONG isc_read_only_trans = 335544361L; -const ISC_LONG isc_read_only_view = 335544362L; -const ISC_LONG isc_req_no_trans = 335544363L; -const ISC_LONG isc_req_sync = 335544364L; -const ISC_LONG isc_req_wrong_db = 335544365L; -const ISC_LONG isc_segment = 335544366L; -const ISC_LONG isc_segstr_eof = 335544367L; -const ISC_LONG isc_segstr_no_op = 335544368L; -const ISC_LONG isc_segstr_no_read = 335544369L; -const ISC_LONG isc_segstr_no_trans = 335544370L; -const ISC_LONG isc_segstr_no_write = 335544371L; -const ISC_LONG isc_segstr_wrong_db = 335544372L; -const ISC_LONG isc_sys_request = 335544373L; -const ISC_LONG isc_stream_eof = 335544374L; -const ISC_LONG isc_unavailable = 335544375L; -const ISC_LONG isc_unres_rel = 335544376L; -const ISC_LONG isc_uns_ext = 335544377L; -const ISC_LONG isc_wish_list = 335544378L; -const ISC_LONG isc_wrong_ods = 335544379L; -const ISC_LONG isc_wronumarg = 335544380L; -const ISC_LONG isc_imp_exc = 335544381L; -const ISC_LONG isc_random = 335544382L; -const ISC_LONG isc_fatal_conflict = 335544383L; -const ISC_LONG isc_badblk = 335544384L; -const ISC_LONG isc_invpoolcl = 335544385L; -const ISC_LONG isc_nopoolids = 335544386L; -const ISC_LONG isc_relbadblk = 335544387L; -const ISC_LONG isc_blktoobig = 335544388L; -const ISC_LONG isc_bufexh = 335544389L; -const ISC_LONG isc_syntaxerr = 335544390L; -const ISC_LONG isc_bufinuse = 335544391L; -const ISC_LONG isc_bdbincon = 335544392L; -const ISC_LONG isc_reqinuse = 335544393L; -const ISC_LONG isc_badodsver = 335544394L; -const ISC_LONG isc_relnotdef = 335544395L; -const ISC_LONG isc_fldnotdef = 335544396L; -const ISC_LONG isc_dirtypage = 335544397L; -const ISC_LONG isc_waifortra = 335544398L; -const ISC_LONG isc_doubleloc = 335544399L; -const ISC_LONG isc_nodnotfnd = 335544400L; -const ISC_LONG isc_dupnodfnd = 335544401L; -const ISC_LONG isc_locnotmar = 335544402L; -const ISC_LONG isc_badpagtyp = 335544403L; -const ISC_LONG isc_corrupt = 335544404L; -const ISC_LONG isc_badpage = 335544405L; -const ISC_LONG isc_badindex = 335544406L; -const ISC_LONG isc_dbbnotzer = 335544407L; -const ISC_LONG isc_tranotzer = 335544408L; -const ISC_LONG isc_trareqmis = 335544409L; -const ISC_LONG isc_badhndcnt = 335544410L; -const ISC_LONG isc_wrotpbver = 335544411L; -const ISC_LONG isc_wroblrver = 335544412L; -const ISC_LONG isc_wrodpbver = 335544413L; -const ISC_LONG isc_blobnotsup = 335544414L; -const ISC_LONG isc_badrelation = 335544415L; -const ISC_LONG isc_nodetach = 335544416L; -const ISC_LONG isc_notremote = 335544417L; -const ISC_LONG isc_trainlim = 335544418L; -const ISC_LONG isc_notinlim = 335544419L; -const ISC_LONG isc_traoutsta = 335544420L; -const ISC_LONG isc_connect_reject = 335544421L; -const ISC_LONG isc_dbfile = 335544422L; -const ISC_LONG isc_orphan = 335544423L; -const ISC_LONG isc_no_lock_mgr = 335544424L; -const ISC_LONG isc_ctxinuse = 335544425L; -const ISC_LONG isc_ctxnotdef = 335544426L; -const ISC_LONG isc_datnotsup = 335544427L; -const ISC_LONG isc_badmsgnum = 335544428L; -const ISC_LONG isc_badparnum = 335544429L; -const ISC_LONG isc_virmemexh = 335544430L; -const ISC_LONG isc_blocking_signal = 335544431L; -const ISC_LONG isc_lockmanerr = 335544432L; -const ISC_LONG isc_journerr = 335544433L; -const ISC_LONG isc_keytoobig = 335544434L; -const ISC_LONG isc_nullsegkey = 335544435L; -const ISC_LONG isc_sqlerr = 335544436L; -const ISC_LONG isc_wrodynver = 335544437L; -const ISC_LONG isc_funnotdef = 335544438L; -const ISC_LONG isc_funmismat = 335544439L; -const ISC_LONG isc_bad_msg_vec = 335544440L; -const ISC_LONG isc_bad_detach = 335544441L; -const ISC_LONG isc_noargacc_read = 335544442L; -const ISC_LONG isc_noargacc_write = 335544443L; -const ISC_LONG isc_read_only = 335544444L; -const ISC_LONG isc_ext_err = 335544445L; -const ISC_LONG isc_non_updatable = 335544446L; -const ISC_LONG isc_no_rollback = 335544447L; -const ISC_LONG isc_bad_sec_info = 335544448L; -const ISC_LONG isc_invalid_sec_info = 335544449L; -const ISC_LONG isc_misc_interpreted = 335544450L; -const ISC_LONG isc_update_conflict = 335544451L; -const ISC_LONG isc_unlicensed = 335544452L; -const ISC_LONG isc_obj_in_use = 335544453L; -const ISC_LONG isc_nofilter = 335544454L; -const ISC_LONG isc_shadow_accessed = 335544455L; -const ISC_LONG isc_invalid_sdl = 335544456L; -const ISC_LONG isc_out_of_bounds = 335544457L; -const ISC_LONG isc_invalid_dimension = 335544458L; -const ISC_LONG isc_rec_in_limbo = 335544459L; -const ISC_LONG isc_shadow_missing = 335544460L; -const ISC_LONG isc_cant_validate = 335544461L; -const ISC_LONG isc_cant_start_journal = 335544462L; -const ISC_LONG isc_gennotdef = 335544463L; -const ISC_LONG isc_cant_start_logging = 335544464L; -const ISC_LONG isc_bad_segstr_type = 335544465L; -const ISC_LONG isc_foreign_key = 335544466L; -const ISC_LONG isc_high_minor = 335544467L; -const ISC_LONG isc_tra_state = 335544468L; -const ISC_LONG isc_trans_invalid = 335544469L; -const ISC_LONG isc_buf_invalid = 335544470L; -const ISC_LONG isc_indexnotdefined = 335544471L; -const ISC_LONG isc_login = 335544472L; -const ISC_LONG isc_invalid_bookmark = 335544473L; -const ISC_LONG isc_bad_lock_level = 335544474L; -const ISC_LONG isc_relation_lock = 335544475L; -const ISC_LONG isc_record_lock = 335544476L; -const ISC_LONG isc_max_idx = 335544477L; -const ISC_LONG isc_jrn_enable = 335544478L; -const ISC_LONG isc_old_failure = 335544479L; -const ISC_LONG isc_old_in_progress = 335544480L; -const ISC_LONG isc_old_no_space = 335544481L; -const ISC_LONG isc_no_wal_no_jrn = 335544482L; -const ISC_LONG isc_num_old_files = 335544483L; -const ISC_LONG isc_wal_file_open = 335544484L; -const ISC_LONG isc_bad_stmt_handle = 335544485L; -const ISC_LONG isc_wal_failure = 335544486L; -const ISC_LONG isc_walw_err = 335544487L; -const ISC_LONG isc_logh_small = 335544488L; -const ISC_LONG isc_logh_inv_version = 335544489L; -const ISC_LONG isc_logh_open_flag = 335544490L; -const ISC_LONG isc_logh_open_flag2 = 335544491L; -const ISC_LONG isc_logh_diff_dbname = 335544492L; -const ISC_LONG isc_logf_unexpected_eof = 335544493L; -const ISC_LONG isc_logr_incomplete = 335544494L; -const ISC_LONG isc_logr_header_small = 335544495L; -const ISC_LONG isc_logb_small = 335544496L; -const ISC_LONG isc_wal_illegal_attach = 335544497L; -const ISC_LONG isc_wal_invalid_wpb = 335544498L; -const ISC_LONG isc_wal_err_rollover = 335544499L; -const ISC_LONG isc_no_wal = 335544500L; -const ISC_LONG isc_drop_wal = 335544501L; -const ISC_LONG isc_stream_not_defined = 335544502L; -const ISC_LONG isc_wal_subsys_error = 335544503L; -const ISC_LONG isc_wal_subsys_corrupt = 335544504L; -const ISC_LONG isc_no_archive = 335544505L; -const ISC_LONG isc_shutinprog = 335544506L; -const ISC_LONG isc_range_in_use = 335544507L; -const ISC_LONG isc_range_not_found = 335544508L; -const ISC_LONG isc_charset_not_found = 335544509L; -const ISC_LONG isc_lock_timeout = 335544510L; -const ISC_LONG isc_prcnotdef = 335544511L; -const ISC_LONG isc_prcmismat = 335544512L; -const ISC_LONG isc_wal_bugcheck = 335544513L; -const ISC_LONG isc_wal_cant_expand = 335544514L; -const ISC_LONG isc_codnotdef = 335544515L; -const ISC_LONG isc_xcpnotdef = 335544516L; -const ISC_LONG isc_except = 335544517L; -const ISC_LONG isc_cache_restart = 335544518L; -const ISC_LONG isc_bad_lock_handle = 335544519L; -const ISC_LONG isc_jrn_present = 335544520L; -const ISC_LONG isc_wal_err_rollover2 = 335544521L; -const ISC_LONG isc_wal_err_logwrite = 335544522L; -const ISC_LONG isc_wal_err_jrn_comm = 335544523L; -const ISC_LONG isc_wal_err_expansion = 335544524L; -const ISC_LONG isc_wal_err_setup = 335544525L; -const ISC_LONG isc_wal_err_ww_sync = 335544526L; -const ISC_LONG isc_wal_err_ww_start = 335544527L; -const ISC_LONG isc_shutdown = 335544528L; -const ISC_LONG isc_existing_priv_mod = 335544529L; -const ISC_LONG isc_primary_key_ref = 335544530L; -const ISC_LONG isc_primary_key_notnull = 335544531L; -const ISC_LONG isc_ref_cnstrnt_notfound = 335544532L; -const ISC_LONG isc_foreign_key_notfound = 335544533L; -const ISC_LONG isc_ref_cnstrnt_update = 335544534L; -const ISC_LONG isc_check_cnstrnt_update = 335544535L; -const ISC_LONG isc_check_cnstrnt_del = 335544536L; -const ISC_LONG isc_integ_index_seg_del = 335544537L; -const ISC_LONG isc_integ_index_seg_mod = 335544538L; -const ISC_LONG isc_integ_index_del = 335544539L; -const ISC_LONG isc_integ_index_mod = 335544540L; -const ISC_LONG isc_check_trig_del = 335544541L; -const ISC_LONG isc_check_trig_update = 335544542L; -const ISC_LONG isc_cnstrnt_fld_del = 335544543L; -const ISC_LONG isc_cnstrnt_fld_rename = 335544544L; -const ISC_LONG isc_rel_cnstrnt_update = 335544545L; -const ISC_LONG isc_constaint_on_view = 335544546L; -const ISC_LONG isc_invld_cnstrnt_type = 335544547L; -const ISC_LONG isc_primary_key_exists = 335544548L; -const ISC_LONG isc_systrig_update = 335544549L; -const ISC_LONG isc_not_rel_owner = 335544550L; -const ISC_LONG isc_grant_obj_notfound = 335544551L; -const ISC_LONG isc_grant_fld_notfound = 335544552L; -const ISC_LONG isc_grant_nopriv = 335544553L; -const ISC_LONG isc_nonsql_security_rel = 335544554L; -const ISC_LONG isc_nonsql_security_fld = 335544555L; -const ISC_LONG isc_wal_cache_err = 335544556L; -const ISC_LONG isc_shutfail = 335544557L; -const ISC_LONG isc_check_constraint = 335544558L; -const ISC_LONG isc_bad_svc_handle = 335544559L; -const ISC_LONG isc_shutwarn = 335544560L; -const ISC_LONG isc_wrospbver = 335544561L; -const ISC_LONG isc_bad_spb_form = 335544562L; -const ISC_LONG isc_svcnotdef = 335544563L; -const ISC_LONG isc_no_jrn = 335544564L; -const ISC_LONG isc_transliteration_failed = 335544565L; -const ISC_LONG isc_start_cm_for_wal = 335544566L; -const ISC_LONG isc_wal_ovflow_log_required = 335544567L; -const ISC_LONG isc_text_subtype = 335544568L; -const ISC_LONG isc_dsql_error = 335544569L; -const ISC_LONG isc_dsql_command_err = 335544570L; -const ISC_LONG isc_dsql_constant_err = 335544571L; -const ISC_LONG isc_dsql_cursor_err = 335544572L; -const ISC_LONG isc_dsql_datatype_err = 335544573L; -const ISC_LONG isc_dsql_decl_err = 335544574L; -const ISC_LONG isc_dsql_cursor_update_err = 335544575L; -const ISC_LONG isc_dsql_cursor_open_err = 335544576L; -const ISC_LONG isc_dsql_cursor_close_err = 335544577L; -const ISC_LONG isc_dsql_field_err = 335544578L; -const ISC_LONG isc_dsql_internal_err = 335544579L; -const ISC_LONG isc_dsql_relation_err = 335544580L; -const ISC_LONG isc_dsql_procedure_err = 335544581L; -const ISC_LONG isc_dsql_request_err = 335544582L; -const ISC_LONG isc_dsql_sqlda_err = 335544583L; -const ISC_LONG isc_dsql_var_count_err = 335544584L; -const ISC_LONG isc_dsql_stmt_handle = 335544585L; -const ISC_LONG isc_dsql_function_err = 335544586L; -const ISC_LONG isc_dsql_blob_err = 335544587L; -const ISC_LONG isc_collation_not_found = 335544588L; -const ISC_LONG isc_collation_not_for_charset = 335544589L; -const ISC_LONG isc_dsql_dup_option = 335544590L; -const ISC_LONG isc_dsql_tran_err = 335544591L; -const ISC_LONG isc_dsql_invalid_array = 335544592L; -const ISC_LONG isc_dsql_max_arr_dim_exceeded = 335544593L; -const ISC_LONG isc_dsql_arr_range_error = 335544594L; -const ISC_LONG isc_dsql_trigger_err = 335544595L; -const ISC_LONG isc_dsql_subselect_err = 335544596L; -const ISC_LONG isc_dsql_crdb_prepare_err = 335544597L; -const ISC_LONG isc_specify_field_err = 335544598L; -const ISC_LONG isc_num_field_err = 335544599L; -const ISC_LONG isc_col_name_err = 335544600L; -const ISC_LONG isc_where_err = 335544601L; -const ISC_LONG isc_table_view_err = 335544602L; -const ISC_LONG isc_distinct_err = 335544603L; -const ISC_LONG isc_key_field_count_err = 335544604L; -const ISC_LONG isc_subquery_err = 335544605L; -const ISC_LONG isc_expression_eval_err = 335544606L; -const ISC_LONG isc_node_err = 335544607L; -const ISC_LONG isc_command_end_err = 335544608L; -const ISC_LONG isc_index_name = 335544609L; -const ISC_LONG isc_exception_name = 335544610L; -const ISC_LONG isc_field_name = 335544611L; -const ISC_LONG isc_token_err = 335544612L; -const ISC_LONG isc_union_err = 335544613L; -const ISC_LONG isc_dsql_construct_err = 335544614L; -const ISC_LONG isc_field_aggregate_err = 335544615L; -const ISC_LONG isc_field_ref_err = 335544616L; -const ISC_LONG isc_order_by_err = 335544617L; -const ISC_LONG isc_return_mode_err = 335544618L; -const ISC_LONG isc_extern_func_err = 335544619L; -const ISC_LONG isc_alias_conflict_err = 335544620L; -const ISC_LONG isc_procedure_conflict_error = 335544621L; -const ISC_LONG isc_relation_conflict_err = 335544622L; -const ISC_LONG isc_dsql_domain_err = 335544623L; -const ISC_LONG isc_idx_seg_err = 335544624L; -const ISC_LONG isc_node_name_err = 335544625L; -const ISC_LONG isc_table_name = 335544626L; -const ISC_LONG isc_proc_name = 335544627L; -const ISC_LONG isc_idx_create_err = 335544628L; -const ISC_LONG isc_wal_shadow_err = 335544629L; -const ISC_LONG isc_dependency = 335544630L; -const ISC_LONG isc_idx_key_err = 335544631L; -const ISC_LONG isc_dsql_file_length_err = 335544632L; -const ISC_LONG isc_dsql_shadow_number_err = 335544633L; -const ISC_LONG isc_dsql_token_unk_err = 335544634L; -const ISC_LONG isc_dsql_no_relation_alias = 335544635L; -const ISC_LONG isc_indexname = 335544636L; -const ISC_LONG isc_no_stream_plan = 335544637L; -const ISC_LONG isc_stream_twice = 335544638L; -const ISC_LONG isc_stream_not_found = 335544639L; -const ISC_LONG isc_collation_requires_text = 335544640L; -const ISC_LONG isc_dsql_domain_not_found = 335544641L; -const ISC_LONG isc_index_unused = 335544642L; -const ISC_LONG isc_dsql_self_join = 335544643L; -const ISC_LONG isc_stream_bof = 335544644L; -const ISC_LONG isc_stream_crack = 335544645L; -const ISC_LONG isc_db_or_file_exists = 335544646L; -const ISC_LONG isc_invalid_operator = 335544647L; -const ISC_LONG isc_conn_lost = 335544648L; -const ISC_LONG isc_bad_checksum = 335544649L; -const ISC_LONG isc_page_type_err = 335544650L; -const ISC_LONG isc_ext_readonly_err = 335544651L; -const ISC_LONG isc_sing_select_err = 335544652L; -const ISC_LONG isc_psw_attach = 335544653L; -const ISC_LONG isc_psw_start_trans = 335544654L; -const ISC_LONG isc_invalid_direction = 335544655L; -const ISC_LONG isc_dsql_var_conflict = 335544656L; -const ISC_LONG isc_dsql_no_blob_array = 335544657L; -const ISC_LONG isc_dsql_base_table = 335544658L; -const ISC_LONG isc_duplicate_base_table = 335544659L; -const ISC_LONG isc_view_alias = 335544660L; -const ISC_LONG isc_index_root_page_full = 335544661L; -const ISC_LONG isc_dsql_blob_type_unknown = 335544662L; -const ISC_LONG isc_req_max_clones_exceeded = 335544663L; -const ISC_LONG isc_dsql_duplicate_spec = 335544664L; -const ISC_LONG isc_unique_key_violation = 335544665L; -const ISC_LONG isc_srvr_version_too_old = 335544666L; -const ISC_LONG isc_drdb_completed_with_errs = 335544667L; -const ISC_LONG isc_dsql_procedure_use_err = 335544668L; -const ISC_LONG isc_dsql_count_mismatch = 335544669L; -const ISC_LONG isc_blob_idx_err = 335544670L; -const ISC_LONG isc_array_idx_err = 335544671L; -const ISC_LONG isc_key_field_err = 335544672L; -const ISC_LONG isc_no_delete = 335544673L; -const ISC_LONG isc_del_last_field = 335544674L; -const ISC_LONG isc_sort_err = 335544675L; -const ISC_LONG isc_sort_mem_err = 335544676L; -const ISC_LONG isc_version_err = 335544677L; -const ISC_LONG isc_inval_key_posn = 335544678L; -const ISC_LONG isc_no_segments_err = 335544679L; -const ISC_LONG isc_crrp_data_err = 335544680L; -const ISC_LONG isc_rec_size_err = 335544681L; -const ISC_LONG isc_dsql_field_ref = 335544682L; -const ISC_LONG isc_req_depth_exceeded = 335544683L; -const ISC_LONG isc_no_field_access = 335544684L; -const ISC_LONG isc_no_dbkey = 335544685L; -const ISC_LONG isc_jrn_format_err = 335544686L; -const ISC_LONG isc_jrn_file_full = 335544687L; -const ISC_LONG isc_dsql_open_cursor_request = 335544688L; -const ISC_LONG isc_ib_error = 335544689L; -const ISC_LONG isc_cache_redef = 335544690L; -const ISC_LONG isc_cache_too_small = 335544691L; -const ISC_LONG isc_log_redef = 335544692L; -const ISC_LONG isc_log_too_small = 335544693L; -const ISC_LONG isc_partition_too_small = 335544694L; -const ISC_LONG isc_partition_not_supp = 335544695L; -const ISC_LONG isc_log_length_spec = 335544696L; -const ISC_LONG isc_precision_err = 335544697L; -const ISC_LONG isc_scale_nogt = 335544698L; -const ISC_LONG isc_expec_short = 335544699L; -const ISC_LONG isc_expec_long = 335544700L; -const ISC_LONG isc_expec_ushort = 335544701L; -const ISC_LONG isc_like_escape_invalid = 335544702L; -const ISC_LONG isc_svcnoexe = 335544703L; -const ISC_LONG isc_net_lookup_err = 335544704L; -const ISC_LONG isc_service_unknown = 335544705L; -const ISC_LONG isc_host_unknown = 335544706L; -const ISC_LONG isc_grant_nopriv_on_base = 335544707L; -const ISC_LONG isc_dyn_fld_ambiguous = 335544708L; -const ISC_LONG isc_dsql_agg_ref_err = 335544709L; -const ISC_LONG isc_complex_view = 335544710L; -const ISC_LONG isc_unprepared_stmt = 335544711L; -const ISC_LONG isc_expec_positive = 335544712L; -const ISC_LONG isc_dsql_sqlda_value_err = 335544713L; -const ISC_LONG isc_invalid_array_id = 335544714L; -const ISC_LONG isc_extfile_uns_op = 335544715L; -const ISC_LONG isc_svc_in_use = 335544716L; -const ISC_LONG isc_err_stack_limit = 335544717L; -const ISC_LONG isc_invalid_key = 335544718L; -const ISC_LONG isc_net_init_error = 335544719L; -const ISC_LONG isc_loadlib_failure = 335544720L; -const ISC_LONG isc_network_error = 335544721L; -const ISC_LONG isc_net_connect_err = 335544722L; -const ISC_LONG isc_net_connect_listen_err = 335544723L; -const ISC_LONG isc_net_event_connect_err = 335544724L; -const ISC_LONG isc_net_event_listen_err = 335544725L; -const ISC_LONG isc_net_read_err = 335544726L; -const ISC_LONG isc_net_write_err = 335544727L; -const ISC_LONG isc_integ_index_deactivate = 335544728L; -const ISC_LONG isc_integ_deactivate_primary = 335544729L; -const ISC_LONG isc_cse_not_supported = 335544730L; -const ISC_LONG isc_tra_must_sweep = 335544731L; -const ISC_LONG isc_unsupported_network_drive = 335544732L; -const ISC_LONG isc_io_create_err = 335544733L; -const ISC_LONG isc_io_open_err = 335544734L; -const ISC_LONG isc_io_close_err = 335544735L; -const ISC_LONG isc_io_read_err = 335544736L; -const ISC_LONG isc_io_write_err = 335544737L; -const ISC_LONG isc_io_delete_err = 335544738L; -const ISC_LONG isc_io_access_err = 335544739L; -const ISC_LONG isc_udf_exception = 335544740L; -const ISC_LONG isc_lost_db_connection = 335544741L; -const ISC_LONG isc_no_write_user_priv = 335544742L; -const ISC_LONG isc_token_too_long = 335544743L; -const ISC_LONG isc_max_att_exceeded = 335544744L; -const ISC_LONG isc_login_same_as_role_name = 335544745L; -const ISC_LONG isc_reftable_requires_pk = 335544746L; -const ISC_LONG isc_usrname_too_long = 335544747L; -const ISC_LONG isc_password_too_long = 335544748L; -const ISC_LONG isc_usrname_required = 335544749L; -const ISC_LONG isc_password_required = 335544750L; -const ISC_LONG isc_bad_protocol = 335544751L; -const ISC_LONG isc_dup_usrname_found = 335544752L; -const ISC_LONG isc_usrname_not_found = 335544753L; -const ISC_LONG isc_error_adding_sec_record = 335544754L; -const ISC_LONG isc_error_modifying_sec_record = 335544755L; -const ISC_LONG isc_error_deleting_sec_record = 335544756L; -const ISC_LONG isc_error_updating_sec_db = 335544757L; -const ISC_LONG isc_sort_rec_size_err = 335544758L; -const ISC_LONG isc_bad_default_value = 335544759L; -const ISC_LONG isc_invalid_clause = 335544760L; -const ISC_LONG isc_too_many_handles = 335544761L; -const ISC_LONG isc_optimizer_blk_exc = 335544762L; -const ISC_LONG isc_invalid_string_constant = 335544763L; -const ISC_LONG isc_transitional_date = 335544764L; -const ISC_LONG isc_read_only_database = 335544765L; -const ISC_LONG isc_must_be_dialect_2_and_up = 335544766L; -const ISC_LONG isc_blob_filter_exception = 335544767L; -const ISC_LONG isc_exception_access_violation = 335544768L; -const ISC_LONG isc_exception_datatype_missalignment = 335544769L; -const ISC_LONG isc_exception_array_bounds_exceeded = 335544770L; -const ISC_LONG isc_exception_float_denormal_operand = 335544771L; -const ISC_LONG isc_exception_float_divide_by_zero = 335544772L; -const ISC_LONG isc_exception_float_inexact_result = 335544773L; -const ISC_LONG isc_exception_float_invalid_operand = 335544774L; -const ISC_LONG isc_exception_float_overflow = 335544775L; -const ISC_LONG isc_exception_float_stack_check = 335544776L; -const ISC_LONG isc_exception_float_underflow = 335544777L; -const ISC_LONG isc_exception_integer_divide_by_zero = 335544778L; -const ISC_LONG isc_exception_integer_overflow = 335544779L; -const ISC_LONG isc_exception_unknown = 335544780L; -const ISC_LONG isc_exception_stack_overflow = 335544781L; -const ISC_LONG isc_exception_sigsegv = 335544782L; -const ISC_LONG isc_exception_sigill = 335544783L; -const ISC_LONG isc_exception_sigbus = 335544784L; -const ISC_LONG isc_exception_sigfpe = 335544785L; -const ISC_LONG isc_ext_file_delete = 335544786L; -const ISC_LONG isc_ext_file_modify = 335544787L; -const ISC_LONG isc_adm_task_denied = 335544788L; -const ISC_LONG isc_extract_input_mismatch = 335544789L; -const ISC_LONG isc_insufficient_svc_privileges = 335544790L; -const ISC_LONG isc_file_in_use = 335544791L; -const ISC_LONG isc_service_att_err = 335544792L; -const ISC_LONG isc_ddl_not_allowed_by_db_sql_dial = 335544793L; -const ISC_LONG isc_cancelled = 335544794L; -const ISC_LONG isc_unexp_spb_form = 335544795L; -const ISC_LONG isc_sql_dialect_datatype_unsupport = 335544796L; -const ISC_LONG isc_svcnouser = 335544797L; -const ISC_LONG isc_depend_on_uncommitted_rel = 335544798L; -const ISC_LONG isc_svc_name_missing = 335544799L; -const ISC_LONG isc_too_many_contexts = 335544800L; -const ISC_LONG isc_datype_notsup = 335544801L; -const ISC_LONG isc_dialect_reset_warning = 335544802L; -const ISC_LONG isc_dialect_not_changed = 335544803L; -const ISC_LONG isc_database_create_failed = 335544804L; -const ISC_LONG isc_inv_dialect_specified = 335544805L; -const ISC_LONG isc_valid_db_dialects = 335544806L; -const ISC_LONG isc_sqlwarn = 335544807L; -const ISC_LONG isc_dtype_renamed = 335544808L; -const ISC_LONG isc_extern_func_dir_error = 335544809L; -const ISC_LONG isc_date_range_exceeded = 335544810L; -const ISC_LONG isc_inv_client_dialect_specified = 335544811L; -const ISC_LONG isc_valid_client_dialects = 335544812L; -const ISC_LONG isc_optimizer_between_err = 335544813L; -const ISC_LONG isc_service_not_supported = 335544814L; -const ISC_LONG isc_generator_name = 335544815L; -const ISC_LONG isc_udf_name = 335544816L; -const ISC_LONG isc_bad_limit_param = 335544817L; -const ISC_LONG isc_bad_skip_param = 335544818L; -const ISC_LONG isc_io_32bit_exceeded_err = 335544819L; -const ISC_LONG isc_invalid_savepoint = 335544820L; -const ISC_LONG isc_dsql_column_pos_err = 335544821L; -const ISC_LONG isc_dsql_agg_where_err = 335544822L; -const ISC_LONG isc_dsql_agg_group_err = 335544823L; -const ISC_LONG isc_dsql_agg_column_err = 335544824L; -const ISC_LONG isc_dsql_agg_having_err = 335544825L; -const ISC_LONG isc_dsql_agg_nested_err = 335544826L; -const ISC_LONG isc_exec_sql_invalid_arg = 335544827L; -const ISC_LONG isc_exec_sql_invalid_req = 335544828L; -const ISC_LONG isc_exec_sql_invalid_var = 335544829L; -const ISC_LONG isc_exec_sql_max_call_exceeded = 335544830L; -const ISC_LONG isc_conf_access_denied = 335544831L; -const ISC_LONG isc_wrong_backup_state = 335544832L; -const ISC_LONG isc_wal_backup_err = 335544833L; -const ISC_LONG isc_cursor_not_open = 335544834L; -const ISC_LONG isc_bad_shutdown_mode = 335544835L; -const ISC_LONG isc_concat_overflow = 335544836L; -const ISC_LONG isc_bad_substring_offset = 335544837L; -const ISC_LONG isc_foreign_key_target_doesnt_exist = 335544838L; -const ISC_LONG isc_foreign_key_references_present = 335544839L; -const ISC_LONG isc_no_update = 335544840L; -const ISC_LONG isc_cursor_already_open = 335544841L; -const ISC_LONG isc_stack_trace = 335544842L; -const ISC_LONG isc_ctx_var_not_found = 335544843L; -const ISC_LONG isc_ctx_namespace_invalid = 335544844L; -const ISC_LONG isc_ctx_too_big = 335544845L; -const ISC_LONG isc_ctx_bad_argument = 335544846L; -const ISC_LONG isc_identifier_too_long = 335544847L; -const ISC_LONG isc_except2 = 335544848L; -const ISC_LONG isc_malformed_string = 335544849L; -const ISC_LONG isc_prc_out_param_mismatch = 335544850L; -const ISC_LONG isc_command_end_err2 = 335544851L; -const ISC_LONG isc_partner_idx_incompat_type = 335544852L; -const ISC_LONG isc_bad_substring_length = 335544853L; -const ISC_LONG isc_charset_not_installed = 335544854L; -const ISC_LONG isc_collation_not_installed = 335544855L; -const ISC_LONG isc_att_shutdown = 335544856L; -const ISC_LONG isc_blobtoobig = 335544857L; -const ISC_LONG isc_must_have_phys_field = 335544858L; -const ISC_LONG isc_invalid_time_precision = 335544859L; -const ISC_LONG isc_blob_convert_error = 335544860L; -const ISC_LONG isc_array_convert_error = 335544861L; -const ISC_LONG isc_record_lock_not_supp = 335544862L; -const ISC_LONG isc_partner_idx_not_found = 335544863L; -const ISC_LONG isc_tra_num_exc = 335544864L; -const ISC_LONG isc_field_disappeared = 335544865L; -const ISC_LONG isc_met_wrong_gtt_scope = 335544866L; -const ISC_LONG isc_subtype_for_internal_use = 335544867L; -const ISC_LONG isc_illegal_prc_type = 335544868L; -const ISC_LONG isc_invalid_sort_datatype = 335544869L; -const ISC_LONG isc_collation_name = 335544870L; -const ISC_LONG isc_domain_name = 335544871L; -const ISC_LONG isc_domnotdef = 335544872L; -const ISC_LONG isc_array_max_dimensions = 335544873L; -const ISC_LONG isc_max_db_per_trans_allowed = 335544874L; -const ISC_LONG isc_bad_debug_format = 335544875L; -const ISC_LONG isc_bad_proc_BLR = 335544876L; -const ISC_LONG isc_key_too_big = 335544877L; -const ISC_LONG isc_concurrent_transaction = 335544878L; -const ISC_LONG isc_not_valid_for_var = 335544879L; -const ISC_LONG isc_not_valid_for = 335544880L; -const ISC_LONG isc_need_difference = 335544881L; -const ISC_LONG isc_long_login = 335544882L; -const ISC_LONG isc_fldnotdef2 = 335544883L; -const ISC_LONG isc_gfix_db_name = 335740929L; -const ISC_LONG isc_gfix_invalid_sw = 335740930L; -const ISC_LONG isc_gfix_incmp_sw = 335740932L; -const ISC_LONG isc_gfix_replay_req = 335740933L; -const ISC_LONG isc_gfix_pgbuf_req = 335740934L; -const ISC_LONG isc_gfix_val_req = 335740935L; -const ISC_LONG isc_gfix_pval_req = 335740936L; -const ISC_LONG isc_gfix_trn_req = 335740937L; -const ISC_LONG isc_gfix_full_req = 335740940L; -const ISC_LONG isc_gfix_usrname_req = 335740941L; -const ISC_LONG isc_gfix_pass_req = 335740942L; -const ISC_LONG isc_gfix_subs_name = 335740943L; -const ISC_LONG isc_gfix_wal_req = 335740944L; -const ISC_LONG isc_gfix_sec_req = 335740945L; -const ISC_LONG isc_gfix_nval_req = 335740946L; -const ISC_LONG isc_gfix_type_shut = 335740947L; -const ISC_LONG isc_gfix_retry = 335740948L; -const ISC_LONG isc_gfix_retry_db = 335740951L; -const ISC_LONG isc_gfix_exceed_max = 335740991L; -const ISC_LONG isc_gfix_corrupt_pool = 335740992L; -const ISC_LONG isc_gfix_mem_exhausted = 335740993L; -const ISC_LONG isc_gfix_bad_pool = 335740994L; -const ISC_LONG isc_gfix_trn_not_valid = 335740995L; -const ISC_LONG isc_gfix_unexp_eoi = 335741012L; -const ISC_LONG isc_gfix_recon_fail = 335741018L; -const ISC_LONG isc_gfix_trn_unknown = 335741036L; -const ISC_LONG isc_gfix_mode_req = 335741038L; -const ISC_LONG isc_gfix_opt_SQL_dialect = 335741039L; -const ISC_LONG isc_gfix_pzval_req = 335741042L; -const ISC_LONG isc_dsql_dbkey_from_non_table = 336003074L; -const ISC_LONG isc_dsql_transitional_numeric = 336003075L; -const ISC_LONG isc_dsql_dialect_warning_expr = 336003076L; -const ISC_LONG isc_sql_db_dialect_dtype_unsupport = 336003077L; -const ISC_LONG isc_isc_sql_dialect_conflict_num = 336003079L; -const ISC_LONG isc_dsql_warning_number_ambiguous = 336003080L; -const ISC_LONG isc_dsql_warning_number_ambiguous1 = 336003081L; -const ISC_LONG isc_dsql_warn_precision_ambiguous = 336003082L; -const ISC_LONG isc_dsql_warn_precision_ambiguous1 = 336003083L; -const ISC_LONG isc_dsql_warn_precision_ambiguous2 = 336003084L; -const ISC_LONG isc_dsql_ambiguous_field_name = 336003085L; -const ISC_LONG isc_dsql_udf_return_pos_err = 336003086L; -const ISC_LONG isc_dsql_invalid_label = 336003087L; -const ISC_LONG isc_dsql_datatypes_not_comparable = 336003088L; -const ISC_LONG isc_dsql_cursor_invalid = 336003089L; -const ISC_LONG isc_dsql_cursor_redefined = 336003090L; -const ISC_LONG isc_dsql_cursor_not_found = 336003091L; -const ISC_LONG isc_dsql_cursor_exists = 336003092L; -const ISC_LONG isc_dsql_cursor_rel_ambiguous = 336003093L; -const ISC_LONG isc_dsql_cursor_rel_not_found = 336003094L; -const ISC_LONG isc_dsql_cursor_not_open = 336003095L; -const ISC_LONG isc_dsql_type_not_supp_ext_tab = 336003096L; -const ISC_LONG isc_dsql_feature_not_supported_ods = 336003097L; -const ISC_LONG isc_primary_key_required = 336003098L; -const ISC_LONG isc_upd_ins_doesnt_match_pk = 336003099L; -const ISC_LONG isc_upd_ins_doesnt_match_matching = 336003100L; -const ISC_LONG isc_upd_ins_with_complex_view = 336003101L; -const ISC_LONG isc_dsql_incompatible_trigger_type = 336003102L; -const ISC_LONG isc_dsql_db_trigger_type_cant_change = 336003103L; -const ISC_LONG isc_dyn_role_does_not_exist = 336068796L; -const ISC_LONG isc_dyn_no_grant_admin_opt = 336068797L; -const ISC_LONG isc_dyn_user_not_role_member = 336068798L; -const ISC_LONG isc_dyn_delete_role_failed = 336068799L; -const ISC_LONG isc_dyn_grant_role_to_user = 336068800L; -const ISC_LONG isc_dyn_inv_sql_role_name = 336068801L; -const ISC_LONG isc_dyn_dup_sql_role = 336068802L; -const ISC_LONG isc_dyn_kywd_spec_for_role = 336068803L; -const ISC_LONG isc_dyn_roles_not_supported = 336068804L; -const ISC_LONG isc_dyn_domain_name_exists = 336068812L; -const ISC_LONG isc_dyn_field_name_exists = 336068813L; -const ISC_LONG isc_dyn_dependency_exists = 336068814L; -const ISC_LONG isc_dyn_dtype_invalid = 336068815L; -const ISC_LONG isc_dyn_char_fld_too_small = 336068816L; -const ISC_LONG isc_dyn_invalid_dtype_conversion = 336068817L; -const ISC_LONG isc_dyn_dtype_conv_invalid = 336068818L; -const ISC_LONG isc_dyn_zero_len_id = 336068820L; -const ISC_LONG isc_max_coll_per_charset = 336068829L; -const ISC_LONG isc_invalid_coll_attr = 336068830L; -const ISC_LONG isc_dyn_wrong_gtt_scope = 336068840L; -const ISC_LONG isc_dyn_scale_too_big = 336068852L; -const ISC_LONG isc_dyn_precision_too_small = 336068853L; -const ISC_LONG isc_dyn_miss_priv_warning = 336068855L; -const ISC_LONG isc_dyn_ods_not_supp_feature = 336068856L; -const ISC_LONG isc_gbak_unknown_switch = 336330753L; -const ISC_LONG isc_gbak_page_size_missing = 336330754L; -const ISC_LONG isc_gbak_page_size_toobig = 336330755L; -const ISC_LONG isc_gbak_redir_ouput_missing = 336330756L; -const ISC_LONG isc_gbak_switches_conflict = 336330757L; -const ISC_LONG isc_gbak_unknown_device = 336330758L; -const ISC_LONG isc_gbak_no_protection = 336330759L; -const ISC_LONG isc_gbak_page_size_not_allowed = 336330760L; -const ISC_LONG isc_gbak_multi_source_dest = 336330761L; -const ISC_LONG isc_gbak_filename_missing = 336330762L; -const ISC_LONG isc_gbak_dup_inout_names = 336330763L; -const ISC_LONG isc_gbak_inv_page_size = 336330764L; -const ISC_LONG isc_gbak_db_specified = 336330765L; -const ISC_LONG isc_gbak_db_exists = 336330766L; -const ISC_LONG isc_gbak_unk_device = 336330767L; -const ISC_LONG isc_gbak_blob_info_failed = 336330772L; -const ISC_LONG isc_gbak_unk_blob_item = 336330773L; -const ISC_LONG isc_gbak_get_seg_failed = 336330774L; -const ISC_LONG isc_gbak_close_blob_failed = 336330775L; -const ISC_LONG isc_gbak_open_blob_failed = 336330776L; -const ISC_LONG isc_gbak_put_blr_gen_id_failed = 336330777L; -const ISC_LONG isc_gbak_unk_type = 336330778L; -const ISC_LONG isc_gbak_comp_req_failed = 336330779L; -const ISC_LONG isc_gbak_start_req_failed = 336330780L; -const ISC_LONG isc_gbak_rec_failed = 336330781L; -const ISC_LONG isc_gbak_rel_req_failed = 336330782L; -const ISC_LONG isc_gbak_db_info_failed = 336330783L; -const ISC_LONG isc_gbak_no_db_desc = 336330784L; -const ISC_LONG isc_gbak_db_create_failed = 336330785L; -const ISC_LONG isc_gbak_decomp_len_error = 336330786L; -const ISC_LONG isc_gbak_tbl_missing = 336330787L; -const ISC_LONG isc_gbak_blob_col_missing = 336330788L; -const ISC_LONG isc_gbak_create_blob_failed = 336330789L; -const ISC_LONG isc_gbak_put_seg_failed = 336330790L; -const ISC_LONG isc_gbak_rec_len_exp = 336330791L; -const ISC_LONG isc_gbak_inv_rec_len = 336330792L; -const ISC_LONG isc_gbak_exp_data_type = 336330793L; -const ISC_LONG isc_gbak_gen_id_failed = 336330794L; -const ISC_LONG isc_gbak_unk_rec_type = 336330795L; -const ISC_LONG isc_gbak_inv_bkup_ver = 336330796L; -const ISC_LONG isc_gbak_missing_bkup_desc = 336330797L; -const ISC_LONG isc_gbak_string_trunc = 336330798L; -const ISC_LONG isc_gbak_cant_rest_record = 336330799L; -const ISC_LONG isc_gbak_send_failed = 336330800L; -const ISC_LONG isc_gbak_no_tbl_name = 336330801L; -const ISC_LONG isc_gbak_unexp_eof = 336330802L; -const ISC_LONG isc_gbak_db_format_too_old = 336330803L; -const ISC_LONG isc_gbak_inv_array_dim = 336330804L; -const ISC_LONG isc_gbak_xdr_len_expected = 336330807L; -const ISC_LONG isc_gbak_open_bkup_error = 336330817L; -const ISC_LONG isc_gbak_open_error = 336330818L; -const ISC_LONG isc_gbak_missing_block_fac = 336330934L; -const ISC_LONG isc_gbak_inv_block_fac = 336330935L; -const ISC_LONG isc_gbak_block_fac_specified = 336330936L; -const ISC_LONG isc_gbak_missing_username = 336330940L; -const ISC_LONG isc_gbak_missing_password = 336330941L; -const ISC_LONG isc_gbak_missing_skipped_bytes = 336330952L; -const ISC_LONG isc_gbak_inv_skipped_bytes = 336330953L; -const ISC_LONG isc_gbak_err_restore_charset = 336330965L; -const ISC_LONG isc_gbak_err_restore_collation = 336330967L; -const ISC_LONG isc_gbak_read_error = 336330972L; -const ISC_LONG isc_gbak_write_error = 336330973L; -const ISC_LONG isc_gbak_db_in_use = 336330985L; -const ISC_LONG isc_gbak_sysmemex = 336330990L; -const ISC_LONG isc_gbak_restore_role_failed = 336331002L; -const ISC_LONG isc_gbak_role_op_missing = 336331005L; -const ISC_LONG isc_gbak_page_buffers_missing = 336331010L; -const ISC_LONG isc_gbak_page_buffers_wrong_param = 336331011L; -const ISC_LONG isc_gbak_page_buffers_restore = 336331012L; -const ISC_LONG isc_gbak_inv_size = 336331014L; -const ISC_LONG isc_gbak_file_outof_sequence = 336331015L; -const ISC_LONG isc_gbak_join_file_missing = 336331016L; -const ISC_LONG isc_gbak_stdin_not_supptd = 336331017L; -const ISC_LONG isc_gbak_stdout_not_supptd = 336331018L; -const ISC_LONG isc_gbak_bkup_corrupt = 336331019L; -const ISC_LONG isc_gbak_unk_db_file_spec = 336331020L; -const ISC_LONG isc_gbak_hdr_write_failed = 336331021L; -const ISC_LONG isc_gbak_disk_space_ex = 336331022L; -const ISC_LONG isc_gbak_size_lt_min = 336331023L; -const ISC_LONG isc_gbak_svc_name_missing = 336331025L; -const ISC_LONG isc_gbak_not_ownr = 336331026L; -const ISC_LONG isc_gbak_mode_req = 336331031L; -const ISC_LONG isc_gbak_just_data = 336331033L; -const ISC_LONG isc_gbak_data_only = 336331034L; -const ISC_LONG isc_dsql_too_old_ods = 336397205L; -const ISC_LONG isc_dsql_table_not_found = 336397206L; -const ISC_LONG isc_dsql_view_not_found = 336397207L; -const ISC_LONG isc_dsql_line_col_error = 336397208L; -const ISC_LONG isc_dsql_unknown_pos = 336397209L; -const ISC_LONG isc_dsql_no_dup_name = 336397210L; -const ISC_LONG isc_dsql_too_many_values = 336397211L; -const ISC_LONG isc_dsql_no_array_computed = 336397212L; -const ISC_LONG isc_dsql_implicit_domain_name = 336397213L; -const ISC_LONG isc_dsql_only_can_subscript_array = 336397214L; -const ISC_LONG isc_dsql_max_sort_items = 336397215L; -const ISC_LONG isc_dsql_max_group_items = 336397216L; -const ISC_LONG isc_dsql_conflicting_sort_field = 336397217L; -const ISC_LONG isc_dsql_derived_table_more_columns = 336397218L; -const ISC_LONG isc_dsql_derived_table_less_columns = 336397219L; -const ISC_LONG isc_dsql_derived_field_unnamed = 336397220L; -const ISC_LONG isc_dsql_derived_field_dup_name = 336397221L; -const ISC_LONG isc_dsql_derived_alias_select = 336397222L; -const ISC_LONG isc_dsql_derived_alias_field = 336397223L; -const ISC_LONG isc_dsql_auto_field_bad_pos = 336397224L; -const ISC_LONG isc_dsql_cte_wrong_reference = 336397225L; -const ISC_LONG isc_dsql_cte_cycle = 336397226L; -const ISC_LONG isc_dsql_cte_outer_join = 336397227L; -const ISC_LONG isc_dsql_cte_mult_references = 336397228L; -const ISC_LONG isc_dsql_cte_not_a_union = 336397229L; -const ISC_LONG isc_dsql_cte_nonrecurs_after_recurs = 336397230L; -const ISC_LONG isc_dsql_cte_wrong_clause = 336397231L; -const ISC_LONG isc_dsql_cte_union_all = 336397232L; -const ISC_LONG isc_dsql_cte_miss_nonrecursive = 336397233L; -const ISC_LONG isc_dsql_cte_nested_with = 336397234L; -const ISC_LONG isc_dsql_col_more_than_once_using = 336397235L; -const ISC_LONG isc_dsql_unsupp_feature_dialect = 336397236L; -const ISC_LONG isc_gsec_cant_open_db = 336723983L; -const ISC_LONG isc_gsec_switches_error = 336723984L; -const ISC_LONG isc_gsec_no_op_spec = 336723985L; -const ISC_LONG isc_gsec_no_usr_name = 336723986L; -const ISC_LONG isc_gsec_err_add = 336723987L; -const ISC_LONG isc_gsec_err_modify = 336723988L; -const ISC_LONG isc_gsec_err_find_mod = 336723989L; -const ISC_LONG isc_gsec_err_rec_not_found = 336723990L; -const ISC_LONG isc_gsec_err_delete = 336723991L; -const ISC_LONG isc_gsec_err_find_del = 336723992L; -const ISC_LONG isc_gsec_err_find_disp = 336723996L; -const ISC_LONG isc_gsec_inv_param = 336723997L; -const ISC_LONG isc_gsec_op_specified = 336723998L; -const ISC_LONG isc_gsec_pw_specified = 336723999L; -const ISC_LONG isc_gsec_uid_specified = 336724000L; -const ISC_LONG isc_gsec_gid_specified = 336724001L; -const ISC_LONG isc_gsec_proj_specified = 336724002L; -const ISC_LONG isc_gsec_org_specified = 336724003L; -const ISC_LONG isc_gsec_fname_specified = 336724004L; -const ISC_LONG isc_gsec_mname_specified = 336724005L; -const ISC_LONG isc_gsec_lname_specified = 336724006L; -const ISC_LONG isc_gsec_inv_switch = 336724008L; -const ISC_LONG isc_gsec_amb_switch = 336724009L; -const ISC_LONG isc_gsec_no_op_specified = 336724010L; -const ISC_LONG isc_gsec_params_not_allowed = 336724011L; -const ISC_LONG isc_gsec_incompat_switch = 336724012L; -const ISC_LONG isc_gsec_inv_username = 336724044L; -const ISC_LONG isc_gsec_inv_pw_length = 336724045L; -const ISC_LONG isc_gsec_db_specified = 336724046L; -const ISC_LONG isc_gsec_db_admin_specified = 336724047L; -const ISC_LONG isc_gsec_db_admin_pw_specified = 336724048L; -const ISC_LONG isc_gsec_sql_role_specified = 336724049L; -const ISC_LONG isc_license_no_file = 336789504L; -const ISC_LONG isc_license_op_specified = 336789523L; -const ISC_LONG isc_license_op_missing = 336789524L; -const ISC_LONG isc_license_inv_switch = 336789525L; -const ISC_LONG isc_license_inv_switch_combo = 336789526L; -const ISC_LONG isc_license_inv_op_combo = 336789527L; -const ISC_LONG isc_license_amb_switch = 336789528L; -const ISC_LONG isc_license_inv_parameter = 336789529L; -const ISC_LONG isc_license_param_specified = 336789530L; -const ISC_LONG isc_license_param_req = 336789531L; -const ISC_LONG isc_license_syntx_error = 336789532L; -const ISC_LONG isc_license_dup_id = 336789534L; -const ISC_LONG isc_license_inv_id_key = 336789535L; -const ISC_LONG isc_license_err_remove = 336789536L; -const ISC_LONG isc_license_err_update = 336789537L; -const ISC_LONG isc_license_err_convert = 336789538L; -const ISC_LONG isc_license_err_unk = 336789539L; -const ISC_LONG isc_license_svc_err_add = 336789540L; -const ISC_LONG isc_license_svc_err_remove = 336789541L; -const ISC_LONG isc_license_eval_exists = 336789563L; -const ISC_LONG isc_gstat_unknown_switch = 336920577L; -const ISC_LONG isc_gstat_retry = 336920578L; -const ISC_LONG isc_gstat_wrong_ods = 336920579L; -const ISC_LONG isc_gstat_unexpected_eof = 336920580L; -const ISC_LONG isc_gstat_open_err = 336920605L; -const ISC_LONG isc_gstat_read_err = 336920606L; -const ISC_LONG isc_gstat_sysmemex = 336920607L; -const ISC_LONG isc_fbsvcmgr_bad_am = 336986113L; -const ISC_LONG isc_fbsvcmgr_bad_wm = 336986114L; -const ISC_LONG isc_fbsvcmgr_bad_rs = 336986115L; -const ISC_LONG isc_fbsvcmgr_info_err = 336986116L; -const ISC_LONG isc_fbsvcmgr_query_err = 336986117L; -const ISC_LONG isc_fbsvcmgr_switch_unknown = 336986118L; -const ISC_LONG isc_err_max = 826; - -#else /* c definitions */ - -#define isc_facility 20 -#define isc_base 335544320L -#define isc_factor 1 - -#define isc_arg_end 0 /* end of argument list */ -#define isc_arg_gds 1 /* generic DSRI status value */ -#define isc_arg_string 2 /* string argument */ -#define isc_arg_cstring 3 /* count & string argument */ -#define isc_arg_number 4 /* numeric argument (long) */ -#define isc_arg_interpreted 5 /* interpreted status code (string) */ -#define isc_arg_vms 6 /* VAX/VMS status code (long) */ -#define isc_arg_unix 7 /* UNIX error code */ -#define isc_arg_domain 8 /* Apollo/Domain error code */ -#define isc_arg_dos 9 /* MSDOS/OS2 error code */ -#define isc_arg_mpexl 10 /* HP MPE/XL error code */ -#define isc_arg_mpexl_ipc 11 /* HP MPE/XL IPC error code */ -#define isc_arg_next_mach 15 /* NeXT/Mach error code */ -#define isc_arg_netware 16 /* NetWare error code */ -#define isc_arg_win32 17 /* Win32 error code */ -#define isc_arg_warning 18 /* warning argument */ - #define isc_arith_except 335544321L #define isc_bad_dbkey 335544322L #define isc_bad_db_format 335544323L @@ -1400,75 +509,52 @@ const ISC_LONG isc_err_max = 826; #define isc_valid_client_dialects 335544812L #define isc_optimizer_between_err 335544813L #define isc_service_not_supported 335544814L -#define isc_generator_name 335544815L -#define isc_udf_name 335544816L -#define isc_bad_limit_param 335544817L -#define isc_bad_skip_param 335544818L -#define isc_io_32bit_exceeded_err 335544819L -#define isc_invalid_savepoint 335544820L -#define isc_dsql_column_pos_err 335544821L -#define isc_dsql_agg_where_err 335544822L -#define isc_dsql_agg_group_err 335544823L -#define isc_dsql_agg_column_err 335544824L -#define isc_dsql_agg_having_err 335544825L -#define isc_dsql_agg_nested_err 335544826L -#define isc_exec_sql_invalid_arg 335544827L -#define isc_exec_sql_invalid_req 335544828L -#define isc_exec_sql_invalid_var 335544829L -#define isc_exec_sql_max_call_exceeded 335544830L -#define isc_conf_access_denied 335544831L -#define isc_wrong_backup_state 335544832L -#define isc_wal_backup_err 335544833L -#define isc_cursor_not_open 335544834L -#define isc_bad_shutdown_mode 335544835L -#define isc_concat_overflow 335544836L -#define isc_bad_substring_offset 335544837L -#define isc_foreign_key_target_doesnt_exist 335544838L -#define isc_foreign_key_references_present 335544839L -#define isc_no_update 335544840L -#define isc_cursor_already_open 335544841L -#define isc_stack_trace 335544842L -#define isc_ctx_var_not_found 335544843L -#define isc_ctx_namespace_invalid 335544844L -#define isc_ctx_too_big 335544845L -#define isc_ctx_bad_argument 335544846L -#define isc_identifier_too_long 335544847L -#define isc_except2 335544848L -#define isc_malformed_string 335544849L -#define isc_prc_out_param_mismatch 335544850L -#define isc_command_end_err2 335544851L -#define isc_partner_idx_incompat_type 335544852L -#define isc_bad_substring_length 335544853L -#define isc_charset_not_installed 335544854L -#define isc_collation_not_installed 335544855L -#define isc_att_shutdown 335544856L -#define isc_blobtoobig 335544857L -#define isc_must_have_phys_field 335544858L -#define isc_invalid_time_precision 335544859L -#define isc_blob_convert_error 335544860L -#define isc_array_convert_error 335544861L -#define isc_record_lock_not_supp 335544862L -#define isc_partner_idx_not_found 335544863L -#define isc_tra_num_exc 335544864L -#define isc_field_disappeared 335544865L -#define isc_met_wrong_gtt_scope 335544866L -#define isc_subtype_for_internal_use 335544867L -#define isc_illegal_prc_type 335544868L -#define isc_invalid_sort_datatype 335544869L -#define isc_collation_name 335544870L -#define isc_domain_name 335544871L -#define isc_domnotdef 335544872L -#define isc_array_max_dimensions 335544873L -#define isc_max_db_per_trans_allowed 335544874L -#define isc_bad_debug_format 335544875L -#define isc_bad_proc_BLR 335544876L -#define isc_key_too_big 335544877L -#define isc_concurrent_transaction 335544878L -#define isc_not_valid_for_var 335544879L -#define isc_not_valid_for 335544880L -#define isc_need_difference 335544881L -#define isc_long_login 335544882L -#define isc_fldnotdef2 335544883L +#define isc_savepoint_err 335544815L +#define isc_generator_name 335544816L +#define isc_udf_name 335544817L +#define isc_non_unique_service_name 335544818L +#define isc_tran_no_savepoint 335544819L +#define isc_must_rollback 335544820L +#define isc_tempnotsup 335544821L +#define isc_string_too_large 335544822L +#define isc_logr_timestamp_mismatch 335544823L +#define isc_old_dump_stats 335544824L +#define isc_old_appendix_stats 335544825L +#define isc_journal_not_supported 335544826L +#define isc_journal_archive_in_use 335544827L +#define isc_inet_route_failed 335544828L +#define isc_inet_route_circular 335544829L +#define isc_inet_route_multiple 335544830L +#define isc_archive_no_access 335544831L +#define isc_recover_dump_incomplete 335544832L +#define isc_recover_stats 335544833L +#define isc_recovery_in_progress 335544834L +#define isc_not_recover_dump 335544835L +#define isc_db_prealloc_warning 335544836L +#define isc_crypto_module_not_loaded 335544837L +#define isc_crypto_lookup_failed 335544838L +#define isc_crypto_invalid_version 335544839L +#define isc_sys_encrypt_passwd_no_match 335544840L +#define isc_sys_encrypt_passwd_required 335544841L +#define isc_pag_encrypt_value_corrupt 335544842L +#define isc_decrypt_of_encrypt_value_failed 335544843L +#define isc_bad_encrypt_key_length 335544844L +#define isc_encrypt_passwd_not_set 335544845L +#define isc_encryption_not_found 335544846L +#define isc_unencrypt_blob_assign 335544847L +#define isc_encryption_name 335544848L +#define isc_sep_missing_or_corrupt 335544849L +#define isc_exec_stmt2_prepare 335544850L +#define isc_exec_stmt2_non_select 335544851L +#define isc_exec_stmt2_invalid_into 335544852L +#define isc_exec_stmt2_execute 335544853L +#define isc_exec_stmt2_fetch_err 335544854L +#define isc_exec_stmt2_single_multi 335544855L +#define isc_no_blk_factor_update 335544856L +#define isc_exec_stmt_disallow 335544857L +#define isc_exec_stmt2_null 335544858L +#define isc_set_page_buffers 335544859L +#define isc_table_truncated 335544860L #define isc_gfix_db_name 335740929L #define isc_gfix_invalid_sw 335740930L #define isc_gfix_incmp_sw 335740932L @@ -1497,7 +583,7 @@ const ISC_LONG isc_err_max = 826; #define isc_gfix_trn_unknown 335741036L #define isc_gfix_mode_req 335741038L #define isc_gfix_opt_SQL_dialect 335741039L -#define isc_gfix_pzval_req 335741042L +#define isc_gfix_commits_opt 335741041L #define isc_dsql_dbkey_from_non_table 336003074L #define isc_dsql_transitional_numeric 336003075L #define isc_dsql_dialect_warning_expr 336003076L @@ -1508,25 +594,19 @@ const ISC_LONG isc_err_max = 826; #define isc_dsql_warn_precision_ambiguous 336003082L #define isc_dsql_warn_precision_ambiguous1 336003083L #define isc_dsql_warn_precision_ambiguous2 336003084L -#define isc_dsql_ambiguous_field_name 336003085L -#define isc_dsql_udf_return_pos_err 336003086L -#define isc_dsql_invalid_label 336003087L -#define isc_dsql_datatypes_not_comparable 336003088L -#define isc_dsql_cursor_invalid 336003089L -#define isc_dsql_cursor_redefined 336003090L -#define isc_dsql_cursor_not_found 336003091L -#define isc_dsql_cursor_exists 336003092L -#define isc_dsql_cursor_rel_ambiguous 336003093L -#define isc_dsql_cursor_rel_not_found 336003094L -#define isc_dsql_cursor_not_open 336003095L -#define isc_dsql_type_not_supp_ext_tab 336003096L -#define isc_dsql_feature_not_supported_ods 336003097L -#define isc_primary_key_required 336003098L -#define isc_upd_ins_doesnt_match_pk 336003099L -#define isc_upd_ins_doesnt_match_matching 336003100L -#define isc_upd_ins_with_complex_view 336003101L -#define isc_dsql_incompatible_trigger_type 336003102L -#define isc_dsql_db_trigger_type_cant_change 336003103L +#define isc_dsql_rows_ties_err 336003085L +#define isc_dsql_cursor_stmt_err 336003086L +#define isc_dsql_on_commit_invalid 336003087L +#define isc_dsql_gen_cnstrnt_ref_temp 336003088L +#define isc_dsql_persist_cnstrnt_ref_temp 336003089L +#define isc_dsql_temp_cnstrnt_ref_persist 336003090L +#define isc_dsql_persist_refs_temp 336003091L +#define isc_dsql_temp_refs_persist 336003092L +#define isc_dsql_temp_refs_mismatch 336003093L +#define isc_dsql_usrname_lower 336003094L +#define isc_dsql_select_in_batch 336003095L +#define isc_dsql_bad_encrypt_length 336003096L +#define isc_dsql_bad_passwd_digest 336003097L #define isc_dyn_role_does_not_exist 336068796L #define isc_dyn_no_grant_admin_opt 336068797L #define isc_dyn_user_not_role_member 336068798L @@ -1543,14 +623,24 @@ const ISC_LONG isc_err_max = 826; #define isc_dyn_char_fld_too_small 336068816L #define isc_dyn_invalid_dtype_conversion 336068817L #define isc_dyn_dtype_conv_invalid 336068818L -#define isc_dyn_zero_len_id 336068820L -#define isc_max_coll_per_charset 336068829L -#define isc_invalid_coll_attr 336068830L -#define isc_dyn_wrong_gtt_scope 336068840L -#define isc_dyn_scale_too_big 336068852L -#define isc_dyn_precision_too_small 336068853L -#define isc_dyn_miss_priv_warning 336068855L -#define isc_dyn_ods_not_supp_feature 336068856L +#define isc_dyn_gen_does_not_exist 336068820L +#define isc_dyn_delete_generator_failed 336068821L +#define isc_dyn_drop_db_owner 336068836L +#define isc_dyn_encrypt_admin_option_require 336068840L +#define isc_dyn_sys_encrypt_passwd_not_set 336068841L +#define isc_dyn_define_encrypt_failed 336068842L +#define isc_dyn_encrypt_not_supported 336068843L +#define isc_dyn_dso_required 336068844L +#define isc_dyn_encryption_not_found 336068851L +#define isc_dyn_default_encryption_exists 336068852L +#define isc_dyn_encrypt_passwd_invalid 336068853L +#define isc_dyn_encrypt_password_col_invalid 336068854L +#define isc_dyn_subscribe_not_supported 336068860L +#define isc_dyn_define_subscript_failed 336068862L +#define isc_dyn_relation_notfound 336068864L +#define isc_dyn_delete_subscribers_failed 336068869L +#define isc_dyn_subscribers_exist 336068870L +#define isc_dyn_delete_subscription_failed 336068871L #define isc_gbak_unknown_switch 336330753L #define isc_gbak_page_size_missing 336330754L #define isc_gbak_page_size_toobig 336330755L @@ -1633,40 +723,15 @@ const ISC_LONG isc_err_max = 826; #define isc_gbak_svc_name_missing 336331025L #define isc_gbak_not_ownr 336331026L #define isc_gbak_mode_req 336331031L -#define isc_gbak_just_data 336331033L -#define isc_gbak_data_only 336331034L -#define isc_dsql_too_old_ods 336397205L -#define isc_dsql_table_not_found 336397206L -#define isc_dsql_view_not_found 336397207L -#define isc_dsql_line_col_error 336397208L -#define isc_dsql_unknown_pos 336397209L -#define isc_dsql_no_dup_name 336397210L -#define isc_dsql_too_many_values 336397211L -#define isc_dsql_no_array_computed 336397212L -#define isc_dsql_implicit_domain_name 336397213L -#define isc_dsql_only_can_subscript_array 336397214L -#define isc_dsql_max_sort_items 336397215L -#define isc_dsql_max_group_items 336397216L -#define isc_dsql_conflicting_sort_field 336397217L -#define isc_dsql_derived_table_more_columns 336397218L -#define isc_dsql_derived_table_less_columns 336397219L -#define isc_dsql_derived_field_unnamed 336397220L -#define isc_dsql_derived_field_dup_name 336397221L -#define isc_dsql_derived_alias_select 336397222L -#define isc_dsql_derived_alias_field 336397223L -#define isc_dsql_auto_field_bad_pos 336397224L -#define isc_dsql_cte_wrong_reference 336397225L -#define isc_dsql_cte_cycle 336397226L -#define isc_dsql_cte_outer_join 336397227L -#define isc_dsql_cte_mult_references 336397228L -#define isc_dsql_cte_not_a_union 336397229L -#define isc_dsql_cte_nonrecurs_after_recurs 336397230L -#define isc_dsql_cte_wrong_clause 336397231L -#define isc_dsql_cte_union_all 336397232L -#define isc_dsql_cte_miss_nonrecursive 336397233L -#define isc_dsql_cte_nested_with 336397234L -#define isc_dsql_col_more_than_once_using 336397235L -#define isc_dsql_unsupp_feature_dialect 336397236L +#define isc_gbak_validate_restore 336331034L +#define isc_gbak_write_req 336331073L +#define isc_gbak_wish_list 336331074L +#define isc_gbak_ods_version_major 336331075L +#define isc_gbak_starting_trans 336331076L +#define isc_gbak_ods_version_major_missing 336331077L +#define isc_gbak_starting_trans_missing 336331078L +#define isc_gbak_wrong_param 336331079L +#define isc_HLP_SETSAVEPOINT 336658539L #define isc_gsec_cant_open_db 336723983L #define isc_gsec_switches_error 336723984L #define isc_gsec_no_op_spec 336723985L @@ -1719,6 +784,15 @@ const ISC_LONG isc_err_max = 826; #define isc_license_svc_err_add 336789540L #define isc_license_svc_err_remove 336789541L #define isc_license_eval_exists 336789563L +#define isc_smp_cpu_license 336789570L +#define isc_node_locked_full_unlimited_serve 336789571L +#define isc_dev_only_full_server_licenses 336789572L +#define isc_license_not_registered 336789573L +#define isc_license_library_unloadable 336789574L +#define isc_license_registration_file 336789575L +#define isc_license_expire_limit 336789576L +#define isc_license_bad_reg_file 336789577L +#define isc_license_bad_lic_file 336789578L #define isc_gstat_unknown_switch 336920577L #define isc_gstat_retry 336920578L #define isc_gstat_wrong_ods 336920579L @@ -1726,14 +800,6 @@ const ISC_LONG isc_err_max = 826; #define isc_gstat_open_err 336920605L #define isc_gstat_read_err 336920606L #define isc_gstat_sysmemex 336920607L -#define isc_fbsvcmgr_bad_am 336986113L -#define isc_fbsvcmgr_bad_wm 336986114L -#define isc_fbsvcmgr_bad_rs 336986115L -#define isc_fbsvcmgr_info_err 336986116L -#define isc_fbsvcmgr_query_err 336986117L -#define isc_fbsvcmgr_switch_unknown 336986118L -#define isc_err_max 826 +#define isc_err_max 785 +/* END CONVERT TAG */ -#endif - -#endif /* JRD_GEN_IBERROR_H */ diff --git a/libraries/SQLAPI/include/odbcAPI.h b/libraries/SQLAPI/include/odbcAPI.h index 20f2dd5f5..d3827d27d 100644 --- a/libraries/SQLAPI/include/odbcAPI.h +++ b/libraries/SQLAPI/include/odbcAPI.h @@ -464,7 +464,23 @@ class SQLAPI_API odbcCommandHandles : public saCommandHandles public: odbcCommandHandles(); - SQLHSTMT m_hstmt; + SQLHSTMT m_hstmt; +}; + +class SQLAPI_API odbcExternalConnection +{ + bool m_bAttached; + SAConnection *m_pCon; + +public: + SQLHENV m_henv; + SQLHDBC m_hdbc; + +public: + odbcExternalConnection(SAConnection *pCon, SQLHENV henv, SQLHDBC hdbc); + void Attach(); + void Detach(); + ~odbcExternalConnection(); }; extern odbcAPI g_odbcAPI; diff --git a/libraries/SQLAPI/include/oraAPI.h b/libraries/SQLAPI/include/oraAPI.h index d27c86686..2568cb01b 100644 --- a/libraries/SQLAPI/include/oraAPI.h +++ b/libraries/SQLAPI/include/oraAPI.h @@ -1,532 +1,593 @@ -// ora8API.h -// -////////////////////////////////////////////////////////////////////// - -#if !defined(__ORA8API_H__) -#define __ORA8API_H__ - -#include "SQLAPI.h" - -// API header(s) -#include - -extern long g_nORA8DLLVersionLoaded; - -extern void AddORA8Support(const SAConnection * pCon); -extern void ReleaseORA8Support(); - -// 8.0.x calls -typedef sword (*OCIInitialize_t)(ub4 mode, dvoid *ctxp, - dvoid *(*malocfp)(dvoid *ctxp, size_t size), - dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize), - void (*mfreefp)(dvoid *ctxp, dvoid *memptr) ); - -typedef sword (*OCIHandleAlloc_t)(CONST dvoid *parenth, dvoid **hndlpp, CONST ub4 type, - CONST size_t xtramem_sz, dvoid **usrmempp); - -typedef sword (*OCIHandleFree_t)(dvoid *hndlp, CONST ub4 type); - - -typedef sword (*OCIDescriptorAlloc_t)(CONST dvoid *parenth, dvoid **descpp, CONST ub4 type, - CONST size_t xtramem_sz, dvoid **usrmempp); - -typedef sword (*OCIDescriptorFree_t)(dvoid *descp, CONST ub4 type); - -typedef sword (*OCIEnvInit_t)(OCIEnv **envp, ub4 mode, - size_t xtramem_sz, dvoid **usrmempp); - -typedef sword (*OCIServerAttach_t)(OCIServer *srvhp, OCIError *errhp, - CONST text *dblink, sb4 dblink_len, ub4 mode); - -typedef sword (*OCIServerDetach_t)(OCIServer *srvhp, OCIError *errhp, ub4 mode); - -typedef sword (*OCISessionBegin_t)(OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp, - ub4 credt, ub4 mode); - -typedef sword (*OCISessionEnd_t)(OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp, - ub4 mode); - -typedef sword (*OCILogon_t)(OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp, - CONST text *username, ub4 uname_len, - CONST text *password, ub4 passwd_len, - CONST text *dbname, ub4 dbname_len); - -typedef sword (*OCILogoff_t)(OCISvcCtx *svchp, OCIError *errhp); - - -typedef sword (*OCIPasswordChange_t)(OCISvcCtx *svchp, OCIError *errhp, - CONST text *user_name, ub4 usernm_len, - CONST text *opasswd, ub4 opasswd_len, - CONST text *npasswd, ub4 npasswd_len, ub4 mode); - -typedef sword (*OCIStmtPrepare_t)(OCIStmt *stmtp, OCIError *errhp, CONST text *stmt, - ub4 stmt_len, ub4 language, ub4 mode); - -typedef sword (*OCIBindByPos_t)(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp, - ub4 position, dvoid *valuep, sb4 value_sz, - ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep, - ub4 maxarr_len, ub4 *curelep, ub4 mode); - -typedef sword (*OCIBindByName_t)(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp, - CONST text *placeholder, sb4 placeh_len, - dvoid *valuep, sb4 value_sz, ub2 dty, - dvoid *indp, ub2 *alenp, ub2 *rcodep, - ub4 maxarr_len, ub4 *curelep, ub4 mode); - -typedef sword (*OCIBindObject_t)(OCIBind *bindp, OCIError *errhp, CONST OCIType *type, - dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp, - ub4 *indszp); - -typedef sword (*OCIBindDynamic_t)(OCIBind *bindp, OCIError *errhp, dvoid *ictxp, - OCICallbackInBind icbfp, dvoid *octxp, - OCICallbackOutBind ocbfp); - -typedef sword (*OCIBindArrayOfStruct_t)(OCIBind *bindp, OCIError *errhp, - ub4 pvskip, ub4 indskip, - ub4 alskip, ub4 rcskip); - -typedef sword (*OCIStmtGetPieceInfo_t)(OCIStmt *stmtp, OCIError *errhp, - dvoid **hndlpp, ub4 *typep, - ub1 *in_outp, ub4 *iterp, ub4 *idxp, - ub1 *piecep); - -typedef sword (*OCIStmtSetPieceInfo_t)(dvoid *hndlp, ub4 type, OCIError *errhp, - CONST dvoid *bufp, ub4 *alenp, ub1 piece, - CONST dvoid *indp, ub2 *rcodep); - -typedef sword (*OCIStmtExecute_t)(OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, - ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in, - OCISnapshot *snap_out, ub4 mode); - -typedef sword (*OCIDefineByPos_t)(OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp, - ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty, - dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode); - -typedef sword (*OCIDefineObject_t)(OCIDefine *defnp, OCIError *errhp, - CONST OCIType *type, dvoid **pgvpp, - ub4 *pvszsp, dvoid **indpp, ub4 *indszp); - -typedef sword (*OCIDefineDynamic_t)(OCIDefine *defnp, OCIError *errhp, dvoid *octxp, - OCICallbackDefine ocbfp); - -typedef sword (*OCIDefineArrayOfStruct_t)(OCIDefine *defnp, OCIError *errhp, ub4 pvskip, - ub4 indskip, ub4 rlskip, ub4 rcskip); - -typedef sword (*OCIStmtFetch_t)(OCIStmt *stmtp, OCIError *errhp, ub4 nrows, - ub2 orientation, ub4 mode); - -typedef sword (*OCIStmtGetBindInfo_t)(OCIStmt *stmtp, OCIError *errhp, ub4 size, - ub4 startloc, - sb4 *found, text *bvnp[], ub1 bvnl[], - text *invp[], ub1 inpl[], ub1 dupl[], - OCIBind *hndl[]); - -typedef sword (*OCIDescribeAny_t)(OCISvcCtx *svchp, OCIError *errhp, - dvoid *objptr, - ub4 objnm_len, ub1 objptr_typ, ub1 info_level, - ub1 objtyp, OCIDescribe *dschp); - -typedef sword (*OCIParamGet_t)(CONST dvoid *hndlp, ub4 htype, OCIError *errhp, - dvoid **parmdpp, ub4 pos); - -typedef sword (*OCIParamSet_t)(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp, - ub4 dtyp, ub4 pos); - -typedef sword (*OCITransStart_t)(OCISvcCtx *svchp, OCIError *errhp, - uword timeout, ub4 flags ); - -typedef sword (*OCITransDetach_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags ); - -typedef sword (*OCITransCommit_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags); - -typedef sword (*OCITransRollback_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags); - -typedef sword (*OCITransPrepare_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags); - -typedef sword (*OCITransForget_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags); - -typedef sword (*OCIErrorGet_t)(dvoid *hndlp, ub4 recordno, text *sqlstate, - sb4 *errcodep, text *bufp, ub4 bufsiz, ub4 type); - -typedef sword (*OCILobAppend_t)(OCISvcCtx *svchp, OCIError *errhp, - OCILobLocator *dst_locp, - OCILobLocator *src_locp); - -typedef sword (*OCILobAssign_t)(OCIEnv *envhp, OCIError *errhp, - CONST OCILobLocator *src_locp, - OCILobLocator **dst_locpp); - -typedef sword (*OCILobCharSetForm_t)(OCIEnv *envhp, OCIError *errhp, - CONST OCILobLocator *locp, ub1 *csfrm); - -typedef sword (*OCILobCharSetId_t)(OCIEnv *envhp, OCIError *errhp, - CONST OCILobLocator *locp, ub2 *csid); - -typedef sword (*OCILobCopy_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp, - OCILobLocator *src_locp, ub4 amount, ub4 dst_offset, - ub4 src_offset); - -typedef sword (*OCILobDisableBuffering_t)(OCISvcCtx *svchp, - OCIError *errhp, - OCILobLocator *locp); - -typedef sword (*OCILobEnableBuffering_t)(OCISvcCtx *svchp, - OCIError *errhp, - OCILobLocator *locp); - -typedef sword (*OCILobErase_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, - ub4 *amount, ub4 offset); - -typedef sword (*OCILobFileClose_t)(OCISvcCtx *svchp, OCIError *errhp, - OCILobLocator *filep); - -typedef sword (*OCILobFileCloseAll_t)(OCISvcCtx *svchp, OCIError *errhp); - -typedef sword (*OCILobFileExists_t)(OCISvcCtx *svchp, OCIError *errhp, - OCILobLocator *filep, - boolean *flag); - -typedef sword (*OCILobFileGetName_t)(OCIEnv *envhp, OCIError *errhp, - CONST OCILobLocator *filep, - text *dir_alias, ub2 *d_length, - text *filename, ub2 *f_length); - -typedef sword (*OCILobFileIsOpen_t)(OCISvcCtx *svchp, OCIError *errhp, - OCILobLocator *filep, - boolean *flag); - -typedef sword (*OCILobFileOpen_t)(OCISvcCtx *svchp, OCIError *errhp, - OCILobLocator *filep, - ub1 mode); - -typedef sword (*OCILobFileSetName_t)(OCIEnv *envhp, OCIError *errhp, - OCILobLocator **filepp, - CONST text *dir_alias, ub2 d_length, - CONST text *filename, ub2 f_length); - -typedef sword (*OCILobFlushBuffer_t)(OCISvcCtx *svchp, - OCIError *errhp, - OCILobLocator *locp, - ub4 flag); - -typedef sword (*OCILobGetLength_t)(OCISvcCtx *svchp, OCIError *errhp, - OCILobLocator *locp, - ub4 *lenp); - -typedef sword (*OCILobIsEqual_t)(OCIEnv *envhp, CONST OCILobLocator *x, - CONST OCILobLocator *y, - boolean *is_equal); - -typedef sword (*OCILobLoadFromFile_t)(OCISvcCtx *svchp, OCIError *errhp, - OCILobLocator *dst_locp, - OCILobLocator *src_filep, - ub4 amount, ub4 dst_offset, - ub4 src_offset); - -typedef sword (*OCILobLocatorIsInit_t)(OCIEnv *envhp, OCIError *errhp, - CONST OCILobLocator *locp, - boolean *is_initialized); - -typedef sword (*OCILobRead_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, - ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl, - dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, - CONST dvoid *bufp, - ub4 len, - ub1 piece), - ub2 csid, ub1 csfrm); - -typedef sword (*OCILobRead2_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, - oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset, dvoid *bufp, oraub8 bufl, - ub1 piece, dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, - CONST dvoid *bufp, - oraub8 len, ub1 piecep, - dvoid **changed_bufpp,oraub8 *changed_lenp), - ub2 csid, ub1 csfrm); - -typedef sword (*OCILobTrim_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, - ub4 newlen); - -typedef sword (*OCILobWrite_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, - ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, - ub1 piece, dvoid *ctxp, - sb4 (*cbfp)(dvoid *ctxp, - dvoid *bufp, - ub4 *len, - ub1 *piece), - ub2 csid, ub1 csfrm); - -typedef sword (*OCILobWrite2_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, - oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset, - void *bufp, oraub8 buflen, ub1 piece, void *ctxp, - OCICallbackLobWrite2 cbfp, ub2 csid, ub1 csfrm); - -typedef sword (*OCIBreak_t)(dvoid *hndlp, OCIError *errhp); - -typedef sword (*OCIReset_t)(dvoid *hndlp, OCIError *errhp); - -typedef sword (*OCIServerVersion_t)(dvoid *hndlp, OCIError *errhp, text *bufp, - ub4 bufsz, - ub1 hndltype); - - -typedef sword (*OCIAttrGet_t)(CONST dvoid *trgthndlp, ub4 trghndltyp, - dvoid *attributep, ub4 *sizep, ub4 attrtype, - OCIError *errhp); - -typedef sword (*OCIAttrSet_t)(dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep, - ub4 size, ub4 attrtype, OCIError *errhp); - -typedef sword (*OCISvcCtxToLda_t)(OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap); - -typedef sword (*OCILdaToSvcCtx_t)(OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap); - -typedef sword (*OCIResultSetToStmt_t)(OCIResult *rsetdp, OCIError *errhp); - - -// 8.1.x (8i) calls -typedef sword (*OCIEnvCreate_t)(OCIEnv **envp, ub4 mode, dvoid *ctxp, - dvoid *(*malocfp)(dvoid *ctxp, size_t size), - dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize), - void (*mfreefp)(dvoid *ctxp, dvoid *memptr), - size_t xtramem_sz, dvoid **usrmempp); - -typedef sword (*OCIEnvNlsCreate_t)(OCIEnv **envhpp, ub4 mode, dvoid *ctxp, - dvoid *(*malocfp)(dvoid *ctxp, size_t size), - dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize), - void (*mfreefp)(dvoid *ctxp, dvoid *memptr), - size_t xtramemsz, dvoid **usrmempp, - ub2 charset, ub2 ncharset); - -typedef sword (*OCIDurationBegin_t)( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, - OCIDuration parent, OCIDuration *dur ); - -typedef sword (*OCIDurationEnd_t)( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, - OCIDuration duration ); - -typedef sword (*OCILobCreateTemporary_t)(OCISvcCtx *svchp, - OCIError *errhp, - OCILobLocator *locp, - ub2 csid, - ub1 csfrm, - ub1 lobtype, - boolean cache, - OCIDuration duration); - -typedef sword (*OCILobFreeTemporary_t)(OCISvcCtx *svchp, - OCIError *errhp, - OCILobLocator *locp); - -typedef sword (*OCILobIsTemporary_t)(OCIEnv *envp, - OCIError *errhp, - OCILobLocator *locp, - boolean *is_temporary); - -typedef sword (*OCIAQEnq_t)(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name, - OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop, - OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind, - OCIRaw **msgid, ub4 flags); - -typedef sword (*OCIAQDeq_t)(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name, - OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop, - OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind, - OCIRaw **msgid, ub4 flags); - -typedef sword (*OCIAQListen_t)(OCISvcCtx *svchp, OCIError *errhp, - OCIAQAgent **agent_list, ub4 num_agents, - sb4 wait, OCIAQAgent **agent, - ub4 flags); - -typedef sword (*OCIStmtFetch2_t)(OCIStmt *stmtp, OCIError *errhp, ub4 nrows, - ub2 orientation, sb4 scrollOffset, ub4 mode ); - -//--------------- Begin OCI Client Notification Interfaces ------------------ - -typedef sword (*OCISubscriptionRegister_t)(OCISvcCtx *svchp, OCISubscription **subscrhpp, - ub2 count, OCIError *errhp, ub4 mode); - -typedef sword (*OCISubscriptionPost_t)(OCISvcCtx *svchp, OCISubscription **subscrhpp, - ub2 count, OCIError *errhp, ub4 mode); - -typedef sword (*OCISubscriptionUnRegister_t)(OCISvcCtx *svchp, OCISubscription *subscrhp, - OCIError *errhp, ub4 mode); - -typedef sword (*OCISubscriptionDisable_t)(OCISubscription *subscrhp, - OCIError *errhp, ub4 mode); - -typedef sword (*OCISubscriptionEnable_t)(OCISubscription *subscrhp, - OCIError *errhp, ub4 mode); - -//------------------- End OCI Publish/Subscribe Interfaces ------------------ - - -typedef sword (*OCIDateTimeConstruct_t)( dvoid *hndl, - OCIError *err, OCIDateTime *datetime, - sb2 year, ub1 month, ub1 day, - ub1 hour, ub1 min, ub1 sec, ub4 fsec, - OraText *timezone, size_t timezone_length); - -typedef sword (*OCIDateTimeGetDate_t)(dvoid *hndl, - OCIError *err, CONST OCIDateTime *datetime, - sb2 *year, ub1 *month, ub1 *day); - -typedef sword (*OCIDateTimeGetTime_t)(dvoid *hndl, - OCIError *err, OCIDateTime *datetime, - ub1 *hour, ub1 *min, ub1 *sec, ub4 *fsec); - - +// ora8API.h +// +////////////////////////////////////////////////////////////////////// + +#if !defined(__ORA8API_H__) +#define __ORA8API_H__ + +#include "SQLAPI.h" + +// API header(s) +#include + +extern long g_nORA8DLLVersionLoaded; + +extern void AddORA8Support(const SAConnection * pCon); +extern void ReleaseORA8Support(); + +// 8.0.x calls +typedef sword (*OCIInitialize_t)(ub4 mode, dvoid *ctxp, + dvoid *(*malocfp)(dvoid *ctxp, size_t size), + dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize), + void (*mfreefp)(dvoid *ctxp, dvoid *memptr) ); + +typedef sword (*OCIHandleAlloc_t)(CONST dvoid *parenth, dvoid **hndlpp, CONST ub4 type, + CONST size_t xtramem_sz, dvoid **usrmempp); + +typedef sword (*OCIHandleFree_t)(dvoid *hndlp, CONST ub4 type); + + +typedef sword (*OCIDescriptorAlloc_t)(CONST dvoid *parenth, dvoid **descpp, CONST ub4 type, + CONST size_t xtramem_sz, dvoid **usrmempp); + +typedef sword (*OCIDescriptorFree_t)(dvoid *descp, CONST ub4 type); + +typedef sword (*OCIEnvInit_t)(OCIEnv **envp, ub4 mode, + size_t xtramem_sz, dvoid **usrmempp); + +typedef sword (*OCIServerAttach_t)(OCIServer *srvhp, OCIError *errhp, + CONST text *dblink, sb4 dblink_len, ub4 mode); + +typedef sword (*OCIServerDetach_t)(OCIServer *srvhp, OCIError *errhp, ub4 mode); + +typedef sword (*OCISessionBegin_t)(OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp, + ub4 credt, ub4 mode); + +typedef sword (*OCISessionEnd_t)(OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp, + ub4 mode); + +typedef sword (*OCILogon_t)(OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp, + CONST text *username, ub4 uname_len, + CONST text *password, ub4 passwd_len, + CONST text *dbname, ub4 dbname_len); + +typedef sword (*OCILogoff_t)(OCISvcCtx *svchp, OCIError *errhp); + + +typedef sword (*OCIPasswordChange_t)(OCISvcCtx *svchp, OCIError *errhp, + CONST text *user_name, ub4 usernm_len, + CONST text *opasswd, ub4 opasswd_len, + CONST text *npasswd, ub4 npasswd_len, ub4 mode); + +typedef sword (*OCIStmtPrepare_t)(OCIStmt *stmtp, OCIError *errhp, CONST text *stmt, + ub4 stmt_len, ub4 language, ub4 mode); + +typedef sword (*OCIBindByPos_t)(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp, + ub4 position, dvoid *valuep, sb4 value_sz, + ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep, + ub4 maxarr_len, ub4 *curelep, ub4 mode); + +typedef sword (*OCIBindByName_t)(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp, + CONST text *placeholder, sb4 placeh_len, + dvoid *valuep, sb4 value_sz, ub2 dty, + dvoid *indp, ub2 *alenp, ub2 *rcodep, + ub4 maxarr_len, ub4 *curelep, ub4 mode); + +typedef sword (*OCIBindObject_t)(OCIBind *bindp, OCIError *errhp, CONST OCIType *type, + dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp, + ub4 *indszp); + +typedef sword (*OCIBindDynamic_t)(OCIBind *bindp, OCIError *errhp, dvoid *ictxp, + OCICallbackInBind icbfp, dvoid *octxp, + OCICallbackOutBind ocbfp); + +typedef sword (*OCIBindArrayOfStruct_t)(OCIBind *bindp, OCIError *errhp, + ub4 pvskip, ub4 indskip, + ub4 alskip, ub4 rcskip); + +typedef sword (*OCIStmtGetPieceInfo_t)(OCIStmt *stmtp, OCIError *errhp, + dvoid **hndlpp, ub4 *typep, + ub1 *in_outp, ub4 *iterp, ub4 *idxp, + ub1 *piecep); + +typedef sword (*OCIStmtSetPieceInfo_t)(dvoid *hndlp, ub4 type, OCIError *errhp, + CONST dvoid *bufp, ub4 *alenp, ub1 piece, + CONST dvoid *indp, ub2 *rcodep); + +typedef sword (*OCIStmtExecute_t)(OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, + ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in, + OCISnapshot *snap_out, ub4 mode); + +typedef sword (*OCIDefineByPos_t)(OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp, + ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty, + dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode); + +typedef sword (*OCIDefineObject_t)(OCIDefine *defnp, OCIError *errhp, + CONST OCIType *type, dvoid **pgvpp, + ub4 *pvszsp, dvoid **indpp, ub4 *indszp); + +typedef sword (*OCIDefineDynamic_t)(OCIDefine *defnp, OCIError *errhp, dvoid *octxp, + OCICallbackDefine ocbfp); + +typedef sword (*OCIDefineArrayOfStruct_t)(OCIDefine *defnp, OCIError *errhp, ub4 pvskip, + ub4 indskip, ub4 rlskip, ub4 rcskip); + +typedef sword (*OCIStmtFetch_t)(OCIStmt *stmtp, OCIError *errhp, ub4 nrows, + ub2 orientation, ub4 mode); + +typedef sword (*OCIStmtGetBindInfo_t)(OCIStmt *stmtp, OCIError *errhp, ub4 size, + ub4 startloc, + sb4 *found, text *bvnp[], ub1 bvnl[], + text *invp[], ub1 inpl[], ub1 dupl[], + OCIBind *hndl[]); + +typedef sword (*OCIDescribeAny_t)(OCISvcCtx *svchp, OCIError *errhp, + dvoid *objptr, + ub4 objnm_len, ub1 objptr_typ, ub1 info_level, + ub1 objtyp, OCIDescribe *dschp); + +typedef sword (*OCIParamGet_t)(CONST dvoid *hndlp, ub4 htype, OCIError *errhp, + dvoid **parmdpp, ub4 pos); + +typedef sword (*OCIParamSet_t)(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp, + ub4 dtyp, ub4 pos); + +typedef sword (*OCITransStart_t)(OCISvcCtx *svchp, OCIError *errhp, + uword timeout, ub4 flags ); + +typedef sword (*OCITransDetach_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags ); + +typedef sword (*OCITransCommit_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags); + +typedef sword (*OCITransRollback_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags); + +typedef sword (*OCITransPrepare_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags); + +typedef sword (*OCITransForget_t)(OCISvcCtx *svchp, OCIError *errhp, ub4 flags); + +typedef sword (*OCIErrorGet_t)(dvoid *hndlp, ub4 recordno, text *sqlstate, + sb4 *errcodep, text *bufp, ub4 bufsiz, ub4 type); + +typedef sword (*OCILobAppend_t)(OCISvcCtx *svchp, OCIError *errhp, + OCILobLocator *dst_locp, + OCILobLocator *src_locp); + +typedef sword (*OCILobAssign_t)(OCIEnv *envhp, OCIError *errhp, + CONST OCILobLocator *src_locp, + OCILobLocator **dst_locpp); + +typedef sword (*OCILobCharSetForm_t)(OCIEnv *envhp, OCIError *errhp, + CONST OCILobLocator *locp, ub1 *csfrm); + +typedef sword (*OCILobCharSetId_t)(OCIEnv *envhp, OCIError *errhp, + CONST OCILobLocator *locp, ub2 *csid); + +typedef sword (*OCILobCopy_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp, + OCILobLocator *src_locp, ub4 amount, ub4 dst_offset, + ub4 src_offset); + +typedef sword (*OCILobDisableBuffering_t)(OCISvcCtx *svchp, + OCIError *errhp, + OCILobLocator *locp); + +typedef sword (*OCILobEnableBuffering_t)(OCISvcCtx *svchp, + OCIError *errhp, + OCILobLocator *locp); + +typedef sword (*OCILobErase_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, + ub4 *amount, ub4 offset); + +typedef sword (*OCILobFileClose_t)(OCISvcCtx *svchp, OCIError *errhp, + OCILobLocator *filep); + +typedef sword (*OCILobFileCloseAll_t)(OCISvcCtx *svchp, OCIError *errhp); + +typedef sword (*OCILobFileExists_t)(OCISvcCtx *svchp, OCIError *errhp, + OCILobLocator *filep, + boolean *flag); + +typedef sword (*OCILobFileGetName_t)(OCIEnv *envhp, OCIError *errhp, + CONST OCILobLocator *filep, + text *dir_alias, ub2 *d_length, + text *filename, ub2 *f_length); + +typedef sword (*OCILobFileIsOpen_t)(OCISvcCtx *svchp, OCIError *errhp, + OCILobLocator *filep, + boolean *flag); + +typedef sword (*OCILobFileOpen_t)(OCISvcCtx *svchp, OCIError *errhp, + OCILobLocator *filep, + ub1 mode); + +typedef sword (*OCILobFileSetName_t)(OCIEnv *envhp, OCIError *errhp, + OCILobLocator **filepp, + CONST text *dir_alias, ub2 d_length, + CONST text *filename, ub2 f_length); + +typedef sword (*OCILobFlushBuffer_t)(OCISvcCtx *svchp, + OCIError *errhp, + OCILobLocator *locp, + ub4 flag); + +typedef sword (*OCILobGetLength_t)(OCISvcCtx *svchp, OCIError *errhp, + OCILobLocator *locp, + ub4 *lenp); + +typedef sword (*OCILobIsEqual_t)(OCIEnv *envhp, CONST OCILobLocator *x, + CONST OCILobLocator *y, + boolean *is_equal); + +typedef sword (*OCILobLoadFromFile_t)(OCISvcCtx *svchp, OCIError *errhp, + OCILobLocator *dst_locp, + OCILobLocator *src_filep, + ub4 amount, ub4 dst_offset, + ub4 src_offset); + +typedef sword (*OCILobLocatorIsInit_t)(OCIEnv *envhp, OCIError *errhp, + CONST OCILobLocator *locp, + boolean *is_initialized); + +typedef sword (*OCILobRead_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, + ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl, + dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, + CONST dvoid *bufp, + ub4 len, + ub1 piece), + ub2 csid, ub1 csfrm); + +typedef sword (*OCILobRead2_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, + oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset, dvoid *bufp, oraub8 bufl, + ub1 piece, dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, + CONST dvoid *bufp, + oraub8 len, ub1 piecep, + dvoid **changed_bufpp,oraub8 *changed_lenp), + ub2 csid, ub1 csfrm); + +typedef sword (*OCILobTrim_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, + ub4 newlen); + +typedef sword (*OCILobWrite_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, + ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, + ub1 piece, dvoid *ctxp, + sb4 (*cbfp)(dvoid *ctxp, + dvoid *bufp, + ub4 *len, + ub1 *piece), + ub2 csid, ub1 csfrm); + +typedef sword (*OCILobWrite2_t)(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp, + oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset, + void *bufp, oraub8 buflen, ub1 piece, void *ctxp, + OCICallbackLobWrite2 cbfp, ub2 csid, ub1 csfrm); + +typedef sword (*OCIBreak_t)(dvoid *hndlp, OCIError *errhp); + +typedef sword (*OCIReset_t)(dvoid *hndlp, OCIError *errhp); + +typedef sword (*OCIServerVersion_t)(dvoid *hndlp, OCIError *errhp, text *bufp, + ub4 bufsz, + ub1 hndltype); + + +typedef sword (*OCIAttrGet_t)(CONST dvoid *trgthndlp, ub4 trghndltyp, + dvoid *attributep, ub4 *sizep, ub4 attrtype, + OCIError *errhp); + +typedef sword (*OCIAttrSet_t)(dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep, + ub4 size, ub4 attrtype, OCIError *errhp); + +typedef sword (*OCISvcCtxToLda_t)(OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap); + +typedef sword (*OCILdaToSvcCtx_t)(OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap); + +typedef sword (*OCIResultSetToStmt_t)(OCIResult *rsetdp, OCIError *errhp); + + +// 8.1.x (8i) calls +typedef sword (*OCIEnvCreate_t)(OCIEnv **envp, ub4 mode, dvoid *ctxp, + dvoid *(*malocfp)(dvoid *ctxp, size_t size), + dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize), + void (*mfreefp)(dvoid *ctxp, dvoid *memptr), + size_t xtramem_sz, dvoid **usrmempp); + +typedef sword (*OCIEnvNlsCreate_t)(OCIEnv **envhpp, ub4 mode, dvoid *ctxp, + dvoid *(*malocfp)(dvoid *ctxp, size_t size), + dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize), + void (*mfreefp)(dvoid *ctxp, dvoid *memptr), + size_t xtramemsz, dvoid **usrmempp, + ub2 charset, ub2 ncharset); + +typedef sword (*OCIDurationBegin_t)( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, + OCIDuration parent, OCIDuration *dur ); + +typedef sword (*OCIDurationEnd_t)( OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, + OCIDuration duration ); + +typedef sword (*OCILobCreateTemporary_t)(OCISvcCtx *svchp, + OCIError *errhp, + OCILobLocator *locp, + ub2 csid, + ub1 csfrm, + ub1 lobtype, + boolean cache, + OCIDuration duration); + +typedef sword (*OCILobFreeTemporary_t)(OCISvcCtx *svchp, + OCIError *errhp, + OCILobLocator *locp); + +typedef sword (*OCILobIsTemporary_t)(OCIEnv *envp, + OCIError *errhp, + OCILobLocator *locp, + boolean *is_temporary); + +typedef sword (*OCIAQEnq_t)(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name, + OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop, + OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind, + OCIRaw **msgid, ub4 flags); + +typedef sword (*OCIAQDeq_t)(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name, + OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop, + OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind, + OCIRaw **msgid, ub4 flags); + +typedef sword (*OCIAQListen_t)(OCISvcCtx *svchp, OCIError *errhp, + OCIAQAgent **agent_list, ub4 num_agents, + sb4 wait, OCIAQAgent **agent, + ub4 flags); + +typedef sword (*OCIStmtFetch2_t)(OCIStmt *stmtp, OCIError *errhp, ub4 nrows, + ub2 orientation, sb4 scrollOffset, ub4 mode ); + +//--------------- Begin OCI Client Notification Interfaces ------------------ + +typedef sword (*OCISubscriptionRegister_t)(OCISvcCtx *svchp, OCISubscription **subscrhpp, + ub2 count, OCIError *errhp, ub4 mode); + +typedef sword (*OCISubscriptionPost_t)(OCISvcCtx *svchp, OCISubscription **subscrhpp, + ub2 count, OCIError *errhp, ub4 mode); + +typedef sword (*OCISubscriptionUnRegister_t)(OCISvcCtx *svchp, OCISubscription *subscrhp, + OCIError *errhp, ub4 mode); + +typedef sword (*OCISubscriptionDisable_t)(OCISubscription *subscrhp, + OCIError *errhp, ub4 mode); + +typedef sword (*OCISubscriptionEnable_t)(OCISubscription *subscrhp, + OCIError *errhp, ub4 mode); + +//------------------- End OCI Publish/Subscribe Interfaces ------------------ + + +typedef sword (*OCIDateTimeConstruct_t)( dvoid *hndl, + OCIError *err, OCIDateTime *datetime, + sb2 year, ub1 month, ub1 day, + ub1 hour, ub1 min, ub1 sec, ub4 fsec, + OraText *timezone, size_t timezone_length); + +typedef sword (*OCIDateTimeGetDate_t)(dvoid *hndl, + OCIError *err, CONST OCIDateTime *datetime, + sb2 *year, ub1 *month, ub1 *day); + +typedef sword (*OCIDateTimeGetTime_t)(dvoid *hndl, + OCIError *err, OCIDateTime *datetime, + ub1 *hour, ub1 *min, ub1 *sec, ub4 *fsec); + + typedef sword (*OCIDateTimeGetTimeZoneOffset_t)(void *hndl, OCIError *err, const OCIDateTime *datetime, - sb1 *hr, sb1 *mm); - -typedef sword (*OCINlsNumericInfoGet_t)(dvoid *envhp, OCIError *errhp, sb4 *val, ub2 item); - -// API declarations -class SQLAPI_API ora8API : public saAPI -{ -public: - ora8API(); - - // 8.0.x calls - OCIInitialize_t OCIInitialize; - OCIHandleAlloc_t OCIHandleAlloc; - OCIHandleFree_t OCIHandleFree; - OCIDescriptorAlloc_t OCIDescriptorAlloc; - OCIDescriptorFree_t OCIDescriptorFree; - OCIEnvInit_t OCIEnvInit; - OCIServerAttach_t OCIServerAttach; - OCIServerDetach_t OCIServerDetach; - OCISessionBegin_t OCISessionBegin; - OCISessionEnd_t OCISessionEnd; - OCILogon_t OCILogon; - OCILogoff_t OCILogoff; - OCIPasswordChange_t OCIPasswordChange; - OCIStmtPrepare_t OCIStmtPrepare; - OCIBindByPos_t OCIBindByPos; - OCIBindByName_t OCIBindByName; - OCIBindObject_t OCIBindObject; - OCIBindDynamic_t OCIBindDynamic; - OCIBindArrayOfStruct_t OCIBindArrayOfStruct; - OCIStmtGetPieceInfo_t OCIStmtGetPieceInfo; - OCIStmtSetPieceInfo_t OCIStmtSetPieceInfo; - OCIStmtExecute_t OCIStmtExecute; - OCIDefineByPos_t OCIDefineByPos; - OCIDefineObject_t OCIDefineObject; - OCIDefineDynamic_t OCIDefineDynamic; - OCIDefineArrayOfStruct_t OCIDefineArrayOfStruct; - OCIStmtFetch_t OCIStmtFetch; - OCIStmtGetBindInfo_t OCIStmtGetBindInfo; - OCIDescribeAny_t OCIDescribeAny; - OCIParamGet_t OCIParamGet; - OCIParamSet_t OCIParamSet; - OCITransStart_t OCITransStart; - OCITransDetach_t OCITransDetach; - OCITransCommit_t OCITransCommit; - OCITransRollback_t OCITransRollback; - OCITransPrepare_t OCITransPrepare; - OCITransForget_t OCITransForget; - OCIErrorGet_t OCIErrorGet; - OCILobAppend_t OCILobAppend; - OCILobAssign_t OCILobAssign; - OCILobCharSetForm_t OCILobCharSetForm; - OCILobCharSetId_t OCILobCharSetId; - OCILobCopy_t OCILobCopy; - OCILobDisableBuffering_t OCILobDisableBuffering; - OCILobEnableBuffering_t OCILobEnableBuffering; - OCILobErase_t OCILobErase; - OCILobFileClose_t OCILobFileClose; - OCILobFileCloseAll_t OCILobFileCloseAll; - OCILobFileExists_t OCILobFileExists; - OCILobFileGetName_t OCILobFileGetName; - OCILobFileIsOpen_t OCILobFileIsOpen; - OCILobFileOpen_t OCILobFileOpen; - OCILobFileSetName_t OCILobFileSetName; - OCILobFlushBuffer_t OCILobFlushBuffer; - OCILobGetLength_t OCILobGetLength; - OCILobIsEqual_t OCILobIsEqual; - OCILobLoadFromFile_t OCILobLoadFromFile; - OCILobLocatorIsInit_t OCILobLocatorIsInit; - OCILobRead_t OCILobRead; - OCILobRead2_t OCILobRead2; - OCILobTrim_t OCILobTrim; - OCILobWrite_t OCILobWrite; - OCILobWrite2_t OCILobWrite2; - OCIBreak_t OCIBreak; - OCIReset_t OCIReset; - OCIServerVersion_t OCIServerVersion; - OCIAttrGet_t OCIAttrGet; - OCIAttrSet_t OCIAttrSet; - OCISvcCtxToLda_t OCISvcCtxToLda; - OCILdaToSvcCtx_t OCILdaToSvcCtx; - OCIResultSetToStmt_t OCIResultSetToStmt; - - // 8.1.x (8i) calls - OCIEnvCreate_t OCIEnvCreate; - OCIEnvNlsCreate_t OCIEnvNlsCreate; - OCIDurationBegin_t OCIDurationBegin; - OCIDurationEnd_t OCIDurationEnd; - OCILobCreateTemporary_t OCILobCreateTemporary; - OCILobFreeTemporary_t OCILobFreeTemporary; - OCILobIsTemporary_t OCILobIsTemporary; - - OCIAQEnq_t OCIAQEnq; - OCIAQDeq_t OCIAQDeq; - OCIAQListen_t OCIAQListen; - OCISubscriptionRegister_t OCISubscriptionRegister; - OCISubscriptionPost_t OCISubscriptionPost; - OCISubscriptionUnRegister_t OCISubscriptionUnRegister; - OCISubscriptionDisable_t OCISubscriptionDisable; - OCISubscriptionEnable_t OCISubscriptionEnable; - - OCIDateTimeConstruct_t OCIDateTimeConstruct; - OCIDateTimeGetDate_t OCIDateTimeGetDate; - OCIDateTimeGetTime_t OCIDateTimeGetTime; - OCIDateTimeGetTimeZoneOffset_t OCIDateTimeGetTimeZoneOffset; - - OCINlsNumericInfoGet_t OCINlsNumericInfoGet; - - OCIStmtFetch2_t OCIStmtFetch2; -}; - -class SQLAPI_API ora8ConnectionHandles : public saConnectionHandles -{ -public: - ora8ConnectionHandles(); - - OCIEnv *m_pOCIEnv; - OCIError *m_pOCIError; - OCISvcCtx *m_pOCISvcCtx; - OCIServer *m_pOCIServer; - OCISession *m_pOCISession; -}; - -class SQLAPI_API ora8CommandHandles : public saCommandHandles -{ -public: - ora8CommandHandles(); - - OCIStmt *m_pOCIStmt; - OCIError *m_pOCIError; // cursor owned error handle -}; - -class SQLAPI_API ora8ExternalConnection -{ - bool m_bAttached; - SAConnection *m_pCon; - -public: - OCIEnv *m_pOCIEnv; - OCISvcCtx *m_pOCISvcCtx; - -public: - ora8ExternalConnection( - SAConnection *pCon, - OCIEnv *pOCIEnv, - OCISvcCtx *pOCISvcCtx); - void Attach(); - void Detach(); - ~ora8ExternalConnection(); -}; - -extern ora8API g_ora8API; - -#endif // !defined(__ORA8API_H__) + sb1 *hr, sb1 *mm); + +typedef sword (*OCINlsNumericInfoGet_t)(dvoid *envhp, OCIError *errhp, sb4 *val, ub2 item); + +/*----------------- Connection Pooling prototypes ---------------------------*/ +typedef sword (*OCIConnectionPoolCreate_t)(OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp, + OraText **poolName, sb4 *poolNameLen, + const OraText *dblink, sb4 dblinkLen, + ub4 connMin, ub4 connMax, ub4 connIncr, + const OraText *poolUserName, sb4 poolUserLen, + const OraText *poolPassword, sb4 poolPassLen, + ub4 mode); + +typedef sword (*OCIConnectionPoolDestroy_t)(OCICPool *poolhp, + OCIError *errhp, ub4 mode); + +/*----------------- OCILobGetLength2 prototypes ---------------------------*/ +typedef sword (*OCILobGetLength2_t)(OCISvcCtx *svchp, OCIError *errhp, + OCILobLocator *locp, oraub8 *lenp); + +class ora8API; + +class SQLAPI_API ora8ConnectionPool +{ +public: + ora8ConnectionPool(); + +private: + // disable copy constructor + ora8ConnectionPool(const ora8ConnectionPool&); + // disable assignment operator + ora8ConnectionPool &operator = (const ora8ConnectionPool &); + +public: + OCICPool *poolhp; + OraText *poolName; + sb4 poolNameLen; +}; + +class SQLAPI_API ora8ConnectionPools +{ + int m_nCount; + ora8ConnectionPool **m_pPools; + +private: + // disable copy constructor + ora8ConnectionPools(const ora8ConnectionPools &); + // disable assignment operator + ora8ConnectionPools &operator = (const ora8ConnectionPools &); + +public: + ora8ConnectionPools(); + + ora8ConnectionPool& operator[](int poolIndex); + void Close(ora8API& api); +}; + +// API declarations +class SQLAPI_API ora8API : public saAPI +{ +public: + ora8API(); + + // 8.0.x calls + OCIInitialize_t OCIInitialize; + OCIHandleAlloc_t OCIHandleAlloc; + OCIHandleFree_t OCIHandleFree; + OCIDescriptorAlloc_t OCIDescriptorAlloc; + OCIDescriptorFree_t OCIDescriptorFree; + OCIEnvInit_t OCIEnvInit; + OCIServerAttach_t OCIServerAttach; + OCIServerDetach_t OCIServerDetach; + OCISessionBegin_t OCISessionBegin; + OCISessionEnd_t OCISessionEnd; + OCILogon_t OCILogon; + OCILogoff_t OCILogoff; + OCIPasswordChange_t OCIPasswordChange; + OCIStmtPrepare_t OCIStmtPrepare; + OCIBindByPos_t OCIBindByPos; + OCIBindByName_t OCIBindByName; + OCIBindObject_t OCIBindObject; + OCIBindDynamic_t OCIBindDynamic; + OCIBindArrayOfStruct_t OCIBindArrayOfStruct; + OCIStmtGetPieceInfo_t OCIStmtGetPieceInfo; + OCIStmtSetPieceInfo_t OCIStmtSetPieceInfo; + OCIStmtExecute_t OCIStmtExecute; + OCIDefineByPos_t OCIDefineByPos; + OCIDefineObject_t OCIDefineObject; + OCIDefineDynamic_t OCIDefineDynamic; + OCIDefineArrayOfStruct_t OCIDefineArrayOfStruct; + OCIStmtFetch_t OCIStmtFetch; + OCIStmtGetBindInfo_t OCIStmtGetBindInfo; + OCIDescribeAny_t OCIDescribeAny; + OCIParamGet_t OCIParamGet; + OCIParamSet_t OCIParamSet; + OCITransStart_t OCITransStart; + OCITransDetach_t OCITransDetach; + OCITransCommit_t OCITransCommit; + OCITransRollback_t OCITransRollback; + OCITransPrepare_t OCITransPrepare; + OCITransForget_t OCITransForget; + OCIErrorGet_t OCIErrorGet; + OCILobAppend_t OCILobAppend; + OCILobAssign_t OCILobAssign; + OCILobCharSetForm_t OCILobCharSetForm; + OCILobCharSetId_t OCILobCharSetId; + OCILobCopy_t OCILobCopy; + OCILobDisableBuffering_t OCILobDisableBuffering; + OCILobEnableBuffering_t OCILobEnableBuffering; + OCILobErase_t OCILobErase; + OCILobFileClose_t OCILobFileClose; + OCILobFileCloseAll_t OCILobFileCloseAll; + OCILobFileExists_t OCILobFileExists; + OCILobFileGetName_t OCILobFileGetName; + OCILobFileIsOpen_t OCILobFileIsOpen; + OCILobFileOpen_t OCILobFileOpen; + OCILobFileSetName_t OCILobFileSetName; + OCILobFlushBuffer_t OCILobFlushBuffer; + OCILobGetLength_t OCILobGetLength; + OCILobGetLength2_t OCILobGetLength2; + OCILobIsEqual_t OCILobIsEqual; + OCILobLoadFromFile_t OCILobLoadFromFile; + OCILobLocatorIsInit_t OCILobLocatorIsInit; + OCILobRead_t OCILobRead; + OCILobRead2_t OCILobRead2; + OCILobTrim_t OCILobTrim; + OCILobWrite_t OCILobWrite; + OCILobWrite2_t OCILobWrite2; + OCIBreak_t OCIBreak; + OCIReset_t OCIReset; + OCIServerVersion_t OCIServerVersion; + OCIAttrGet_t OCIAttrGet; + OCIAttrSet_t OCIAttrSet; + OCISvcCtxToLda_t OCISvcCtxToLda; + OCILdaToSvcCtx_t OCILdaToSvcCtx; + OCIResultSetToStmt_t OCIResultSetToStmt; + + // 8.1.x (8i) calls + OCIEnvCreate_t OCIEnvCreate; + OCIEnvNlsCreate_t OCIEnvNlsCreate; + OCIDurationBegin_t OCIDurationBegin; + OCIDurationEnd_t OCIDurationEnd; + OCILobCreateTemporary_t OCILobCreateTemporary; + OCILobFreeTemporary_t OCILobFreeTemporary; + OCILobIsTemporary_t OCILobIsTemporary; + + OCIAQEnq_t OCIAQEnq; + OCIAQDeq_t OCIAQDeq; + OCIAQListen_t OCIAQListen; + OCISubscriptionRegister_t OCISubscriptionRegister; + OCISubscriptionPost_t OCISubscriptionPost; + OCISubscriptionUnRegister_t OCISubscriptionUnRegister; + OCISubscriptionDisable_t OCISubscriptionDisable; + OCISubscriptionEnable_t OCISubscriptionEnable; + + OCIDateTimeConstruct_t OCIDateTimeConstruct; + OCIDateTimeGetDate_t OCIDateTimeGetDate; + OCIDateTimeGetTime_t OCIDateTimeGetTime; + OCIDateTimeGetTimeZoneOffset_t OCIDateTimeGetTimeZoneOffset; + + OCINlsNumericInfoGet_t OCINlsNumericInfoGet; + + OCIStmtFetch2_t OCIStmtFetch2; + + // Conection pooling + OCIConnectionPoolCreate_t OCIConnectionPoolCreate; + OCIConnectionPoolDestroy_t OCIConnectionPoolDestroy; + + ora8ConnectionPools connecionPools; + OCIEnv *envhp; +}; + +class SQLAPI_API ora8ConnectionHandles : public saConnectionHandles +{ +public: + ora8ConnectionHandles(); + + OCIEnv *m_pOCIEnv; + OCIError *m_pOCIError; + OCISvcCtx *m_pOCISvcCtx; + OCIServer *m_pOCIServer; + OCISession *m_pOCISession; +}; + +class SQLAPI_API ora8CommandHandles : public saCommandHandles +{ +public: + ora8CommandHandles(); + + OCIStmt *m_pOCIStmt; + OCIError *m_pOCIError; // cursor owned error handle +}; + +class SQLAPI_API ora8ExternalConnection +{ + bool m_bAttached; + SAConnection *m_pCon; + +public: + OCIEnv *m_pOCIEnv; + OCISvcCtx *m_pOCISvcCtx; + +public: + ora8ExternalConnection( + SAConnection *pCon, + OCIEnv *pOCIEnv, + OCISvcCtx *pOCISvcCtx); + void Attach(); + void Detach(); + ~ora8ExternalConnection(); +}; + +extern ora8API g_ora8API; + +#endif // !defined(__ORA8API_H__) diff --git a/libraries/SQLAPI/include/pgAPI.h b/libraries/SQLAPI/include/pgAPI.h index c723308da..e017f4744 100644 --- a/libraries/SQLAPI/include/pgAPI.h +++ b/libraries/SQLAPI/include/pgAPI.h @@ -111,14 +111,14 @@ typedef void (*PQprintTuples_t)(const PGresult *res, typedef int (*lo_open_t)(PGconn *conn, Oid lobjId, int mode); typedef int (*lo_close_t)(PGconn *conn, int fd); typedef int (*lo_read_t)(PGconn *conn, int fd, char *buf, size_t len); -typedef int (*lo_write_t)(PGconn *conn, int fd, char *buf, size_t len); +typedef int (*lo_write_t)(PGconn *conn, int fd, const char *buf, size_t len); typedef int (*lo_lseek_t)(PGconn *conn, int fd, int offset, int whence); typedef Oid (*lo_creat_t)(PGconn *conn, int mode); typedef int (*lo_tell_t)(PGconn *conn, int fd); typedef int (*lo_unlink_t)(PGconn *conn, Oid lobjId); typedef Oid (*lo_import_t)(PGconn *conn, const char *filename); typedef int (*lo_export_t)(PGconn *conn, Oid lobjId, const char *filename); -typedef int (*PQmblen_t)(const unsigned char *s, int encoding); +typedef int (*PQmblen_t)(const char *s, int encoding); typedef int (*PQenv2encoding_t)(void); // new @@ -137,7 +137,7 @@ typedef unsigned char* (*PQunescapeBytea_t)(const unsigned char *strtext, /* These forms are deprecated! */ typedef size_t (*PQescapeString_t)(char *to, const char *from, size_t length); -typedef char* (*PQescapeBytea_t)(const unsigned char *from, size_t from_length, +typedef unsigned char* (*PQescapeBytea_t)(const unsigned char *from, size_t from_length, size_t *to_length); typedef void (*PQfreemem_t)(void *ptr); @@ -147,8 +147,8 @@ typedef int (*PQputCopyEnd_t)(PGconn *conn, const char *errormsg); typedef int (*PQgetCopyData_t)(PGconn *conn, char **buffer, int async); typedef PGPing (*PQping_t)(const char *conninfo); -typedef PGPing (*PQpingParams_t)(const char **keywords, - const char **values, int expand_dbname); +typedef PGPing (*PQpingParams_t)(const char *const * keywords, + const char *const * values, int expand_dbname); typedef const char* (*pg_encoding_to_char_t)(int encoding); diff --git a/libraries/SQLAPI/include/sbAPI.h b/libraries/SQLAPI/include/sbAPI.h index 121cedca6..5fb78c16c 100644 --- a/libraries/SQLAPI/include/sbAPI.h +++ b/libraries/SQLAPI/include/sbAPI.h @@ -8,8 +8,7 @@ #include "SQLAPI.h" // API header(s) -#define SQL_32BITTARG 1 -#include +#include extern long g_nSBDLLVersionLoaded; diff --git a/libraries/SQLAPI/include/sl3API.h b/libraries/SQLAPI/include/sl3API.h index c0b593d8b..2c79c0998 100644 --- a/libraries/SQLAPI/include/sl3API.h +++ b/libraries/SQLAPI/include/sl3API.h @@ -115,6 +115,12 @@ typedef void *(*sqlite3_rollback_hook_t)(sqlite3*, void(*)(void *), void*); typedef int (*sqlite3_enable_shared_cache_t)(int); typedef int (*sqlite3_release_memory_t)(int); typedef void (*sqlite3_soft_heap_limit_t)(int); +typedef int(*sqlite3_load_extension_t)( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ + ); typedef int (*sqlite3_enable_load_extension_t)(sqlite3 *db, int onoff); typedef int (*sqlite3_auto_extension_t)(void *xEntryPoint); typedef void (*sqlite3_reset_auto_extension_t)(void); @@ -181,6 +187,9 @@ typedef void *(*sqlite3_update_hook_t)( void* ); +typedef int(*sqlite3_key_t)(sqlite3 *db, const void *pKey, int nKey); +typedef int(*sqlite3_rekey_t)(sqlite3 *db, const void *pKey, int nKey); + // API declarations class SQLAPI_API sl3API : public saAPI { @@ -240,7 +249,16 @@ public: sqlite3_update_hook_t sqlite3_update_hook; + sqlite3_load_extension_t sqlite3_load_extension; sqlite3_enable_load_extension_t sqlite3_enable_load_extension; + + sqlite3_key_t sqlite3_key; + sqlite3_rekey_t sqlite3_rekey; + + sqlite3_free_t sqlite3_free; + + sqlite3_memory_used_t sqlite3_memory_used; + sqlite3_memory_highwater_t sqlite3_memory_highwater; }; class SQLAPI_API sl3ConnectionHandles : public saConnectionHandles diff --git a/libraries/SQLAPI/include/sqlbase/sqlbase.h b/libraries/SQLAPI/include/sqlbase/sqlbase.h new file mode 100644 index 000000000..090718df7 --- /dev/null +++ b/libraries/SQLAPI/include/sqlbase/sqlbase.h @@ -0,0 +1,1774 @@ +/* COPYRIGHT (C) UNIFY CORPORATION 1984-2012 */ +/* +INTERFACE TO + SQLBase 11.7 +*/ +/* +REVISION HISTORY + 12/04/91 GTI release 5.0.0 + 12/08/91 GTI release 5.0.1 + 04/01/92 GTI release 5.0.2 + 08/28/92 GTI release 5.1.0 + 11/02/92 GTI release 5.1.1 + 02/12/93 GTI release 5.1.2 + 04/02/93 GTI release 5.2.0 + 05/03/93 GTI release 5.2.0 + 06/15/93 GTI release (null) + 06/15/93 GTI release 5.2.A + 06/30/93 GTI release 5.1.3 + 08/04/93 GTI release 5.1.4 + 01/19/94 GTI release 5.2.C + 03/22/94 GTI release 5.2.0 + 04/18/93 GTI release 6.0.A + 01/14/94 GTI release 6.0.B + 05/11/94 GTI release 6.0.C + 09/27/94 GTI release 6.0.0 + 04/12/95 GTI release 6.0.1 + 08/02/95 GTI release 6.1.0 + 11/14/96 GTI release 6.5.0 + 10/20/97 GTI release 7.0.0 + 10/23/98 GTI release 7.5.0 + 11/10/00 GTI release 7.6.0 + 08/22/01 RWS release 8.0.0 + 10/22/02 GTI release 8.1.0 + 12/20/02 GTI release 8.5.0 + 01/18/05 RWS release 9.0.1 +DESCRIPTION + This file contains structure definitions and defined constants used to + interface with SQLBASE. For a more complete definition see + "SQLBASE API: SQL Application Programming Interface Reference" +*/ + +#pragma once + +#ifndef SQLBASE_H_ +#define SQLBASE_H_ + +// +// SQLBASE_API_COMPAT: +// Enable backwards compatibility with the SQLBase datatypes and API +// This is a single place to set for both datatypes and functions. +// For finer control see SQLBASE_DEFINE_WIDE_COLUMNS and SQLBASE_REDEFINE_TO_WIDE_FUNCTIONS below. +// Turning this flag off (0) allows wider columns to be used, but may require application code changes. +#if !defined(SQLBASE_API_COMPAT) +#define SQLBASE_API_COMPAT 1 // Support less than 255 columns and less than 255 byte char columns +#endif + +// +// SQLBASE_DEFINE_WIDE_COLUMNS: +// SQLBase now supports 1000 columns per table and the columns can be +// larger than the 254 bytes per column that it used to support. +// Setting of 0: +// Set SQLBASE_DEFINE_WIDE_COLUMNS to 0 if you want to rebuild your +// application for maximum compatibility with the preexisting API. +// You'll limit your access to the older limits, but you should not +// have to debug anything in your application. +// Setting of 1: +// Set SQLBASE_DEFINE_WIDE_COLUMNS to 0 if you want to rebuild your +// application to take advantage of having more columns and wider +// columns. You may have to work through compilation issues and debug +// your application to make sure correct data types are used to +// communicate with the SQLBase API. +// +#if !defined(SQLBASE_DEFINE_WIDE_COLUMNS) +# if SQLBASE_API_COMPAT +# define SQLBASE_DEFINE_WIDE_COLUMNS 0 +# else +# define SQLBASE_DEFINE_WIDE_COLUMNS 1 // Support 1000 columns and 1000 char wide columns +# endif +#endif + +// +// SQLBASE_REDEFINE_TO_WIDE_FUNCTIONS: +// SQLBase has added new API functions, mostly be adding "2" at the +// end of the name. The original API functions are still compatible +// with previous versions of application that have not been +// recompiled with the current libraries. The new API's have +// slightly different parameter types. +// Setting of 0: +// Don't automatically redefine names to the new names. This allows +// the developer to recompile the application and manually change +// names as needed. The old names still work, but they are limited to +// the columns and column widths. This is the recommended setting. +// Setting of 1: +// Using the preprocessor, redefine API function names to the new +// names. This allows the application developer to use the new names +// without changing as many lines in the application. +// +#if !defined(SQLBASE_REDEFINE_TO_WIDE_FUNCTIONS) +# if SQLBASE_API_COMPAT +# define SQLBASE_REDEFINE_TO_WIDE_FUNCTIONS 0 +# else +# define SQLBASE_REDEFINE_TO_WIDE_FUNCTIONS 1 // Use C preprocessor to redefine function names to new API names +# endif +#endif + +#pragma pack(push, 8) +#include +#pragma pack(pop) + +#ifdef __cplusplus +extern "C" +{ /* Assume C declarations for C++ */ +#endif /* __cplusplus */ + +#pragma pack(push,1) + +#ifndef SBSTDCALL +#ifdef __GNUC__ +#define SBSTDCALL /* stdcall */ +#else +#define SBSTDCALL __stdcall +#endif +#endif + +/* VERSION NUMBER */ +#define SQLVERS 120000 /* version number */ +/* DEFINED CONSTANTS */ + +/*------------------------------------------------------------------------- + For 32-bit target systems, such as NetWare 386, Windows/NT, and OS/2 2.x, + redefine some 16-bit-oriented constructs, such as far, near, pascal, etc. + These redefinitions assume the compiler being used supports the flat + memory model. + ------------------------------------------------------------------------- */ + +# undef cdecl + +# define cdecl +# ifndef CDECL +# define CDECL __cdecl +# endif +# define PTR * + +/* FETCH RETURN CODES */ +#define FETRTRU 1 /* data truncated */ +#define FETRSIN 2 /* signed number fetched */ +#define FETRDNN 3 /* data is not numeric */ +#define FETRNOF 4 /* numeric overflow */ +#define FETRDTN 5 /* data type not supported */ +#define FETRDND 6 /* data is not in date format */ +#define FETRNUL 7 /* data is null */ +/* DATABASE DATA TYPES */ +#define SQLDCHR 1 /* character data type */ +#define SQLDNUM 2 /* numeric data type */ +#define SQLDDAT 3 /* date-time data type */ +#define SQLDLON 4 /* long character data type */ +#define SQLDDTE 5 /* date (only) data type */ +#define SQLDTIM 6 /* time (only) data type */ +#define SQLDHDL 7 /* sql handle data type */ +#define SQLDBOO 8 /* boolean data type */ +#define SQLDNCH 9 /* national character data type */ +#define SQLDLNC 10 // long national character (unused) +#define SQLDLBI 11 // long binary data type +#define SQLDDTM 11 /* maximum data type */ +/* PROGRAM DATA TYPES */ +#define SQLPBUF 1 /* buffer */ +#define SQLPSTR 2 /* string (zero terminated) */ +#define SQLPUCH 3 /* unsigned char */ +#define SQLPSCH 4 /* char */ +#define SQLPUIN 5 /* unsigned int */ +#define SQLPSIN 6 /* int */ +#define SQLPULO 7 /* unsigned long */ +#define SQLPSLO 8 /* long */ +#define SQLPFLT 9 /* float */ +#define SQLPDOU 10 /* double */ +#define SQLPNUM 11 /* SQLBASE internal numeric format */ +#define SQLPDAT 12 /* SQLBASE internal datetime format */ +#define SQLPUPD 13 /* unsigned packed decimal */ +#define SQLPSPD 14 /* signed packed decimal */ +#define SQLPDTE 15 /* date only format */ +#define SQLPTIM 16 /* time only format */ +#define SQLPUSH 17 /* unsigned short */ +#define SQLPSSH 18 /* short */ +#define SQLPNST 19 /* numeric string */ +#define SQLPNBU 20 /* numeric buffer */ +#define SQLPEBC 21 /* EBCDIC buffer format */ +#define SQLPLON 22 /* long text string */ +#define SQLPLBI 23 /* long binary buffer */ +#define SQLPLVR 24 /* char\long varchar > 254 */ +#define SQLPULL 25 /* unsigned long long */ +#define SQLPSLL 26 /* long long */ +#define SQLPNCH 27 /* national Character */ +#define SQLPLNC 28 /* long national character */ +#define SQLPBIN 29 /* binary */ +#define SQLPBUFW 30 /* wide char buffer */ +#define SQLPSTRW 31 /* wide char string (zero terminated) */ +#define SQLPUTF8 32 /* UTF8 char buffer */ +#define SQLPUTF16 33 /* UTF16 char buffer */ +#define SQLPDTM 33 /* data type maximum */ +#define SQLPRAW (SQLPDTM + 1) // internal use + +/* EXTERNAL DATA TYPES */ +#define SQLEINT 1 /* INTEGER */ +#define SQLESMA 2 /* SMALLINT */ +#define SQLEFLO 3 /* FLOAT */ +#define SQLECHR 4 /* CHAR */ +#define SQLEVAR 5 /* VARCHAR */ +#define SQLELON 6 /* LONG VARCHAR */ +#define SQLEDEC 7 /* DECIMAL */ +#define SQLEDAT 8 /* DATE */ +#define SQLETIM 9 /* TIME */ +#define SQLETMS 10 /* TIMESTAMP */ +#define SQLEMON 11 /* MONEY */ +#define SQLEDOU 12 /* DOUBLE */ +#define SQLEGPH 13 /* GRAPHIC */ +#define SQLEVGP 14 /* VAR GRAPHIC */ +#define SQLELGP 15 /* LONG VAR GRAPHIC */ +#define SQLEBIN 16 /* BINARY */ +#define SQLEVBI 17 /* VAR BINARY */ +#define SQLELBI 18 /* LONG VARBINARY */ +#define SQLEBOO 19 /* BOOLEAN */ +#define SQLELCH 20 /* CHAR > 254 */ +#define SQLELVR 21 /* VARCHAR > 254 */ +#define SQLENCH 22 /* NATIONAL CHARACTER */ +#define SQLENVC 23 /* NATIONAL VARCHAR */ +#define SQLELNC 24 /* LONG NATIONAL CHARACTER */ +#define SQLEDTM 24 /* Maximum data type allowed */ + +/* SET and GET PARAMETER TYPES */ +/* Global parameters + ------------------ */ +#define SQLPDDB 1 /* default database name */ +#define SQLPDUS 2 /* default user name */ +#define SQLPDPW 3 /* default password */ +#define SQLPGBC 4 /* global cursor value */ +#define SQLPLRD 5 /* local result set directory */ +#define SQLPDBM 6 /* db mode - see below */ +#define SQLPDBD 7 /* dbdir */ +#define SQLPCPG 8 /* code page information */ +#define SQLPNIE 9 /* null indicator error */ +#define SQLPCPT 10 /* connect pass thru to backend */ +#define SQLPTPD 11 /* temp dir */ +#define SQLPDTR 12 /* distributed transaction mode */ +#define SQLPPSW 15 /* server password */ +#define SQLPOOJ 16 /* oracle outer join */ +#define SQLPNPF 17 /* net prefix */ +#define SQLPNLG 18 /* net log */ +#define SQLPNCT 19 /* net check type */ +#define SQLPNCK 20 /* net check */ +#define SQLPLCK 22 /* locks */ +#define SQLPINT 25 /* interrupt */ +#define SQLPERF 27 /* error file */ +#define SQLPDIO 28 /* direct I/O */ +#define SQLPSWR 29 /* default write */ +#define SQLPCTY 31 /* country */ +#define SQLPCSD 32 /* commit server daemon */ +#define SQLPCSR 33 /* commit server */ +#define SQLPCCK 36 /* client check */ +#define SQLPCTS 37 /* characterset */ +#define SQLPCGR 38 /* cache group */ +#define SQLPAIO 39 /* asyncio */ +#define SQLPANL 40 /* apply net log */ +#define SQLPGRS 41 /* get reentracy state */ +#define SQLPSTF 42 /* set SQLTrace flags */ +#define SQLPCLG 43 /* set commit-order logging */ + +/* Server specific parameters + -------------------------- */ + +#define SQLPHEP 1001 /* HEAP size for TSR executables */ +#define SQLPCAC 1002 /* CACHE size in Kbytes */ +#define SQLPBRN 1003 /* brand of database */ +#define SQLPVER 1004 /* release version (ex. "4.0.J") */ +#define SQLPPRF 1005 /* server profiling */ +#define SQLPPDB 1006 /* partitioned database */ +#define SQLPGCM 1007 /* group commit count */ +#define SQLPGCD 1008 /* group commit delay ticks */ +#define SQLPDLK 1009 /* number of deadlocks */ +#define SQLPCTL 1010 /* command time limit */ +#define SQLPAPT 1011 /* process timer activated */ +#define SQLPOSR 1012 /* OS sample rate */ +#define SQLPAWS 1013 /* OS Averaging window size */ +#define SQLPWKL 1014 /* Work Limit */ +#define SQLPWKA 1015 /* Work Space allocation */ +#define SQLPUSR 1016 /* Number of users */ +#define SQLPTMO 1017 /* time out */ +#define SQLPTSS 1018 /* thread stack size */ +#define SQLPTHM 1019 /* thread mode */ +#define SQLPSTC 1020 /* sortcache size in kilobytes */ +#define SQLPSIL 1021 /* silent mode */ +#define SQLPSPF 1022 /* server prefix */ +#define SQLPSVN 1024 /* server name */ +#define SQLPROM 1025 /* read-only mode (0 or 1) */ +#define SQLPSTA 1026 /* enable stats gathering */ +#define SQLPCSV 1027 /* commit server */ +#define SQLPTTP 1028 /* trace for 2PC */ +#define SQLPAJS 1029 /* ANSI join syntax */ +#define SQLPSDIR 1030 /* server module directory */ +#define SQLPSINI 1031 /* server ini file full path name */ +#define SQLPBLD 1032 /* server build number */ + +#define SQLPAUL 1033 /* get an audit list */ + +/* Database specific parameters + ---------------------------- */ + +#define SQLPDBN 2001 /* database name */ +#define SQLPDDR 2002 /* database directory */ +#define SQLPLDR 2003 /* log directory */ +#define SQLPLFS 2004 /* log file size in Kbytes */ +#define SQLPCTI 2005 /* checkpoint time interval in mins */ +#define SQLPLBM 2006 /* log backup mode? (0 or 1) */ +#define SQLPPLF 2007 /* Pre-allocate log files? (0 or 1) */ +#define SQLPTSL 2008 /* transaction span limit */ +#define SQLPROT 2009 /* read-only transactions (0, 1, 2) */ +#define SQLPHFS 2010 /* history file size in Kbytes */ +#define SQLPREC 2011 /* recovery */ +#define SQLPEXE 2012 /* name of executable */ +#define SQLPNLB 2013 /* next log to backup */ +#define SQLPROD 2014 /* read-only database (0 or 1) */ +#define SQLPEXS 2015 /* database file extension size */ +#define SQLPPAR 2016 /* partitioned database (0 or 1) */ +#define SQLPNDB 2017 /* NEWDB */ +#define SQLPLGF 2018 /* log file offset */ +#define SQLPDTL 2019 /* command timelimit */ +#define SQLPSMN 2020 /* show main db */ +#define SQLPCVC 2021 /* catalog version counter */ +#define SQLPDBS 2022 /* database block size */ +#define SQLPUED 2023 /* update external dictionary */ +#define SQLPCINI 2024 /* client ini file full path name */ +#define SQLPDFS 2025 /* get disk free space for database or log */ + +/* Cursor specific parameters + -------------------------- */ + +#define SQLPISO 3001 /* isolation level (SQLILRR etc..) */ +#define SQLPWTO 3002 /* lock wait timeout in seconds */ +#define SQLPPCX 3003 /* preserve context (0 or 1) */ +#define SQLPFRS 3004 /* front end result sets */ +#define SQLPLDV 3005 /* load version (ex. "3.6.22") */ +#define SQLPAUT 3006 /* autocommit */ +#define SQLPRTO 3007 /* rollback trans on lock timeout */ +#define SQLPSCR 3008 /* scroll mode (0 or 1) */ +#define SQLPRES 3009 /* restriction mode (0 or 1) */ +#define SQLPFT 3010 /* fetch through */ +#define SQLPNPB 3011 /* no pre-build in RL mode */ +#define SQLPPWD 3012 /* current password */ +#define SQLPDB2 3013 /* DB2 compatibility mode */ +#define SQLPREF 3014 /* referential integrity checking */ +#define SQLPBLK 3015 /* bulk-execute mode */ +#define SQLPOBL 3016 /* optimized bulk-execute mode */ +#define SQLPLFF 3017 /* LONG data allowed in FERS */ +#define SQLPDIS 3018 /* When to return Describe info */ +#define SQLPCMP 3019 /* Compress messages sent to server */ +#define SQLPCHS 3020 /* chained cmd has SELECT (0 or 1) */ +#define SQLPOPL 3021 /* optimizer level */ +#define SQLPRID 3022 /* ROWID */ +#define SQLPEMT 3023 /* Error Message Tokens */ +#define SQLPCLN 3024 /* client name */ +#define SQLPLSS 3025 /* last compiled SQL statement */ +#define SQLPEXP 3026 /* explain query plan */ +#define SQLPCXP 3027 /* cost of execution plan */ +#define SQLPOCL 3028 /* optimizercostlevel */ +#define SQLPTST 3029 /* distributed transaction status */ +#define SQLP2PP 3030 /* 2-phase protocol (SQL2STD, etc.) */ +/* defined for Load/Unload parsed parameters - cursor specific */ +#define SQLPCLI 3031 /* ON CLIENT option */ +#define SQLPFNM 3032 /* load/unload file name */ +#define SQLPOVR 3033 /* file OVERWRITE flag */ +#define SQLPTFN 3034 /* A Temporary file name */ +#define SQLPTRC 3035 /* Trace stored procedures */ +#define SQLPTRF 3036 /* Tracefile for stored procedures */ +#define SQLPCTF 3037 /* control file flag */ + +#define SQLPMID 3038 /* mail id */ +#define SQLPAID 3039 /* adapter id */ +#define SQLPNID 3040 /* network id */ +#define SQLPUID 3041 /* user application id */ +#define SQLPCIS 3042 /* client identification strings */ +#define SQLPIMB 3043 /* input message buffer size */ +#define SQLPOMB 3044 /* output message buffer size */ +#define SQLPWFC 3045 /* which fetchable command */ +#define SQLPRFE 3046 /* Return on First Error-bulk insert */ +#define SQLPCUN 3047 /* Current cursor user name */ +#define SQLPOFF 3048 /* Optimize First Fetch */ +#define SQLPUSC 3049 /* Use Specified Cursor for ref */ +#define SQLPPDG 3050 /* Plan Debug */ +// Start SQLBase International reserved numbers +#define SQLPCCHS 3051 /* Connection Character set */ +#define SQLPSCHS 3052 /* Server character set */ +#define SQLPCCOL 3053 /* Connection collation */ +#define SQLPSCOL 3054 /* Server collation */ +#define SQLPDCOL 3055 /* Database collation */ +// End SQLBase International reserved numbers +#define SQLPALT 3056 // AutoLockTable +#define SQLPAIV 3057 // AutoIncrement Value +#define SQLPRCM 3058 /* RC isolation level mode (SQLIMRC[X123]) */ +#define SQLPTHR 3059 // Database thread priority + +/* Application Specific ie. applicable to all cursors that + belong to the same application (3700 - 3799) */ + +#define SQLPCCB 3700 /* Connect Closure Behaviour */ +#define SQLPTTV 3701 /* Thread Timeout Value */ + +/* Static attributes + -------------------------- */ + +#define SQLPFAT 4000 /* first attribute */ +#define SQLPBRS 4001 /* back end result sets */ +#define SQLPMUL 4002 /* multi-user */ +#define SQLPDMO 4003 /* demonstration version */ +#define SQLPLOC 4004 /* local version of database */ +#define SQLPFPT 4005 /* 1st participant */ +#define SQLPLAT 4006 /* last attribute */ +#define SQLPCAP 4007 /* API capability level */ +#define SQLPSCL 4008 /* server capability level */ +#define SQLPRUN 4009 /* runtime version */ + +/* Server specific parameters + ---------------------------- */ + +#define SQLPPLV 5001 /* print level */ +#define SQLPALG 5002 /* activity log */ +#define SQLPTMS 5003 /* time stamp */ +#define SQLPPTH 5004 /* path name seperator */ +#define SQLPTMZ 5005 /* time zone */ +#define SQLPTCO 5006 /* time colon only */ + +/* SQL Server & Router/Gateway specific parameters + ------------------------------ */ +#define SQLPESTR 5101 /* get server error # and string */ +#define SQLPMSTR 5102 /* get server msg# and string */ +#define SQLPMAPC 5103 /* MapGTICursors */ +#define SQLPUPRE 5104 /* get user prefix */ +#define SQLPORID 5105 /* Oracle RowID */ +#define SQLPERRM 5106 /* error mapping */ +#define SQLPRTS 5107 /* SQL Server - Return Status */ +#define SQLPSAUT 5108 /* SQL Server - Autocommit */ +#define SQLPROW 5109 /* SQL Server - Command Type */ +#define SQLPEHC 5110 /* SQL Server - Enhanced Cursors */ +#define SQLPGFS 5111 /* SQL Server - Get Fetch Status */ +#define SQLPLBUF 5112 /* Longbuffer setting */ +#define SQLPDPH 5113 /* SQL Server - DBProcess handle */ +#define SQLPCKE 5114 /* SQL Server - CHECK EXISTS */ +#define SQLPWTX 5115 /* SQL Server - DBWRITETEXT */ +#define SQLPYLD 5116 /* SQL Server - YieldOnServerCall */ +#define SQLPOBN 5117 /* ODBC Router - backend brand */ +#define SQLPOBV 5118 /* ODBC Router - backend version */ +#define SQLPODN 5119 /* ODBC Router - driver name */ +#define SQLPODV 5120 /* ODBC Router - driver version */ +#define SQLPOCV 5121 /* ODBC Router - ODBC version */ +#define SQLPRSYS 5122 /* DRDA - EXEC SQL CONNECT TO remote system name */ +#define SQLPLAB 5123 /* DB2 - return label information if exists */ +#define SQLPCID 5124 /* DB2 - Set Current SQLID default */ +#define SQLPNUMST 5125 /* AS/400 Number of Statements */ +#define SQLPBNDRW 5126 /* Oracle- bind SQLPBUF as RAW */ +#define SQLPNLS 5127 /* Informix - NLS database */ + +#define SQLPFRW 5200 /* fetchrow */ +#define SQLPBRW 5201 /* buffrow */ + +/* Sybase System 10 parameters (reserved 5220 - 5250) + ------------------------------------------------------------ */ + +#define SQLPNESTR 5220 /* SYB - get next error from client */ +#define SQLPNMSTR 5221 /* SYB - get next error from server */ +#define SQLPCESTR 5222 /* SYB - get client message count */ +#define SQLPCMSTR 5223 /* SYB - get server message count */ +#define SQLPTXT 5224 /* SYB - allow bind for text, image */ +#define SQLPEMC 5225 /* SYB - enable multiple connections */ + +/* ODBC specific parameters - Refer to ODBC spec for definition + ------------------------------------------------------------ */ + +#define SQLP_ACTIVE_CONNECTIONS 5500 +#define SQLP_ACTIVE_STATEMENTS 5501 +#define SQLP_DATA_SOURCE_NAME 5502 +#define SQLP_DRIVER_HDBC 5503 +#define SQLP_DRIVER_HENV 5504 +#define SQLP_DRIVER_HSTMT 5505 +#define SQLP_DRIVER_NAME 5506 +#define SQLP_DRIVER_VER 5507 +#define SQLP_FETCH_DIRECTION 5508 +#define SQLP_ODBC_API_CONFORMANCE 5509 +#define SQLP_ODBC_VER 5510 +#define SQLP_ROW_UPDATES 5511 +#define SQLP_ODBC_SAG_CLI_CONFORMANCE 5512 +#define SQLP_SERVER_NAME 5513 +#define SQLP_SEARCH_PATTERN_ESCAPE 5514 +#define SQLP_ODBC_SQL_CONFORMANCE 5515 +#define SQLP_DATABASE_NAME 5516 +#define SQLP_DBMS_NAME 5517 +#define SQLP_DBMS_VER 5518 +#define SQLP_ACCESSIBLE_TABLES 5519 +#define SQLP_ACCESSIBLE_PROCEDURES 5520 +#define SQLP_PROCEDURES 5521 +#define SQLP_CONCAT_NULL_BEHAVIOUR 5522 +#define SQLP_CURSOR_COMMIT_BEHAVIOUR 5523 +#define SQLP_CURSOR_ROLLBACK_BEHAVIOUR 5524 +#define SQLP_DATA_SOURCE_READ_ONLY 5525 +#define SQLP_DEFAULT_TXN_ISOLATION 5526 +#define SQLP_EXPRESSIONS_IN_ORDERBY 5527 +#define SQLP_IDENTIFIER_CASE 5528 +#define SQLP_IDENTIFIER_QUOTE_CHAR 5529 +#define SQLP_MAX_COLUMN_NAME_LEN 5530 +#define SQLP_MAX_CURSOR_NAME_LEN 5531 +#define SQLP_MAX_OWNER_NAME_LEN 5532 +#define SQLP_MAX_PROCEDURE_NAME_LEN 5533 +#define SQLP_MAX_QUALIFIER_NAME_LEN 5534 +#define SQLP_MAX_TABLE_NAME_LEN 5535 +#define SQLP_MULT_RESULT_SETS 5536 +#define SQLP_MULTIPLE_ACTIVE_TXN 5537 +#define SQLP_OUTER_JOINS 5538 +#define SQLP_OWNER_TERM 5539 +#define SQLP_PROCEDURE_TERM 5540 +#define SQLP_QUALIFIER_NAME_SEPARATOR 5541 +#define SQLP_QUALIFIER_TERM 5542 +#define SQLP_SCROLL_CONCURRENCY 5543 +#define SQLP_SCROLL_OPTIONS 5544 +#define SQLP_TABLE_TERM 5545 +#define SQLP_TXN_CAPABLE 5546 +#define SQLP_USER_NAME 5547 +#define SQLP_CONVERT_FUNCTIONS 5548 +#define SQLP_NUMERIC_FUNCTIONS 5549 +#define SQLP_STRING_FUNCTIONS 5550 +#define SQLP_SYSTEM_FUNCTIONS 5551 +#define SQLP_TIMEDATE_FUNCTIONS 5552 +#define SQLP_CONVERT_BIGINT 5553 +#define SQLP_CONVERT_BINARY 5554 +#define SQLP_CONVERT_BIT 5555 +#define SQLP_CONVERT_CHAR 5556 +#define SQLP_CONVERT_DATE 5557 +#define SQLP_CONVERT_DECIMAL 5558 +#define SQLP_CONVERT_DOUBLE 5559 +#define SQLP_CONVERT_FLOAT 5560 +#define SQLP_CONVERT_INTEGER 5561 +#define SQLP_CONVERT_LONGVARCHAR 5562 +#define SQLP_CONVERT_NUMERIC 5563 +#define SQLP_CONVERT_REAL 5564 +#define SQLP_CONVERT_SMALLINT 5565 +#define SQLP_CONVERT_TIME 5566 +#define SQLP_CONVERT_TIMESTAMP 5567 +#define SQLP_CONVERT_TINYINT 5568 +#define SQLP_CONVERT_VARBINARY 5569 +#define SQLP_CONVERT_VARCHAR 5570 +#define SQLP_CONVERT_LONGVARBINARY 5571 +#define SQLP_TXN_ISOLATION_OPTION 5572 +#define SQLP_ODBC_SQL_OPT_IEF 5573 + +/*** ODBC SDK 1.0 Additions ***/ +#define SQLP_CORRELATION_NAME 5574 +#define SQLP_NON_NULLABLE_COLUMNS 5575 + +/*** ODBC SDK 2.0 Additions ***/ +#define SQLP_DRIVER_HLIB 5576 +#define SQLP_DRIVER_ODBC_VER 5577 +#define SQLP_LOCK_TYPES 5578 +#define SQLP_POS_OPERATIONS 5579 +#define SQLP_POSITIONED_STATEMENTS 5580 +#define SQLP_GETDATA_EXTENSIONS 5581 +#define SQLP_BOOKMARK_PERSISTENCE 5582 +#define SQLP_STATIC_SENSITIVITY 5583 +#define SQLP_FILE_USAGE 5584 +#define SQLP_NULL_COLLATION 5585 +#define SQLP_ALTER_TABLE 5586 +#define SQLP_COLUMN_ALIAS 5587 +#define SQLP_GROUP_BY 5588 +#define SQLP_KEYWORDS 5589 +#define SQLP_ORDER_BY_COLUMNS_IN_SELECT 5590 +#define SQLP_OWNER_USAGE 5591 +#define SQLP_QUALIFIER_USAGE 5592 +#define SQLP_QUOTED_IDENTIFIER_CASE 5593 +#define SQLP_SPECIAL_CHARACTERS 5594 +#define SQLP_SUBQUERIES 5595 +#define SQLP_UNION 5596 +#define SQLP_MAX_COLUMNS_IN_GROUP_BY 5597 +#define SQLP_MAX_COLUMNS_IN_INDEX 5598 +#define SQLP_MAX_COLUMNS_IN_ORDER_BY 5599 +#define SQLP_MAX_COLUMNS_IN_SELECT 5600 +#define SQLP_MAX_COLUMNS_IN_TABLE 5601 +#define SQLP_MAX_INDEX_SIZE 5602 +#define SQLP_MAX_ROW_SIZE_INCLUDES_LONG 5603 +#define SQLP_MAX_ROW_SIZE 5604 +#define SQLP_MAX_STATEMENT_LEN 5605 +#define SQLP_MAX_TABLES_IN_SELECT 5606 +#define SQLP_MAX_USER_NAME_LEN 5607 +#define SQLP_MAX_CHAR_LITERAL_LEN 5608 +#define SQLP_TIMEDATE_ADD_INTERVALS 5609 +#define SQLP_TIMEDATE_DIFF_INTERVALS 5610 +#define SQLP_NEED_LONG_DATA_LEN 5611 +#define SQLP_MAX_BINARY_LITERAL_LEN 5612 +#define SQLP_LIKE_ESCAPE_CLAUSE 5613 +#define SQLP_QUALIFIER_LOCATION 5614 + +#define SQLP_GET_TYPE_INFO 5699 + + +/* The following parmeters in the range 6000 - 7000 are reserved for + SQLBase INTERNAL use. +*/ + +#define SQLP000 6000 /* for internal use only */ +#define SQLP999 6999 /* for internal use only */ +#define SQLPITP 0x4000 /* INTERNAL USE ONLY */ +#define SQLPITC 0x8000 /* INTERNAL USE ONLY */ + +/* end of SET and GET PARAMETER TYPES */ + + +/* defines for ON, OFF, DEFAULT parameter values */ + +#define SQLVOFF 0 /* parameter should be OFF */ +#define SQLVON 1 /* parameter should be ON */ +#define SQLVDFL 2 /* parameter should default */ + +/* defines for SQLPDBM (db mode) */ + +#define SQLMDBL 1 /* DB Local */ +#define SQLMRTR 2 /* DB Router */ +#define SQLMCOM 3 /* DB Combo */ + +/* defines for database brands */ + +#define SQLBSQB 1 /* SQLBASE */ +#define SQLBDB2 2 /* DB2 */ +#define SQLBDBM 3 /* IBM OS/2 Database Manager */ +#define SQLBORA 4 /* Oracle */ +#define SQLBIGW 5 /* Informix */ +#define SQLBNTW 6 /* Netware SQL */ +#define SQLBAS4 7 /* IBM AS/400 SQL/400 */ +#define SQLBSYB 8 /* Sybase SQL Server */ +#define SQLBDBC 9 /* Teradata DBC Machines */ +#define SQLBALB 10 /* HP Allbase */ +#define SQLBRDB 11 /* DEC's RDB */ +#define SQLBTDM 12 /* Tandem's Nonstop SQL */ +#define SQLBSDS 13 /* IBM SQL/DS */ +#define SQLBSES 14 /* SNI SESAM */ +#define SQLBING 15 /* Ingres */ +#define SQLBSQL 16 /* SQL Access */ +#define SQLBDBA 17 /* DBase */ +#define SQLBDB4 18 /* SNI DDB4 */ +#define SQLBFUJ 19 /* Fujitsu RDBII */ +#define SQLBSUP 20 /* Cincom SUPRA */ +#define SQLB204 21 /* CCA Model 204 */ +#define SQLBDAL 22 /* Apple DAL interface */ +#define SQLBSHR 23 /* Teradata ShareBase */ +#define SQLBIOL 24 /* Informix On-Line */ +#define SQLBEDA 25 /* EDA/SQL */ +#define SQLBUDS 26 /* SNI UDS */ +#define SQLBMIM 27 /* Nocom Mimer */ +#define SQLBOR7 28 /* Oracle version 7 */ +#define SQLBIOS 29 /* Ingres OpenSQL */ +#define SQLBIOD 30 /* Ingres OpenSQL with date support */ +#define SQLBODB 31 /* ODBC Router */ +#define SQLBS10 32 /* SYBASE System 10 */ +#define SQLBSE6 33 /* Informix SE version 6 */ +#define SQLBOL6 34 /* Informix On-Line version 6 */ +#define SQLBNSE 35 /* Informix SE NLS version 6 */ +#define SQLBNOL 36 /* Informix On-Line NLS version 6 */ +#define SQLBSE7 37 /* Informix SE version 7 */ +#define SQLBOL7 38 /* Informix On-Line version 7 */ +#define SQLBETA 39 /* Entire Access, ADABAS */ +#define SQLBI12 40 /* Ingres CA-OpenIngres 1.2 */ +#define SQLBAPP 99 /* SQLHost App Services */ + +/* SIZES */ +#define SQLSNUM 12 /* numeric program buffer size */ +#define SQLSDAT 12 /* date-time program buffer size */ +#define SQLSCDA 26 /* character date-time size */ +#define SQLSDTE SQLSDAT /* date (only) program buffer size */ +#define SQLSCDE 10 /* character date (only) size */ +#define SQLSRID 40 /* size of ROWID */ +#define SQLSTIM SQLSDAT /* time (only) program buffer size */ +#define SQLSCTI 15 /* character time (only) size */ +#define SQLSFEM 100L /* file extension size (multi-user) */ +#define SQLSFES 20L /* file extension size (single-user) */ +#define SQLSTEX 5L /* table extent size */ + + +/* Two-phase Commit Protocols */ + +typedef int SQLT2PP; /* type: 2-phase commit protocol */ + +#define SQL2MIN SQL2STD /* minimum protocol value */ + +#define SQL2STD ((SQLT2PP) 1) /* standard 2pc protocol */ +#define SQL2PRA ((SQLT2PP) 2) /* presumed-abort 2pc protocol */ +#define SQL2PRC ((SQLT2PP) 3) /* presumed-commit 2pc protocol */ +#define SQL2DEF SQL2STD /* default is standard */ + +#define SQL2MAX SQL2PRC /* maximum protocol value */ + +/* Two-phase Commit Votes */ + +typedef int SQLT2PV; /* type: 2-phase commit vote */ + +#define SQLVMIN SQLVCMT /* minimum vote value */ + +#define SQLVCMT ((SQLT2PV) 1) /* Vote Commit */ +#define SQLVRBK ((SQLT2PV) 2) /* Vote Rollback */ +#define SQLVRO ((SQLT2PV) 3) /* Vote ReadOnly */ + +#define SQLVMAX SQLVRO /* maximum vote value */ + +/* defines for distributed transaction status */ + +typedef int SQLTTST; /* distributed transaction state */ + +#define SQLSCMT ((SQLTTST) 1) /* transaction state = COMMITted */ +#define SQLSRBK ((SQLTTST) 2) /* transaction state = ROLLBACKed */ +#define SQLSUNK ((SQLTTST) 3) /* transaction state = UNKNOWN */ + + +/* Define null pointer value */ +#ifndef SQLNPTR +#ifdef __cplusplus +#define SQLNPTR 0 +#else +#define SQLNPTR ((void *)0) +#endif +#endif + +/* RESULT COMMAND TYPES */ +// (internal note: correlate these with exedrv.c & tlkpsm.c) +#define SQLTSEL 1 /* select */ +#define SQLTINS 2 /* insert */ +#define SQLTCTB 3 /* create table */ +#define SQLTUPD 4 /* update */ +#define SQLTDEL 5 /* delete */ +#define SQLTCIN 6 /* create index */ +#define SQLTDIN 7 /* drop index */ +#define SQLTDTB 8 /* drop table */ +#define SQLTCMT 9 /* commit */ +#define SQLTRBK 10 /* rollback */ +#define SQLTACO 11 /* add column */ +#define SQLTDCO 12 /* drop column */ +#define SQLTRTB 13 /* rename table */ +#define SQLTRCO 14 /* rename column */ +#define SQLTMCO 15 /* modify column */ +#define SQLTGRP 16 /* grant privilege on table */ +#define SQLTGRD 17 /* grant dba */ +#define SQLTGRC 18 /* grant connect */ +#define SQLTGRR 19 /* grant resource */ +#define SQLTREP 20 /* revoke privilege on table */ +#define SQLTRED 21 /* revoke dba */ +#define SQLTREC 22 /* revoke connect */ +#define SQLTRER 23 /* revoke resource */ +#define SQLTCOM 24 /* comment on */ +#define SQLTWAI 25 /* wait */ +#define SQLTPOS 26 /* post */ +#define SQLTCSY 27 /* create synonym */ +#define SQLTDSY 28 /* drop synonym */ +#define SQLTCVW 29 /* create view */ +#define SQLTDVW 30 /* drop view */ +#define SQLTRCT 31 /* row count */ +#define SQLTAPW 32 /* alter password */ +#define SQLTLAB 33 /* label on */ +#define SQLTCHN 34 /* chained command */ +#define SQLTRPT 35 /* repair table */ +#define SQLTSVP 36 /* savepoint */ +#define SQLTRBS 37 /* rollback to savepoint */ +#define SQLTUDS 38 /* update statistics */ +#define SQLTCDB 39 /* check database */ +#define SQLTFRN 40 /* foreign DBMS commands */ +#define SQLTAPK 41 /* add primary key */ +#define SQLTAFK 42 /* add foreign key */ +#define SQLTDPK 43 /* drop primary key */ +#define SQLTDFK 44 /* drop foreign key */ +/* SERVER COMMAND TYPES */ +#define SQLTCDA 45 /* create dbarea */ +#define SQLTADA 46 /* alter dbarea */ +#define SQLTDDA 47 /* delete dbarea */ +#define SQLTCSG 48 /* create stogroup */ +#define SQLTASG 49 /* alter stogroup */ +#define SQLTDSG 50 /* delete stogroup */ +#define SQLTCRD 51 /* create database */ +#define SQLTADB 52 /* alter database */ +#define SQLTDDB 53 /* delete database */ +#define SQLTSDS 54 /* set default stogroup */ +#define SQLTIND 55 /* install database */ +#define SQLTDED 56 /* de-install database */ +/* END OF SERVER COMMAND TYPES */ + +#define SQLTARU 57 /* add RI user error */ +#define SQLTDRU 58 /* drop RI user error */ +#define SQLTMRU 59 /* modify RI user error */ +#define SQLTSCL 60 /* set client */ +#define SQLTCKT 61 /* check table */ +#define SQLTCKI 62 /* check index */ +#define SQLTOPL 63 /* PL/SQL Stored Procedure */ +#define SQLTBGT 64 /* BEGIN TRANSACTION */ +#define SQLTPRT 65 /* PREPARE TRANSACTION */ +#define SQLTCXN 66 /* COMMIT TRANSACTION */ +#define SQLTRXN 67 /* ROLLBACK TRANSACTION */ +#define SQLTENT 68 /* END TRANSACTION */ + +/* COMMIT SERVER COMMAND TYPES */ +#define SQLTCBT 69 /* begin transaction */ +#define SQLTCCT 70 /* commit transaction */ +#define SQLTCET 71 /* end transaction */ +#define SQLTCPT 72 /* prepare transaction */ +#define SQLTCRT 73 /* rollback transaction */ +#define SQLTCST 74 /* status transaction */ +#define SQLTCRX 75 /* reduce transaction */ +#define SQLTCSD 76 /* start daemon */ +#define SQLTCTD 77 /* stop daemon */ +#define SQLTCRA 78 /* resolve all transactions */ +#define SQLTCRO 79 /* resolve one transaction */ +#define SQLTCOT 80 /* orphan a transaction */ +#define SQLTCFL 81 /* CREATE FAILURE */ +#define SQLTDFL 82 /* DELETE FAILURE */ +#define SQLTSTN 83 /* SET TRACETWOPC ON */ +#define SQLTSTF 84 /* SET TRACETWOPC OFF */ +#define SQLTUNL 85 /* Unload command */ +#define SQLTLDP 86 /* load command */ +#define SQLTPRO 87 /* stored procedure */ +#define SQLTGEP 88 /* grant execute privilege */ +#define SQLTREE 89 /* revoke execute privilege */ +#define SQLTTGC 90 /* create trigger */ +#define SQLTTGD 91 /* drop trigger */ +#define SQLTVNC 92 /* create event */ +#define SQLTVND 93 /* drop event */ +#define SQLTSTR 94 /* start audit */ +#define SQLTAUD 95 /* audit message */ +#define SQLTSTP 96 /* stop audit */ +#define SQLTACM 97 /* Alter CoMmand */ +#define SQLTXDL 98 /* lock database */ +#define SQLTXDU 99 /* unlock database */ +#define SQLTCEF 100 /* create external function */ +#define SQLTDEF 101 /* drop external function */ +#define SQLTDBT 102 /* DBATTRIBUTE */ +#define SQLTATG 103 /* ALTER TRIGGER */ +#define SQLTAEF 104 /* alter external function */ +#define SQLTADS 105 /* alter database security */ +#define SQLTAEK 106 /* alter exportkey */ +#define SQLTASP 107 /* alter server */ +#define SQLTLTB 108 /* lock table */ + +// Unclassified command types +#define SQLTAIN 109 // Auto_INcrement +#define SQLTCRL 110 // Create RoLe +#define SQLTDRL 111 // Drop RoLe +#define SQLTGRL 112 // Grant RoLe +#define SQLTRRL 113 // Revoke RoLe + +/* DEFAULTS */ +#define SQLDCGP 30 /* CACHEGROUP, cache page allocation group */ +#define SQLDCRT 5 /* CONNECTRETRY, seconds for connect timeout */ +#define SQLDCPT 10 /* CONNECTPAUSETICKS, ticks for pausing */ +#define SQLDDGH 10000l /* HEAP, DBGATEWY heap size */ +#define SQLDDLH 145000l /* HEAP, DBLOCAL heap size */ +#define SQLDDRH 20000l /* HEAP, DBROUTER heap size */ +#define SQLDNBS 30000 /* NETBUFFER, size DBXROUTR network buffer */ +#define SQLDRET 3 /* RETRY, number of connect retries */ +#define SQLDSMS 20000 /* Minimum stack size */ +#define SQLDSVS 50000 /* Default STACKSIZE, DBSERVER stack */ +#define SQLDSXS 100000 /* Maximum stack size */ +#define SQLDMSK 200000 /* how much stackspace to reserve for main sqlbase thread */ +#define SQLDNPR 300 /* # processes stacks preallocated for */ +#define SQLDTMZ 0l /* TIMEZONE */ +#define SQLDSVU 128 /* USERS, DBSERVER users */ +#define SQLDSMU 3 /* USERS, DBSIM users */ +#define SQLDCLI 1024000L /* checkpoint log interval in bytes */ +#define SQLDCTI 1 /* checkpt time interval in minutes */ +#define SQLDWSA 1000 /* cursor work space allocation */ +#define SQLDPRE 5 /* decimal precision */ +#define SQLDSCA 0 /* decimal scale */ +#define SQLDIML 2000 /* input message buffer length */ +#define SQLDPRI 10 /* integer precision */ +#define SQLDSUL 6 /* length of system user name */ +#define SQLDLBS 20480 /* log buffer size in bytes */ +#define SQLDLFS 1024000L /* log file size in bytes */ +#define SQLDHFS 1000 /* maximum history file size */ +#define SQLDLPM 20000 /* maximum number of rollback log pages */ +#define SQLDNES 100 /* normal file extension size */ +#define SQLDOML 1000 /* output message buffer length */ +#define SQLDPES 1024 /* partitioned file extension size */ +#define SQLDPUB "PUBLIC" /* public user name */ +#define SQLDLPT 16000 /* rollback log page threshold */ +#define SQLDPRS 5 /* smallint precision */ +#define SQLDSUN "SYSADM" /* system default username */ +#define SQLDESC "$$" /* connect escape sequence */ +#define SQLDSUN "SYSADM" /* system default username */ +#define SQLDNTG 16 /* number of triggers allowed per event/time/scope */ + /* Maximum triggers for an event is * 4 */ + +/* MAXIMUM SIZES */ +#define SQLMSBNL 18 /* short bind name length */ +#define SQLMBNL 36 /* bind name length */ +#define SQLMONS (SQLMBNL * 4) /* Maximum name size (compatibility with SB10) */ +#define SQLMLBNL 64 /* long bind name length */ +#define SQLMBSL 32000 /* max length Backend string literal */ +#define SQLMCG1 32767 /* cache group pages */ +#define SQLMCKF 16 /* concatenated key fields */ +#define SQLMCLL 255 /* clientlimit */ +#define SQLMCLN 12 /* maximum client name size */ +#define SQLMCLN_L 256 /* maximum client name size (SQLBase 11.7 and above) */ +#define SQLMCLP 128 /* commmand line parameter length */ +#define SQLMCMT 113 /* max command types */ +#define SQLMCNM SQLMBNL /* max referential constraint name */ +#define SQLMCOH 255 /* column heading string */ +#define SQLMCST 400 /* max connect string length */ +#define SQLMDBA 10 /* number of databases accessed */ +#define SQLMDFN 25 /* database file name */ +#define SQLMPSS 25 /* process status string */ +#define SQLMDMO 750 /* maximum DB size for demos (Kbytes) */ +#define SQLMSDNM 8 /* database name CAM_1..4_VERSION */ +#define SQLMDNM 16 /* database name */ +#define SQLMDVL_S 254 /* data value length */ +#define SQLMDVL 900 /* data value length */ +#define SQLMNCHL_S 127 /* Maximum # chars in NCHAR/NVARCHAR column */ +#define SQLMNCHL 450 /* Maximum # chars in NCHAR/NVARCHAR column */ +#define SQLMERR 255 /* error message length */ +#define SQLMETX 3000 /* error text length */ +/* ------------------------------------------------------------------------- * + * We are reverting back to the previous value of 128 for SQLMFNL because it * + * is resulting in unnecessary complications in the cdm, aic size etc. * + * ------------------------------------------------------------------------- */ +#define SQLMFNL 128 /* filename length (legacy size) */ +#define SQLMFNL_L 260 /* filename length (large size) */ + +/* ------------------------------------------------------------------------- * + * Note : We are defining a new constant called SQLRFNL which is used to * + * create a filename of restricted length (128) instead of SQLMFNL. It is * + * required because the areas table created by main.ini uses a pathname of * + * 128 bytes * + * ------------------------------------------------------------------------- */ +#define SQLRFNL 128 +#define SQLMFQN 3 /* number of fields in fully qualified column name */ +#define SQLMFRD 40 /* maximum size of foreign result set directory */ +#define SQLMGCM 32767 /* maximum group commit count */ +#define SQLMICO 255 /* installed cache page owners */ +#define SQLMICU 255 /* installed cursors */ +#define SQLMIDB 255 /* installed databases */ +#define SQLMILK 32767 /* installed locks */ +#define SQLMINL 2000 /* input length */ +#define SQLMIPG 1000000 /* installed pages */ +#define SQLMIPR 800 /* installed processes */ +#define SQLMITR 800 /* installed transactions */ +#define SQLMJTB 17 /* joined tables */ +#define SQLMTAC 17*16 /* tables each tab can have subsel */ +#define SQLMLID 32 /* long identifiers */ +#define SQLMNBF 60000 /* network buffer size */ +#define SQLMNCO 1001 /* number of columns per row */ +#define SQLMUCO 1000 /* number of user columns available */ +#define SQLMNPF 3 /* NETPREFIX size */ +#define SQLMOUL 1000 /* output length */ +#define SQLMPAL 255 /* max path string length */ +#define SQLMSVP 1024 /* max serverpath (inside ini client section) string length */ +#define SQLMPFS 21 /* max platform string length */ +#define SQLMPKL 1200 /* max primary key length */ +#define SQLMPRE 15 /* maximum decimal precision */ +#define SQLMPTL 4 /* maximum print level */ +#define SQLMPWD 128 /* maximum password length */ +#define SQLMCTL 43200 /* max query timelimit (12 hours) */ +#define SQLMRBB 8192 /* maximum rollback log buffer */ +#define SQLMRCB 20480 /* maximum recovery log buffer */ +#define SQLMRET 1000 /* retry count */ +#define SQLMRFH 4 /* maximum # remote file handles */ +#define SQLMROB 8192 /* max size of restore output buffer */ +#define SQLMSES 16 /* number of sessions */ +#define SQLMSID 8 /* short identifiers */ +#define SQLMSLI 255 /* max number of select list exprs. */ +#define SQLMSNM_S 8 /* server name prior to 11.7 */ +#define SQLMSNM 36 /* server name */ +#define SQLMSRL 32 /* max length of SQL reserved word */ +#define SQLMSVN 199 /* maximum server names */ +#define SQLMTFS 10 /* maximum temporary file size */ +#define SQLMTMO 200 /* maximum timeout */ +#define SQLMTSS 256 /* text string space size */ +#define SQLMUSR 128 /* maximum username length */ +#define SQLMVER 8 /* max version string (nn.nn.nn) */ +#define SQLMXER 255 /* Extended error message length */ +#define SQLMXFS 2147483648UL /* max file size in bytes */ +#define SQLMXLF 2097152 /* max log file size in KB */ +#define SQLMTHM 2 /* maximum thread mode value */ +#define SQLMGTI 250 /* max global transaction-id length */ +#define SQLMAUF 32 /* max concurrent audit files */ +#define SQLMPNM 8 /* max protocol name length */ +#define SQLMOSR 255 /* max OS sample rate */ +#define SQLMAWS 255 /* max OS Averaging window size */ +#define SQLMMID 32 /* max length identificatin strings */ +#define SQLMLENDAL (0xFFFF) // Maximum size of SQLTDAL +#define SQLMEUSR 128 // Maximum length in bytes of external user + +/* MINIMUMS */ +#define SQLMCG0 1 /* cache group pages */ +#define SQLMEXS 1024 /* partitioned file extension size */ +#define SQLMLFE 100000L /* minimum log file extension size */ +#define SQLMLFS 100000L /* minimum log file size */ +#define SQLMPAG 15 /* minimum pages (cache) */ +#define SQLMITM 1 /* minimum thread mode value */ + +/* typedefs */ +#if defined(_WIN32) +typedef __int8 byte1; +typedef unsigned __int8 ubyte1; +typedef __int16 byte2; +typedef unsigned __int16 ubyte2; +typedef __int32 byte4; +typedef unsigned __int32 ubyte4; +typedef __int64 byte8; /* 64-bits signed */ +typedef unsigned __int64 ubyte8; /* 64-bits unsigned */ +#else // linux +#pragma pack(push, 8) +#include +#pragma pack(pop) +typedef int8_t byte1; +typedef uint8_t ubyte1; +typedef int16_t byte2; +typedef uint16_t ubyte2; +typedef int32_t byte4; +typedef uint32_t ubyte4; +typedef int64_t byte8; +typedef uint64_t ubyte8; +#endif + +typedef ubyte1 *ubyte1p; +typedef int (SBSTDCALL * SQLTPFP) (void); + +#if SQLBASE_DEFINE_WIDE_COLUMNS +typedef ubyte2 ubyte1x; +#else +typedef ubyte1 ubyte1x; +#endif + +// Typedefs defined to work with both wide character columns and the +// narrower ones. These are conditionally defined to be either 1 or 2 +// byte width. +typedef ubyte1x SQLTBNN; /* bind number */ +typedef ubyte1x SQLTCDL; /* column data length */ +typedef ubyte1x SQLTCHL; /* column header length */ +typedef ubyte1x SQLTDDL; /* database data length */ +typedef ubyte1x SQLTLBL; /* label information length */ +typedef ubyte1x SQLTNBV; /* number of bind variables */ +typedef ubyte1x SQLTNSI; /* number of select items */ +typedef ubyte1x SQLTPDL; /* program data length */ +typedef ubyte1x SQLTSLC; /* select list column */ + +// These are the 1 byte flavor of the above defines to be used where +// explicitly needed. +typedef ubyte1 SQLTBNN_S; /* bind number */ +typedef ubyte1 SQLTCDL_S; /* column data length */ +typedef ubyte1 SQLTCHL_S; /* column header length */ +typedef ubyte1 SQLTDDL_S; /* database data length */ +typedef ubyte1 SQLTLBL_S; /* label information length */ +typedef ubyte1 SQLTNBV_S; /* number of bind variables */ +typedef ubyte1 SQLTNSI_S; /* number of select items */ +typedef ubyte1 SQLTPDL_S; /* program data length */ +typedef ubyte1 SQLTSLC_S; /* select list column */ + +// These are the 2 byte flavor of the above defines to be used where +// explicitly needed. +typedef ubyte2 SQLTBNN_L; /* bind number */ +typedef ubyte2 SQLTCDL_L; /* column data length */ +typedef ubyte2 SQLTCHL_L; /* column header length */ +typedef ubyte2 SQLTDDL_L; /* database data length */ +typedef ubyte2 SQLTLBL_L; /* label information length */ +typedef ubyte2 SQLTNBV_L; /* number of bind variables */ +typedef ubyte2 SQLTNSI_L; /* number of select items */ +typedef ubyte2 SQLTPDL_L; /* program data length */ +typedef ubyte2 SQLTSLC_L; /* select list column */ + +typedef ubyte1 SQLTARC; /* remote connection architecture */ +typedef ubyte1 SQLTBNL; /* bind name length */ +typedef ubyte1p SQLTBNP; /* bind name pointer */ +typedef byte2 SQLTNUL; /* null indicator */ +typedef ubyte1 SQLTBOO; /* boolean data type */ +typedef ubyte1 SQLTCHO; /* check option */ +typedef ubyte1p SQLTCHP; /* column header pointer */ +typedef ubyte2 SQLTCLL; /* column data length(long) */ +typedef ubyte1 SQLTCTY; /* command type */ +typedef ubyte2 SQLTCUR; /* cursor number */ +typedef ubyte2 SQLTCVL; /* column value length (enlarged size) */ +typedef ubyte2 SQLTDAL; /* data length */ +typedef ubyte1p SQLTDAP; /* data pointer */ +typedef byte2 SQLTDAY; /* number of days */ +typedef ubyte1 SQLTDDT; /* database data type */ +typedef ubyte2 SQLTDEDL; /* database extended data length */ +typedef ubyte2 SQLTDPT; /* database parameter type */ +typedef ubyte4 SQLTDPV; /* database parameter value */ +typedef ubyte2 SQLTEPO; /* error position */ +typedef ubyte2 SQLTFAT; /* file attribute */ +typedef ubyte2 SQLTFLD; /* SELECT statement field number */ +typedef byte2 SQLTFLG; /* flag field */ +typedef ubyte4 SQLTFLH; /* file handle */ +typedef byte2 SQLTFMD; /* file mode */ +typedef ubyte2 SQLTFNL; /* file name length */ +typedef ubyte1p SQLTFNP; /* file name pointer */ +typedef ubyte1 SQLTFSC; /* fetch status code */ +typedef ubyte1p SQLTILV; /* isolation level string */ +typedef ubyte1p SQLTLBP; /* label infromation pointer */ +typedef byte8 SQLTLLI; /* long long integer */ +typedef byte4 SQLTLNG; /* long size */ +typedef ubyte4 SQLTLSI; /* long size */ +typedef ubyte2 SQLTMSZ; /* message size */ +typedef ubyte2 SQLTNCL; // number of columns +typedef ubyte2 SQLTNCU; /* number of cursors */ +typedef ubyte1 SQLTNML; /* number length */ +typedef ubyte1p SQLTNMP; /* number pointer */ +typedef ubyte2 SQLTNPG; /* number of pages */ +typedef ubyte4 SQLTLNPG; /* number of pages */ +typedef ubyte1 SQLTPCX; /* preserve context flag */ +typedef ubyte1 SQLTPDT; /* program data type */ +typedef ubyte4 SQLTPGN; /* page number */ +typedef ubyte2 SQLTPNM; /* process number */ +typedef ubyte1 SQLTPRE; /* precision */ +typedef ubyte2 SQLTPTY; /* set/get parameter type */ +typedef ubyte1 SQLTRBF; /* roll back flag */ +typedef byte2 SQLTRCD; /* return codes */ +typedef ubyte1 SQLTRCF; /* recovery flag */ +typedef ubyte2 SQLTRFM; /* rollforward mode */ +typedef byte4 SQLTROW; /* number of rows */ +typedef ubyte1 SQLTSCA; /* scale */ +typedef ubyte2 SQLTSTC; /* statistics counter */ +typedef ubyte2 SQLTSVH; /* server handle */ +typedef ubyte2 SQLTSVN; /* server number */ +typedef byte2 SQLTTIV; /* wait timeout value */ +typedef byte2 SQLTWNC; /* whence */ +typedef ubyte2 SQLTWSI; /* work size */ +typedef ubyte4 SQLTWSI_L; // large work size +typedef ubyte2 SQLTBIR; /* bulk insert error row number */ +typedef ubyte1p SQLTDIS; /* Describe info indicator */ +typedef byte4 SQLTXER; /* extended error # */ +typedef ubyte4 SQLTPID; /* client process id */ +typedef ubyte4 SQLTMOD; /* mode flag */ +typedef ubyte4 SQLTCON; /* connection handle */ +typedef ubyte2 SQLTCID; // collation ID + +/* defines for isolation level string */ +#define SQLILRR "RR" /* Repeatable Read isolation */ +#define SQLILCS "CS" /* Cursor Stability isolation */ +#define SQLILRO "RO" /* Read-Only isolation */ +#define SQLILRL "RL" /* Release Locks isolation */ +#define SQLILRC "RC" // Read Committed isolation +#define SQLILRC1 "R1" // Read Committed isolation mode 1 (default RC mode) +#define SQLILRC2 "R2" // Read Committed isolation mode 2 +#define SQLILRC3 "R3" // Read Committed isolation mode 3 +/* defines for isolation level flags*/ +#define SQLFIRR 0x01 /* Repeatable Read isolation flag */ +#define SQLFICS 0x02 /* Cursor Stability isolation flag */ +#define SQLFIRO 0x04 /* Read-Only isolation flag */ +#define SQLFIRL 0x08 /* Release Locks isolation flag */ +#define SQLFIRC 0x10 // Read Committed isolation flag +/* defines for RC isolation level mode */ +#define SQLIMRCX 0 // Not in RC mode +#define SQLIMRC1 1 // Timestamp moves when no active cursor (default) +#define SQLIMRC2 2 // Timestamp moves on new commands +#define SQLIMRC3 3 // Timestamp moves on new commands and fetches +/* defines for SQLROF rollforward mode parameter */ +#define SQLMEOL 1 /* rollforward to end of log */ +#define SQLMEOB 2 /* rollforward to end of backup */ +#define SQLMTIM 3 /* rollforward to specified time */ +/* defines for when to collect Describe information */ +#define SQLDELY 0 /* get Describe info after sqlcom */ +#define SQLDDLD 1 /* get Describe info after sqlexe */ +#define SQLDNVR 2 /* never get any Describe info */ +/* defines for SQLETX() and SQLTEM(): error text type parameters */ +#define SQLXMSG 1 /* retrieve error message text */ +#define SQLXREA 2 /* retrieve error message reason */ +#define SQLXREM 4 /* retrieve error message remedy */ + +/* defines for extended directory open function */ +#define SQLANRM 0x00 /* normal - no restrictions */ +#define SQLARDO 0x01 /* read only */ +#define SQLAHDN 0x02 /* hidden file */ +#define SQLASYS 0x04 /* system file */ +#define SQLAVOL 0x08 /* volume label */ +#define SQLADIR 0x10 /* directory */ +#define SQLAARC 0x20 /* archive bit */ +#define SQLAFDL 0x100 /* files and directories */ +#define SQLAFIL 0x200 /* files only */ + +/* defines for state of cursor */ +#define SQLCIDL 0 /* idle cursor */ +#define SQLCECM 1 /* executing compile */ +#define SQLCCCM 2 /* completed compile */ +#define SQLCEXE 3 /* executing command */ +#define SQLCCXE 4 /* completed command */ +#define SQLCEFT 5 /* executing fetch */ +#define SQLCCFT 6 /* completed fetch */ +/* SYSTEM DEFINED TYPEDEF'S -- FOR SYSTEM USE ONLY */ + +typedef ubyte2 SQLTMSL; /* message length */ +typedef byte1 *SQLTMSP; /* message pointer */ + +/* +DESCRIPTION + This structure is used to receive system information from the + backend. Structure elements must be arranged so that the structure + layout is the same in packed or padded compilation modes. For + now, this means longs in the front, ints in the middle, and chars at + the end of the structure. +*/ + +struct sysdefx +{ + SQLTPGN syslpt; /* log page threshold */ + SQLTPGN syslpm; /* log page maximum */ + ubyte4 syshep; /* heap size */ + SQLTNPG sysncp; /* number of cache pages */ + SQLTTIV systiv; /* wait timeout value in seconds */ + ubyte1 sysiso[3]; /* isolation level */ + ubyte1 sysjou; /* journal */ + ubyte1 syslog; /* log */ + ubyte1 sysrec; /* recovery */ + ubyte1 systyp; /* system type */ +}; +typedef struct sysdefx sysdef; +typedef struct sysdefx SQLTSYS; +#define SYSSIZ sizeof(sysdef) + + +/* +DESCRIPTION: + This structure is used as a parameter to the SQLGDI function. After a + a compile, all relevant information for a given Select column can be + obtained in this structure. + Note: + Please note that, originally, gdichb was the first element of the + gdidefx structure. It has been moved further down because a column + heading can be greater than 31 bytes. A bug was reported complaining + that the column heading was not being returned correctly since the + maximum length of a column heading is 46. This can now be returned + since the size of the buffer (gdichb) has been changed to 47. + Also, the length field (gdichl) has also been moved down to go with + the column heading buffer (gdichb). + The original gdichb and gdichl fields have been renamed to gdifl1 and + gdifl2. +*/ +struct gdidefx +{ + ubyte1 gdifl1[31]; /* filler reserved for future use */ + ubyte1 gdifl2; /* filler reserved for future use */ + ubyte1 gdilbb[31]; /* label buffer */ + SQLTLBL_S gdilbl; /* label info length */ + SQLTSLC_S gdicol; /* select column number */ + SQLTDDT gdiddt; /* database data type */ + SQLTDEDL gdiddl; /* database extended data length */ + SQLTDDT gdiedt; /* external data type */ + SQLTDEDL gdiedl; /* external extended data length */ + SQLTPRE gdipre; /* decimal precision */ + SQLTSCA gdisca; /* decimal scale */ + byte2 gdinul; /* null indicator */ + ubyte1 gdichb[47]; /* column heading buffer */ + SQLTCHL_S gdichl; /* column heading length */ + byte1 gdifil[2]; /* for future use */ +}; +typedef struct gdidefx gdidef; +typedef struct gdidefx SQLTGDI; +typedef struct gdidefx *SQLTPGD; +#define GDISIZ sizeof(gdidef) + +// Make compatible with SB10 +struct gdidef2x +{ + ubyte1 gdifl1[31]; /* filler reserved for future use */ + ubyte1 gdifl2; /* filler reserved for future use */ + ubyte1 gdilbb[31]; /* label buffer */ + SQLTLBL_S gdilbl; /* label info length */ + SQLTSLC_L gdicol; /* select column number */ + SQLTDDT gdiddt; /* database data type */ + SQLTDEDL gdiddl; /* database extended data length */ + SQLTDDT gdiedt; /* external data type */ + SQLTDEDL gdiedl; /* external extended data length */ + SQLTPRE gdipre; /* decimal precision */ + SQLTSCA gdisca; /* decimal scale */ + byte2 gdinul; /* null indicator */ + ubyte1 gdichb[47]; /* column heading buffer */ + SQLTCHL_S gdichl; /* column heading length */ + byte1 gdifil[1]; /* for future use */ +}; +typedef struct gdidef2x gdidef2; +typedef struct gdidef2x SQLTGDI2; +typedef struct gdidef2x *SQLTPGD2; +#define GDISIZ2 sizeof(gdidef2) + +/* +DESCRIPTION + This structure is used when passing binary data to and from external + functions. Since binary data can contains nulls as part of the data + we cannot look for a string terminator. Hence this structure is used + to provide a pointer to the binary data and the length of the data. +*/ + +struct binaryx +{ + long binary_len; + char *binary_ptr; +}; + +#ifndef _INC_FSTREAM +typedef struct binaryx binary; +#endif +typedef struct binaryx BINARY; +typedef struct binaryx *lpbinary; +typedef struct binaryx *LPBINARY; + +#define BINARYSIZ sizeof(BINARY) + +#define BINARY_GET_LENGTH(x) (x.binary_len) +#define BINARY_GET_BUFFER(x) (x.binary_ptr) + +#define BINARY_SET_LENGTH(x,y) (x.binary_len=y) +#define BINARY_SET_BUFFER(x,y) (x.binary_ptr=y) + +/* + The following datatypes are analogous to the SqlWindows datatypes + NUMBER and DATETIME. They are used to pass the Sqlbase internal number + and datatime datatypes to external functions +*/ + +struct datetimex +{ + char datetime_len; + char datetime_value[12]; +}; + +typedef struct datetimex datetime; + +#define DATETIMESIZ sizeof(datetime) + +#define DATETIME_IS_NULL(x) (x.datetime_len == 0) +#define DATETIME_SET_NULL(x) (x.datetime_len = 0) + +struct numberx +{ + char number_len; + char number_value[12]; +}; + +typedef struct numberx number; + +#define NUMBERSIZ sizeof(number) + +#define NUMBER_IS_NULL(x) (x.number_len == 0) +#define NUMBER_SET_NULL(x) (x.number_len = 0) + + +/* system types */ +#define SYSTSGL 1 /* single user */ +#define SYSTMUL 2 /* multi-user */ +#define SYSTDB2 3 /* DB2 */ +#define SYSTDMO 4 /* demo */ +#define SYSTGWY 5 /* SQLNetwork Gateway */ +#define SYSTRTR 6 /* SQLNetwork Router */ +#define SYSTSHAS 7 /* SQLNetwork SQLHost App Services */ + +/*------------------------------------------------------------------------- + SQL API calling convention: + + For 32-bit systems, the calling convention used depends on the + target platform: + + - For NetWare and Windows/NT, the __stdcall calling convention is used. + If __stdcall is not supported by your compiler, then you will need + to define it to be something equivalent to __stdcall. + ------------------------------------------------------------------------- */ + +# define SQLTAPI byte2 SBSTDCALL /* Use __stdcall */ + +/* SQL FUNCTION PROTOTYPES */ + +SQLTAPI sqlarf(SQLTCUR cur, SQLTFNP fnp, SQLTFNL fnl, SQLTCHO cho); +SQLTAPI sqlbbr(SQLTCUR cur, SQLTXER *errnum, SQLTDAP errbuf, SQLTDAL *buflen, + SQLTBIR *errrow, SQLTRBF *rbf, SQLTBIR errseq); +SQLTAPI sqlbdb(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel, SQLTFNP bkpdir, + SQLTFNL bkpdirl, SQLTBOO local, SQLTBOO over); +SQLTAPI sqlbef(SQLTCUR cur); +SQLTAPI sqlber(SQLTCUR cur, SQLTRCD *rcd, SQLTBIR *errrow, SQLTRBF *rbf, SQLTBIR errseq); +SQLTAPI sqlbkp(SQLTCUR cur, SQLTBOO defalt, SQLTBOO overwrt, SQLTFNP bkfname, + SQLTFNL bkfnlen); +SQLTAPI sqlbld(SQLTCUR cur, SQLTBNP bnp, SQLTBNL bnl); +SQLTAPI sqlbld2(SQLTCUR cur, SQLTBNP bnp, SQLTBNL bnl, SQLTPDT pdt); +SQLTAPI sqlblf(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel, SQLTFNP bkpdir, + SQLTFNL bkpdirl, SQLTBOO local, SQLTBOO over); +SQLTAPI sqlblk(SQLTCUR cur, SQLTFLG blkflg); +SQLTAPI sqlbln(SQLTCUR cur, SQLTBNN_S bnn); +SQLTAPI sqlbln2(SQLTCUR cur, SQLTBNN_L bnn, SQLTPDT pdt); +SQLTAPI sqlbna(SQLTCUR cur, SQLTBNP bnp, SQLTBNL bnl, SQLTDAP dap, SQLTDAL dal, + SQLTSCA sca, SQLTPDT pdt, SQLTNUL nli); +SQLTAPI sqlbnd(SQLTCUR cur, SQLTBNP bnp, SQLTBNL bnl, SQLTDAP dap, SQLTDAL dal, + SQLTSCA sca, SQLTPDT pdt); +SQLTAPI sqlbnn(SQLTCUR cur, SQLTBNN_S bnn, SQLTDAP dap, SQLTDAL dal, SQLTSCA sca, + SQLTPDT pdt); +SQLTAPI sqlbnn2(SQLTCUR cur, SQLTBNN_L bnn, SQLTDAP dap, SQLTDAL dal, SQLTSCA sca, + SQLTPDT pdt); +SQLTAPI sqlbnu(SQLTCUR cur, SQLTBNN_S bnn, SQLTDAP dap, SQLTDAL dal, SQLTSCA sca, + SQLTPDT pdt, SQLTNUL nli); + +SQLTAPI sqlbnu2(SQLTCUR cur, SQLTBNN_L bnn, SQLTDAP dap, SQLTDAL dal, SQLTSCA sca, + SQLTPDT pdt, SQLTNUL nli); +SQLTAPI sqlbss(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel, SQLTFNP bkpdir, + SQLTFNL bkpdirl, SQLTBOO local, SQLTBOO over); +SQLTAPI sqlcan(SQLTCUR cur); +SQLTAPI sqlcbv(SQLTCUR cur); +SQLTAPI sqlcch(SQLTCON *hConp, SQLTDAP dbnamp, SQLTDAL dbnaml, SQLTMOD fType); +SQLTAPI sqlcdr(SQLTSVH shandle, SQLTCUR cur); +SQLTAPI sqlcex(SQLTCUR cur, SQLTDAP dap, SQLTDAL dal); +SQLTAPI sqlcexUtf8(SQLTCUR cur, SQLTDAP dap, SQLTDAL dal); +SQLTAPI sqlcexW(SQLTCUR cur, wchar_t *dap, SQLTDAL dal); +SQLTAPI sqlclf(SQLTSVH cur, SQLTDAP logfile, SQLTFMD startflag); +SQLTAPI sqlcmt(SQLTCUR cur); +SQLTAPI sqlcnc(SQLTCUR *curp, SQLTDAP dbnamp, SQLTDAL dbnaml); +SQLTAPI sqlcnr(SQLTCUR *curp, SQLTDAP dbnamp, SQLTDAL dbnaml); +SQLTAPI sqlcom(SQLTCUR cur, SQLTDAP cmdp, SQLTDAL cmdl); +SQLTAPI sqlcomUtf8(SQLTCUR cur, SQLTDAP cmdp, SQLTDAL cmdl); +SQLTAPI sqlcomW(SQLTCUR cur, wchar_t *cmdp, SQLTDAL cmdl); +SQLTAPI sqlcon(SQLTCUR *curp, SQLTDAP dbnamp, SQLTDAL dbnaml, SQLTWSI cursiz, + SQLTNPG pages, SQLTRCF recovr, SQLTDAL outsize, SQLTDAL insize); +SQLTAPI sqlcpy(SQLTCUR fcur, SQLTDAP selp, SQLTDAL sell, SQLTCUR tcur, SQLTDAP isrtp, + SQLTDAL isrtl); +SQLTAPI sqlcre(SQLTSVH shandle, SQLTDAP dbnamp, SQLTDAL dbnaml); +SQLTAPI sqlcrf(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel); +SQLTAPI sqlcrs(SQLTCUR cur, SQLTDAP rsp, SQLTDAL rsl); +SQLTAPI sqlcsv(SQLTSVH *shandlep, SQLTDAP serverid, SQLTDAP password); +SQLTAPI sqlcty(SQLTCUR cur, SQLTCTY *cty); +SQLTAPI sqldbn(SQLTDAP serverid, SQLTDAP buffer, SQLTDAL length); +SQLTAPI sqldch(SQLTCON hCon); +SQLTAPI sqlded(SQLTSVH shandle, SQLTDAP dbnamp, SQLTDAL dbnaml); +SQLTAPI sqldel(SQLTSVH shandle, SQLTDAP dbnamp, SQLTDAL dbnaml); +SQLTAPI sqldes(SQLTCUR cur, SQLTSLC_S slc, SQLTDDT *ddt, SQLTDDL_S *ddl, SQLTCHP chp, + SQLTCHL_S *chlp, SQLTPRE *prep, SQLTSCA *scap); +SQLTAPI sqldes2(SQLTCUR cur, SQLTSLC_L slc, SQLTDDT *ddt, SQLTDDL_L *ddl, SQLTCHP chp, + SQLTCHL_L *chlp, SQLTPRE *prep, SQLTSCA *scap); +SQLTAPI sqldid(SQLTDAP dbname, SQLTDAL dbnamel); +SQLTAPI sqldii(SQLTCUR cur, SQLTSLC_S ivn, SQLTDAP inp, SQLTCHL_S *inlp); +SQLTAPI sqldii2(SQLTCUR cur, SQLTSLC_L ivn, SQLTDAP inp, SQLTCHL_L *inlp); +SQLTAPI sqldin(SQLTDAP dbnamp, SQLTDAL dbnaml); +SQLTAPI sqldir(SQLTSVN srvno, SQLTDAP buffer, SQLTDAL length); +SQLTAPI sqldis(SQLTCUR cur); +SQLTAPI sqldon(void); +SQLTAPI sqldox(SQLTSVH shandle, SQLTDAP dirnamep, SQLTFAT fattr); +SQLTAPI sqldrc(SQLTSVH cur); +SQLTAPI sqldro(SQLTSVH shandle, SQLTDAP dirname); +SQLTAPI sqldrr(SQLTSVH shandle, SQLTDAP filename); +SQLTAPI sqldrs(SQLTCUR cur, SQLTDAP rsp, SQLTDAL rsl); +SQLTAPI sqldsc(SQLTCUR cur, SQLTSLC_S slc, SQLTDDT *edt, SQLTDDL_S *edl, SQLTCHP chp, + SQLTCHL_S *chlp, SQLTPRE *prep, SQLTSCA *scap); +SQLTAPI sqldsc2(SQLTCUR cur, SQLTSLC_L slc, SQLTDDT *edt, SQLTDDL_L *edl, SQLTCHP chp, + SQLTCHL_L *chlp, SQLTPRE *prep, SQLTSCA *scap); +SQLTAPI sqldst(SQLTCUR cur, SQLTDAP cnp, SQLTDAL cnl); +SQLTAPI sqldsv(SQLTSVH shandle); +SQLTAPI sqlebk(SQLTCUR cur); +SQLTAPI sqlefb(SQLTCUR cur); +SQLTAPI sqlelo(SQLTCUR cur); +SQLTAPI sqlenl(SQLTCON hCon, SQLTDAP p1, SQLTDAL l1, SQLTDAP p2, SQLTDAL *l2_p); +SQLTAPI sqlenr(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel); +SQLTAPI sqlepo(SQLTCUR cur, SQLTEPO *epo); +SQLTAPI sqlerf(SQLTCUR cur); +SQLTAPI sqlerr(SQLTRCD error, SQLTDAP msg); +SQLTAPI sqlers(SQLTCUR cur); +SQLTAPI sqletx(SQLTRCD error, SQLTPTY msgtyp, SQLTDAP bfp, SQLTDAL bfl, SQLTDAL *txtlen); +SQLTAPI sqlexe(SQLTCUR cur); +SQLTAPI sqlexp(SQLTCUR cur, SQLTDAP buffer, SQLTDAL length); +SQLTAPI sqlfbk(SQLTCUR cur); +SQLTAPI sqlfer(SQLTRCD error, SQLTDAP msg); +SQLTAPI sqlfet(SQLTCUR cur); +SQLTAPI sqlfgt(SQLTSVH cur, SQLTDAP srvfile, SQLTDAP lclfile); +SQLTAPI sqlfpt(SQLTSVH cur, SQLTDAP srvfile, SQLTDAP lclfile); +SQLTAPI sqlfqn(SQLTCUR cur, SQLTFLD field, SQLTDAP nameptr, SQLTDAL *namelen); +SQLTAPI sqlgbi(SQLTCUR cur, SQLTCUR *pcur, SQLTPNM *ppnm); +SQLTAPI sqlgdi(SQLTCUR cur, SQLTGDI *gdi); +SQLTAPI sqlgdi2(SQLTCUR cur, SQLTGDI2 *gdi); +SQLTAPI sqlget(SQLTCUR cur, SQLTPTY parm, SQLTDAP p, SQLTDAL *l); +SQLTAPI sqlgfi(SQLTCUR cur, SQLTSLC_S slc, SQLTCDL_S *cvl, SQLTFSC *fsc); +SQLTAPI sqlgfi2(SQLTCUR cur, SQLTSLC_L slc, SQLTCDL_L *cvl, SQLTFSC *fsc); +SQLTAPI sqlgls(SQLTCUR cur, SQLTSLC_S slc, SQLTLSI *size); +SQLTAPI sqlgls2(SQLTCUR cur, SQLTSLC_L slc, SQLTLSI *size); +SQLTAPI sqlgnl(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel, SQLTLNG *lognum); +SQLTAPI sqlgnr(SQLTCUR cur, SQLTDAP tbnam, SQLTDAL tbnaml, SQLTROW *rows); +SQLTAPI sqlgsi(SQLTSVH shandle, SQLTFLG infoflags, SQLTDAP buffer, SQLTDAL buflen, + SQLTDAL *rbuflen); +SQLTAPI sqlgwo(SQLTCON hCon, SQLTDAP p, SQLTDAL *l); +SQLTAPI sqlidb(SQLTCUR cur); +SQLTAPI sqlims(SQLTCUR cur, SQLTDAL insize); +SQLTAPI sqlind(SQLTSVH shandle, SQLTDAP dbnamp, SQLTDAL dbnaml); +SQLTAPI sqlini(SQLTPFP callback); +SQLTAPI sqliniEx(SQLTDAP iniPath, SQLTDAL l); +SQLTAPI sqliniCfg(SQLTMOD operation, SQLTDAP cfg); +SQLTAPI sqliniCfgW(SQLTMOD operation, wchar_t *cfg); +SQLTAPI sqlins(SQLTSVN srvno, SQLTDAP dbnamp, SQLTDAL dbnaml, SQLTFLG createflag, + SQLTFLG overwrite); +SQLTAPI sqliqx(SQLTCON hCon, SQLTDAP p, SQLTDAL l, SQLTBOO *b); +SQLTAPI sqllab(SQLTCUR cur, SQLTSLC_S slc, SQLTCHP lbp, SQLTCHL_S *lblp); +SQLTAPI sqllab2(SQLTCUR cur, SQLTSLC_L slc, SQLTCHP lbp, SQLTCHL_L *lblp); +SQLTAPI sqlldp(SQLTCUR cur, SQLTDAP cmdp, SQLTDAL cmdl); +SQLTAPI sqllsk(SQLTCUR cur, SQLTSLC_S slc, SQLTLSI pos); +SQLTAPI sqllsk2(SQLTCUR cur, SQLTSLC_L slc, SQLTLSI pos); +SQLTAPI sqlmcl(SQLTSVH shandle, SQLTFLH fd); +SQLTAPI sqlmdl(SQLTSVH shandle, SQLTDAP filename); +SQLTAPI sqlmls(SQLTSVH shandle, SQLTFLH fd, SQLTLLI offset, SQLTWNC whence, + SQLTLLI *roffset); +SQLTAPI sqlmop(SQLTSVH shandle, SQLTFLH *fdp, SQLTDAP filename, SQLTFMD openmode); +SQLTAPI sqlmrd(SQLTSVH shandle, SQLTFLH fd, SQLTDAP buffer, SQLTDAL len, SQLTDAL *rlen); +SQLTAPI sqlmsk(SQLTSVH shandle, SQLTFLH fd, SQLTLNG offset, SQLTWNC whence, + SQLTLNG *roffset); +SQLTAPI sqlmwr(SQLTSVH shandle, SQLTFLH fd, SQLTDAP buffer, SQLTDAL len, SQLTDAL *rlen); +SQLTAPI sqlnbv(SQLTCUR cur, SQLTNBV_S *nbv); +SQLTAPI sqlnbv2(SQLTCUR cur, SQLTNBV_L *nbv); +SQLTAPI sqlnii(SQLTCUR cur, SQLTNSI_S *nii); +SQLTAPI sqlnii2(SQLTCUR cur, SQLTNSI_L *nii); +SQLTAPI sqlnrr(SQLTCUR cur, SQLTROW *rcountp); +SQLTAPI sqlnsi(SQLTCUR cur, SQLTNSI_S *nsi); +SQLTAPI sqlnsi2(SQLTCUR cur, SQLTNSI_L *nsi); +SQLTAPI sqloms(SQLTCUR cur, SQLTDAL outsize); +SQLTAPI sqlopc(SQLTCUR *curp, SQLTCON hCon, SQLTMOD fType); +SQLTAPI sqlprs(SQLTCUR cur, SQLTROW row); +SQLTAPI sqlrbf(SQLTCUR cur, SQLTRBF *rbf); +SQLTAPI sqlrbk(SQLTCUR cur); +SQLTAPI sqlrcd(SQLTCUR cur, SQLTRCD *rcd); +SQLTAPI sqlrdb(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel, SQLTFNP bkpdir, + SQLTFNL bkpdirl, SQLTBOO local, SQLTBOO over); +SQLTAPI sqlrdc(SQLTCUR cur, SQLTDAP bufp, SQLTDAL bufl, SQLTDAL *readl); +SQLTAPI sqlrel(SQLTCUR cur); +SQLTAPI sqlres(SQLTCUR *curptr, SQLTFNP bkfname, SQLTFNL bkfnlen, SQLTSVN bkfserv, + SQLTBOO overwrt, SQLTDAP dbname, SQLTDAL dbnlen, SQLTSVN dbserv); +SQLTAPI sqlret(SQLTCUR cur, SQLTDAP cnp, SQLTDAL cnl); +SQLTAPI sqlrlf(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel, SQLTFNP bkpdir, + SQLTFNL bkpdirl, SQLTBOO local, SQLTBOO over); +SQLTAPI sqlrlo(SQLTCUR cur, SQLTSLC_S slc, SQLTDAP bufp, SQLTDAL bufl, SQLTDAL *readl); +SQLTAPI sqlrlo2(SQLTCUR cur, SQLTSLC_L slc, SQLTDAP bufp, SQLTDAL bufl, SQLTDAL *readl, + SQLTPDT pdt); +SQLTAPI sqlrof(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel, SQLTRFM mode, + SQLTDAP datetime, SQLTDAL datetimel); +SQLTAPI sqlrow(SQLTCUR cur, SQLTROW *row); +SQLTAPI sqlrrd(SQLTCUR cur); +SQLTAPI sqlrrs(SQLTCUR cur, SQLTDAP rsp, SQLTDAL rsl); +SQLTAPI sqlrsi(SQLTSVH shandle); +SQLTAPI sqlrss(SQLTSVH shandle, SQLTDAP dbname, SQLTDAL dbnamel, SQLTFNP bkpdir, + SQLTFNL bkpdirl, SQLTBOO local, SQLTBOO over); +SQLTAPI sqlsab(SQLTSVH shandle, SQLTPNM pnum); +SQLTAPI sqlsap(SQLTSVN srvno, SQLTDAP password, SQLTPNM pnum); +SQLTAPI sqlscl(SQLTCUR cur, SQLTDAP namp, SQLTDAL naml); +SQLTAPI sqlscn(SQLTCUR cur, SQLTDAP namp, SQLTDAL naml); +SQLTAPI sqlscp(SQLTNPG pages); +SQLTAPI sqlsdn(SQLTDAP dbnamp, SQLTDAL dbnaml); +SQLTAPI sqlsds(SQLTSVH shandle, SQLTFLG shutdownflg); +SQLTAPI sqlsdx(SQLTSVH shandle, SQLTDAP dbnamp, SQLTDAL dbnaml, SQLTFLG shutdownflg); +SQLTAPI sqlset(SQLTCUR cur, SQLTPTY parm, SQLTDAP p, SQLTDAL l); +SQLTAPI sqlsil(SQLTCUR cur, SQLTILV isolation); +SQLTAPI sqlslp(SQLTCUR cur, SQLTNPG lpt, SQLTNPG lpm); +SQLTAPI sqlspr(SQLTCUR cur); +SQLTAPI sqlsrf(SQLTCUR cur, SQLTDAP fnp, SQLTDAL fnl); +SQLTAPI sqlsrs(SQLTCUR cur); +SQLTAPI sqlssb(SQLTCUR cur, SQLTSLC_S slc, SQLTPDT pdt, SQLTDAP pbp, SQLTPDL_S pdl, + SQLTSCA sca, SQLTCDL_S *pcv, SQLTFSC *pfc); +SQLTAPI sqlssb2(SQLTCUR cur, SQLTSLC_L slc, SQLTPDT pdt, SQLTDAP pbp, SQLTPDL_L pdl, + SQLTSCA sca, SQLTCDL_L *pcv, SQLTFSC *pfc); +SQLTAPI sqlsss(SQLTCUR cur, SQLTDAL size); +SQLTAPI sqlsta(SQLTCUR cur, SQLTSTC *svr, SQLTSTC *svw, SQLTSTC *spr, SQLTSTC *spw); +SQLTAPI sqlstm(SQLTSVH shandle); +SQLTAPI sqlsto(SQLTCUR cur, SQLTDAP cnp, SQLTDAL cnl, SQLTDAP ctp, SQLTDAL ctl); +SQLTAPI sqlstr(SQLTCUR cur); +SQLTAPI sqlsxt(SQLTSVN srvno, SQLTDAP password); +SQLTAPI sqlsys(SQLTCUR cur, SQLTSYS *sys); +SQLTAPI sqltec(SQLTRCD rcd, SQLTRCD *np); +SQLTAPI sqltem(SQLTCUR cur, SQLTXER *xer, SQLTPTY msgtyp, SQLTDAP bfp, SQLTDAL bfl, + SQLTDAL *txtlen); +SQLTAPI sqltio(SQLTCUR cur, SQLTTIV _timeout); +SQLTAPI sqlunl(SQLTCUR cur, SQLTDAP cmdp, SQLTDAL cmdl); +SQLTAPI sqlurs(SQLTCUR cur); +SQLTAPI sqlwdc(SQLTCUR cur, SQLTDAP bufp, SQLTDAL bufl); +SQLTAPI sqlwlo(SQLTCUR cur, SQLTDAP bufp, SQLTDAL bufl); +SQLTAPI sqlxad(SQLTNMP op, SQLTNMP np1, SQLTNML nl1, SQLTNMP np2, SQLTNML nl2); +SQLTAPI sqlxcn(SQLTNMP op, SQLTDAP ip, SQLTDAL il); +SQLTAPI sqlxda(SQLTNMP op, SQLTNMP dp, SQLTNML dl, SQLTDAY days); +SQLTAPI sqlxdp(SQLTDAP op, SQLTDAL ol, SQLTNMP ip, SQLTNML il, SQLTDAP pp, SQLTDAL pl); +SQLTAPI sqlxdv(SQLTNMP op, SQLTNMP np1, SQLTNML nl1, SQLTNMP np2, SQLTNML nl2); +SQLTAPI sqlxer(SQLTCUR cur, SQLTXER *errnum, SQLTDAP errbuf, SQLTDAL *buflen); +SQLTAPI sqlxml(SQLTNMP op, SQLTNMP np1, SQLTNML nl1, SQLTNMP np2, SQLTNML nl2); +SQLTAPI sqlxnp(SQLTDAP outp, SQLTDAL outl, SQLTNMP isnp, SQLTNML isnl, SQLTDAP picp, + SQLTDAL picl); +SQLTAPI sqlxpd(SQLTNMP op, SQLTNML *olp, SQLTDAP ip, SQLTDAP pp, SQLTDAL pl); +SQLTAPI sqlxsb(SQLTNMP op, SQLTNMP np1, SQLTNML nl1, SQLTNMP np2, SQLTNML nl2); +SQLTAPI sqlgai(SQLTCUR cur, SQLTDAP uname, SQLTDAL unamel, SQLTDAP tname, SQLTDAL tnamel, + SQLTROW *seed, SQLTROW *step, SQLTROW *next); +SQLTAPI sqlnvc(SQLTCUR cur, SQLTDAP ip, SQLTDAP op, SQLTDAL ol); +SQLTAPI sqlnvcW(SQLTCUR cur, wchar_t *ip, wchar_t *op, SQLTDAL ol); + +#if SQLBASE_DEFINE_WIDE_COLUMNS && SQLBASE_REDEFINE_TO_WIDE_FUNCTIONS +#define sqlbln(cur, bnn) sqlbln2(cur, bnn, SQLPLON) +#define sqlbnn(cur, bnn, dap, dal, sca, pdt) sqlbnn2(cur, bnn, dap, dal, sca, pdt) +#define sqlbnu sqlbnu2 +#define sqldes sqldes2 +#define sqldii sqldii2 +#define sqldsc sqldsc2 +#define sqlgfi sqlgfi2 +#define sqlgls sqlgls2 +#define sqllab sqllab2 +#define sqllsk sqllsk2 +#define sqlnbv sqlnbv2 +#define sqlnii sqlnii2 +#define sqlnsi sqlnsi2 +#define sqlrlo(cur, slc, bufp, bufl, readl) sqlrlo2(cur, slc, bufp, bufl, readl, SQLPLON) +#define sqlssb sqlssb2 +#endif + +#define SQLF000 0 /* not a function */ +#define SQLFINI 1 /* SQL INItialize applications use of the database */ +#define SQLFDON 2 /* SQL DONe using database */ +#define SQLFCON 3 /* SQL CONnect to a cursor/database */ +#define SQLFDIS 4 /* SQL DISconnect from a cursor/database */ +#define SQLFCOM 5 /* SQL COMpile a SQL command */ +#define SQLFEXE 6 /* SQL EXEcute an SQL command */ +#define SQLFCEX 7 /* SQL Compile and EXecute a SQL command */ +#define SQLFCMT 8 /* SQL CoMmiT a transaction to the database */ +#define SQLFDES 9 /* SQL DEScribe the items of a select statement */ +#define SQLFGFI 10 /* SQL Get Fetch Information */ +#define SQLFFBK 11 /* SQL FETch previous row from SELECT */ +#define SQLFFET 12 /* SQL FETch next row from SELECT */ +#define SQLFEFB 13 /* SQL Enable Fetch Backwards */ +#define SQLFPRS 14 /* SQL Position in Result Set */ +#define SQLFURS 15 /* SQL Undo Result Set */ +#define SQLFNBV 16 /* SQL get Number of Bind Variables */ +#define SQLFBND 17 /* SQL BiNd Data variables. This function is supercede */ +#define SQLFBNN 18 /* SQL BiNd Numerics */ +#define SQLFBLN 19 /* SQL Bind Long Number */ +#define SQLFBLD 20 /* SQL Bind Long Data variables */ +#define SQLFSRS 21 /* SQL Start Restriction Set processing */ +#define SQLFRRS 22 /* SQL Restart Restriction Set processing */ +#define SQLFCRS 23 /* SQL Close Restriction Set */ +#define SQLFDRS 24 /* SQL Drop Restriction Set */ +#define SQLFARF 25 /* SQL Apply Roll Forward journal */ +#define SQLFERF 26 /* SQL End RollForward recovery (no longer supported) */ +#define SQLFSRF 27 /* SQL Start Roll Forward journal */ +#define SQLFSTO 28 /* SQL STOre a compiled SQL command */ +#define SQLFRET 29 /* SQL RETrieve a compiled SQL command */ +#define SQLFDST 30 /* SQL Drop a STored command */ +#define SQLFCTY 31 /* SQL get Command TYpe */ +#define SQLFEPO 32 /* SQL get Error POsition */ +#define SQLFGNR 33 /* SQL Get Number of Rows */ +#define SQLFNSI 34 /* SQL get Number of Select Items */ +#define SQLFRBF 35 /* SQL get Roll Back Flag */ +#define SQLFRCD 36 /* SQL get Return CoDe */ +#define SQLFROW 37 /* SQL get number of ROWs */ +#define SQLFSCN 38 /* SQL Set Cursor Name */ +#define SQLFSIL 39 /* SQL Set Isolation Level */ +#define SQLFSLP 40 /* SQL Set Log Parameters */ +#define SQLFSSB 41 /* SQL Set Select Buffer */ +#define SQLFSSS 42 /* SQL Set SortSpace */ +#define SQLFRLO 43 /* SQL Read LOng */ +#define SQLFWLO 44 /* SQL Write LOng */ +#define SQLFLSK 45 /* SQL Long SeeK */ +#define SQLFGLS 46 /* SQL Get Long Size */ +#define SQLFELO 47 /* SQL End Long Operation */ +#define SQLFRBK 48 /* SQL RollBacK a transaction from the database */ +#define SQLFERR 49 /* SQL get ERRor message */ +#define SQLFCPY 50 /* SQL CoPY */ +#define SQLFIDB 51 /* SQL Initialize DataBase */ +#define SQLFSYS 52 /* SQL SYSTEM */ +#define SQLFSTA 53 /* SQL STAtistics */ +#define SQLFR02 54 /* SQL RESERVED */ +#define SQLFXAD 55 /* SQL eXtra ADd */ +#define SQLFXCN 56 /* SQL eXtra Character to NUmber */ +#define SQLFXDA 57 /* SQL eXtra Date Add */ +#define SQLFXDP 58 /* SQL eXtra convert SQLBASE Date to Picture */ +#define SQLFXDV 59 /* SQL eXtra DiVide */ +#define SQLFXML 60 /* SQL eXtra MuLtiply */ +#define SQLFXNP 61 /* SQL eXtra convert SQLBASE Numeric to Picture */ +#define SQLFXPD 62 /* SQL eXtra convert Picture to SQLBASE Date. */ +#define SQLFXSB 63 /* SQL eXtra SuBtract */ +#define SQLFINS 64 /* SQL INStall database (no longer supported) */ +#define SQLFDIN 65 /* SQL DeINstall database (no longer supported) */ +#define SQLFDIR 66 /* SQL DIRectory of databases */ +#define SQLFTIO 67 /* SQL TImeOut */ +#define SQLFFQN 68 /* SQL get Fully Qualified column Name */ +#define SQLFEXP 69 /* SQL EXexcution Plan */ +#define SQLFFER 70 /* SQL Full ERror message */ +#define SQLFBKP 71 /* SQL BacKuP */ +#define SQLFRDC 72 /* SQL Read Database Chunk */ +#define SQLFEBK 73 /* SQL End network online BacKup */ +#define SQLFRES 74 /* SQL REStore from backup */ +#define SQLFWDC 75 /* SQL Write Database Chunk */ +#define SQLFRRD 76 /* SQL Recover Restored Database */ +#define SQLFERS 77 /* SQL End network ReStore */ +#define SQLFNRR 78 /* SQL Number of Rows in Result set */ +#define SQLFSTR 79 /* SQL STart Restriction mode */ +#define SQLFSPR 80 /* SQL StoP Restriction mode */ +#define SQLFCNC 81 /* SQL CoNneCt: the sequel. */ +#define SQLFCNR 82 /* SQL Connect with No Recovery */ +#define SQLFOMS 83 /* SQL set Output Message Size */ +#define SQLFIMS 84 /* SQL set Input Message Size */ +#define SQLFSCP 85 /* SQL Set Cache Pages */ +#define SQLFDSC 86 /* SQL DeSCribe item of SELECT with external type */ +#define SQLFLAB 87 /* SQL get LABel information */ +#define SQLFCBV 88 /* SQL Clear Bind Variables */ +#define SQLFGET 89 /* SQL GET database parameter */ +#define SQLFSET 90 /* SQL SET database parameter */ +#define SQLFTEC 91 /* SQL Translate Error Code */ +#define SQLFBDB 92 /* SQL Backup DataBase */ +#define SQLFBEF 93 /* SQL Bulk Execute Flush */ +#define SQLFBER 94 /* SQL get Bulk Execute Returned code */ +#define SQLFBLF 95 /* SQL Backup Log Files */ +#define SQLFBLK 96 /* SQL set BuLK insert mode */ +#define SQLFBSS 97 /* SQL Backup SnapShot */ +#define SQLFCAN 98 /* SQL CaNceL command */ +#define SQLFCLF 99 /* SQL Change server activity LogFile */ +#define SQLFCRE 100 /* SQL CREate database */ +#define SQLFCRF 101 /* SQL Continue RollForward recovery */ +#define SQLFCSV 102 /* SQL Connect to SerVer */ +#define SQLFDBN 103 /* SQL Directory By Name */ +#define SQLFDED 104 /* SQL DeINstall database */ +#define SQLFDEL 105 /* SQL DELete database */ +#define SQLFDID 106 /* SQL DeInstall database and Delete database files */ +#define SQLFDRC 107 /* SQL DiRectory Close */ +#define SQLFDRO 108 /* SQL DiRectory Open */ +#define SQLFDRR 109 /* SQL DiRectory Read */ +#define SQLFDSV 110 /* SQL Disconnect from SerVer */ +#define SQLFENR 111 /* SQL ENd Rollforward recovery */ +#define SQLFFGT 112 /* SQL File GeT */ +#define SQLFFPT 113 /* SQL File Put */ +#define SQLFGNL 114 /* SQL Get Next Log for rollforward */ +#define SQLFGSI 115 /* SQL Get Server Information */ +#define SQLFIND 116 /* SQL INstall Database */ +#define SQLFMCL 117 /* SQL reMote CLose server file */ +#define SQLFMDL 118 /* SQL reMote DeLete file or directory on remote server */ +#define SQLFMOP 119 /* SQL reMote OPen file on server */ +#define SQLFMRD 120 /* SQL reMote ReaD from file on server */ +#define SQLFMSK 121 /* SQL reMote SeeK into file on server */ +#define SQLFMWR 122 /* SQL reMote WRite to file on server */ +#define SQLFRDB 123 /* SQL Restore DataBase */ +#define SQLFREL 124 /* SQL RELease log */ +#define SQLFRLF 125 /* SQL Restore Log Files */ +#define SQLFROF 126 /* SQL ROllForward recovery */ +#define SQLFRSS 127 /* SQL Restore SnapShot */ +#define SQLFSAB 128 /* SQL Server ABort process */ +#define SQLFSAP 129 /* SQL Server Abort Process */ +#define SQLFSDN 130 /* SQL ShutDowN database */ +#define SQLFSTM 131 /* SQL Server TerMinate */ +#define SQLFBBR 132 /* SQL get Bulk Execute Backend error # and message */ +#define SQLFBNA 133 /* SQL BiNd Data variables by name */ +#define SQLFBNU 134 /* SQL BiNd Numerical bind variable */ +#define SQLFGDI 135 /* SQL Get Descriptor info for a given Select column. */ +#define SQLFSXT 136 /* SQL Server eXiT (no longer supported) */ +#define SQLFXER 137 /* SQL get backend (Extended) error number and Message */ +#define SQLFETX 138 /* SQL get Error message TeXt */ +#define SQLFTEM 139 /* SQL get Tokenized Error Message */ +#define SQLFSCL 140 /* SQL Set CLient name */ +#define SQLFLDP 141 /* SQL LoaD oPeration */ +#define SQLFUNL 142 /* SQL UNLoad command */ +#define SQLFGBI 143 /* SQL Get Backend cursor Information */ +#define SQLFNII 144 /* SQL get Number of Into variable Information */ +#define SQLFDII 145 /* SQL Describe Into variable Information */ +#define SQLFSDS 146 /* SQL Shutdown/enable server */ +#define SQLFSDX 147 /* SQL Shutdown/enable Database Extended */ +#define SQLFCDR 148 /* SQL Cancel Database Request */ +#define SQLFDOX 149 /* SQL Directory Open Extended */ +#define SQLFRSI 150 /* SQL Reset Statistical Information */ +#define SQLFCCH 151 /* SQL Create Connection Handle */ +#define SQLFOPC 152 /* SQL OPen Cursor */ +#define SQLFDCH 153 /* SQL Destroy Connection Handle */ +#define SQLFENL 154 /* SQL MTS Enlist */ +#define SQLFGWO 155 /* SQL MTS Get Whereabouts Object */ +#define SQLFMLS 156 /* SQL reMote Long SeeK into file on server */ +#define SQLFIQX 157 /* SQL MTS Query a transaction's status */ +#define SQLFGAI 158 /* Get auto_increment values */ +#define SQLFNVC 159 // Name/Value Command + +#define SQLFMINAPI SQLFINI /* change these when API entry */ +#define SQLFMAXAPI SQLFGAI /* points change */ + +/* Following section is for SQL.INI free connections (sqliniCfg) */ +#define SQLCFGFADD 0 /* Add config setting */ +#define SQLCFGFDEL 1 /* Delete config setting, only works for database/server entries */ + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SQLBASE_H_ */ diff --git a/libraries/SQLAPI/include/ssNcliAPI.h b/libraries/SQLAPI/include/ssNcliAPI.h index 700e8a3aa..20f709ca2 100644 --- a/libraries/SQLAPI/include/ssNcliAPI.h +++ b/libraries/SQLAPI/include/ssNcliAPI.h @@ -1,66 +1,66 @@ -// SQL Server Native API -// -////////////////////////////////////////////////////////////////////// - -#if !defined(__SSNCLIAPI_H__) -#define __SSNCLIAPI_H__ - -#include "SQLAPI.h" - -// MSVC++ 6.0 doesn't have this -#ifdef SQLAPI_WINDOWS -#ifndef DBROWCOUNT -#ifdef _WIN64 -typedef LONGLONG DBROWCOUNT; -#else -typedef LONG DBROWCOUNT; -#endif -#endif -#ifndef DBCOUNTITEM -#ifdef _WIN64 -typedef ULONGLONG DBCOUNTITEM; -#else -typedef ULONG DBCOUNTITEM; -#endif -#endif -#ifndef DBORDINAL -#ifdef _WIN64 -typedef ULONGLONG DBORDINAL; -#else -typedef ULONG DBORDINAL; -#endif -#endif -#ifndef DB_UPARAMS -#ifdef _WIN64 -typedef ULONGLONG DB_UPARAMS; -#else -typedef ULONG DB_UPARAMS; -#endif -#endif -#ifndef SQLLEN -#ifdef _WIN64 -typedef INT64 SQLLEN; -#else -#define SQLLEN SQLINTEGER -#endif -#endif -#ifndef SQLULEN -#ifdef _WIN64 -typedef UINT64 SQLULEN; -#else -#define SQLULEN SQLUINTEGER -#endif -#endif -#ifndef SQLSETPOSIROW -#ifdef _WIN64 -typedef UINT64 SQLSETPOSIROW; -#else -#define SQLSETPOSIROW SQLUSMALLINT -#endif -#endif -#endif - -#define SQLNCLI_NO_BCP +// SQL Server Native API +// +////////////////////////////////////////////////////////////////////// + +#if !defined(__SSNCLIAPI_H__) +#define __SSNCLIAPI_H__ + +#include "SQLAPI.h" + +// MSVC++ 6.0 doesn't have this +#ifdef SQLAPI_WINDOWS +#ifndef DBROWCOUNT +#ifdef _WIN64 +typedef LONGLONG DBROWCOUNT; +#else +typedef LONG DBROWCOUNT; +#endif +#endif +#ifndef DBCOUNTITEM +#ifdef _WIN64 +typedef ULONGLONG DBCOUNTITEM; +#else +typedef ULONG DBCOUNTITEM; +#endif +#endif +#ifndef DBORDINAL +#ifdef _WIN64 +typedef ULONGLONG DBORDINAL; +#else +typedef ULONG DBORDINAL; +#endif +#endif +#ifndef DB_UPARAMS +#ifdef _WIN64 +typedef ULONGLONG DB_UPARAMS; +#else +typedef ULONG DB_UPARAMS; +#endif +#endif +#ifndef SQLLEN +#ifdef _WIN64 +typedef INT64 SQLLEN; +#else +#define SQLLEN SQLINTEGER +#endif +#endif +#ifndef SQLULEN +#ifdef _WIN64 +typedef UINT64 SQLULEN; +#else +#define SQLULEN SQLUINTEGER +#endif +#endif +#ifndef SQLSETPOSIROW +#ifdef _WIN64 +typedef UINT64 SQLSETPOSIROW; +#else +#define SQLSETPOSIROW SQLUSMALLINT +#endif +#endif +#endif + +#define SQLNCLI_NO_BCP #define _SQLNCLI_OLEDB_IGNORE_DEPRECATION_WARNING_ #define _SQLUSERINSTANCE_H_ #ifndef __deref_out @@ -68,494 +68,496 @@ typedef UINT64 SQLSETPOSIROW; #define __in_bcount #define __in_z #define __in -#endif - -// API header(s) -#include -#include -#ifdef SQLAPI_WINDOWS -#include -#else -#include -#endif - -extern void AddNCliSupport(const SAConnection *pCon); -extern void ReleaseNCliSupport(); - -typedef SQLRETURN (SQL_API *SQLAllocHandle_t)(SQLSMALLINT HandleType, - SQLHANDLE InputHandle, SQLHANDLE *OutputHandle); -typedef SQLRETURN (SQL_API *SQLBindCol_t)( - SQLHSTMT StatementHandle, - SQLUSMALLINT ColumnNumber, - SQLSMALLINT TargetType, - SQLPOINTER TargetValue, - SQLLEN BufferLength, - SQLLEN *StrLen_or_Ind); -typedef SQLRETURN (SQL_API *SQLBindParameter_t)( - SQLHSTMT hstmt, - SQLUSMALLINT ipar, - SQLSMALLINT fParamType, - SQLSMALLINT fCType, - SQLSMALLINT fSqlType, - SQLULEN cbColDef, - SQLSMALLINT ibScale, - SQLPOINTER rgbValue, - SQLLEN cbValueMax, - SQLLEN *pcbValue); -typedef SQLRETURN (SQL_API *SQLBulkOperations_t)( - SQLHSTMT StatementHandle, - SQLSMALLINT Operation); -typedef SQLRETURN (SQL_API *SQLBrowseConnectW_t)( - SQLHDBC hdbc, - SQLWCHAR *szConnStrIn, - SQLSMALLINT cbConnStrIn, - SQLWCHAR *szConnStrOut, - SQLSMALLINT cbConnStrOutMax, - SQLSMALLINT *pcbConnStrOut); -typedef SQLRETURN (SQL_API *SQLCancel_t)(SQLHSTMT StatementHandle); -typedef SQLRETURN (SQL_API *SQLCloseCursor_t)(SQLHSTMT StatementHandle); -#if defined(_WIN64) || defined(SA_64BIT) -typedef SQLRETURN (SQL_API *SQLColAttributeW_t)( - SQLHSTMT hstmt, - SQLUSMALLINT iCol, - SQLUSMALLINT iField, - SQLPOINTER pCharAttr, - SQLSMALLINT cbCharAttrMax, - SQLSMALLINT *pcbCharAttr, - SQLLEN *pNumAttr); -#else -typedef SQLRETURN (SQL_API *SQLColAttributeW_t)( - SQLHSTMT hstmt, - SQLUSMALLINT iCol, - SQLUSMALLINT iField, - SQLPOINTER pCharAttr, - SQLSMALLINT cbCharAttrMax, - SQLSMALLINT *pcbCharAttr, - SQLPOINTER pNumAttr); -#endif -typedef SQLRETURN (SQL_API *SQLColumnPrivilegesW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLWCHAR *szColumnName, - SQLSMALLINT cbColumnName); -typedef SQLRETURN (SQL_API *SQLColumnsW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLWCHAR *szColumnName, - SQLSMALLINT cbColumnName); -typedef SQLRETURN (SQL_API *SQLConnectW_t)( - SQLHDBC hdbc, - SQLWCHAR *szDSN, - SQLSMALLINT cbDSN, - SQLWCHAR *szUID, - SQLSMALLINT cbUID, - SQLWCHAR *szAuthStr, - SQLSMALLINT cbAuthStr); -typedef SQLRETURN (SQL_API *SQLCopyDesc_t)(SQLHDESC SourceDescHandle, - SQLHDESC TargetDescHandle); -typedef SQLRETURN (SQL_API *SQLDescribeColW_t)( - SQLHSTMT hstmt, - SQLUSMALLINT icol, - SQLWCHAR *szColName, - SQLSMALLINT cbColNameMax, - SQLSMALLINT *pcbColName, - SQLSMALLINT *pfSqlType, - SQLULEN *pcbColDef, - SQLSMALLINT *pibScale, - SQLSMALLINT *pfNullable); -typedef SQLRETURN (SQL_API *SQLDescribeParam_t)( - SQLHSTMT hstmt, - SQLUSMALLINT ipar, - SQLSMALLINT *pfSqlType, - SQLULEN *pcbParamDef, - SQLSMALLINT *pibScale, - SQLSMALLINT *pfNullable); -typedef SQLRETURN (SQL_API *SQLDisconnect_t)(SQLHDBC ConnectionHandle); -typedef SQLRETURN (SQL_API *SQLDriverConnectW_t)( - SQLHDBC hdbc, - SQLHWND hwnd, - SQLWCHAR *szConnStrIn, - SQLSMALLINT cbConnStrIn, - SQLWCHAR *szConnStrOut, - SQLSMALLINT cbConnStrOutMax, - SQLSMALLINT *pcbConnStrOut, - SQLUSMALLINT fDriverCompletion); -typedef SQLRETURN (SQL_API *SQLEndTran_t)(SQLSMALLINT HandleType, SQLHANDLE Handle, - SQLSMALLINT CompletionType); -typedef SQLRETURN (SQL_API *SQLExecDirectW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szSqlStr, - SQLINTEGER cbSqlStr); -typedef SQLRETURN (SQL_API *SQLExecute_t)(SQLHSTMT StatementHandle); -typedef SQLRETURN (SQL_API *SQLExtendedFetch_t)( - SQLHSTMT hstmt, - SQLUSMALLINT fFetchType, - SQLLEN irow, - SQLULEN *pcrow, - SQLUSMALLINT *rgfRowStatus); -typedef SQLRETURN (SQL_API *SQLFetch_t)(SQLHSTMT StatementHandle); -typedef SQLRETURN (SQL_API *SQLFetchScroll_t)( - SQLHSTMT StatementHandle, - SQLSMALLINT FetchOrientation, - SQLLEN FetchOffset); -typedef SQLRETURN (SQL_API *SQLFreeHandle_t)(SQLSMALLINT HandleType, SQLHANDLE Handle); -typedef SQLRETURN (SQL_API *SQLFreeStmt_t)(SQLHSTMT StatementHandle, - SQLUSMALLINT Option); -typedef SQLRETURN (SQL_API *SQLForeignKeysW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szPkCatalogName, - SQLSMALLINT cbPkCatalogName, - SQLWCHAR *szPkSchemaName, - SQLSMALLINT cbPkSchemaName, - SQLWCHAR *szPkTableName, - SQLSMALLINT cbPkTableName, - SQLWCHAR *szFkCatalogName, - SQLSMALLINT cbFkCatalogName, - SQLWCHAR *szFkSchemaName, - SQLSMALLINT cbFkSchemaName, - SQLWCHAR *szFkTableName, - SQLSMALLINT cbFkTableName); -typedef SQLRETURN (SQL_API *SQLGetConnectAttrW_t)( - SQLHDBC hdbc, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); -typedef SQLRETURN (SQL_API *SQLGetConnectOptionW_t)( - SQLHDBC hdbc, - SQLUSMALLINT fOption, - SQLPOINTER pvParam); -typedef SQLRETURN (SQL_API *SQLGetCursorNameW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCursor, - SQLSMALLINT cbCursorMax, - SQLSMALLINT *pcbCursor); -typedef SQLRETURN (SQL_API *SQLGetData_t)( - SQLHSTMT StatementHandle, - SQLUSMALLINT ColumnNumber, - SQLSMALLINT TargetType, - SQLPOINTER TargetValue, - SQLLEN BufferLength, - SQLLEN *StrLen_or_Ind); -typedef SQLRETURN (SQL_API *SQLGetDescFieldW_t)( - SQLHDESC hdesc, - SQLSMALLINT iRecord, - SQLSMALLINT iField, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); -typedef SQLRETURN (SQL_API *SQLGetDescRecW_t)( - SQLHDESC hdesc, - SQLSMALLINT iRecord, - SQLWCHAR *szName, - SQLSMALLINT cbNameMax, - SQLSMALLINT *pcbName, - SQLSMALLINT *pfType, - SQLSMALLINT *pfSubType, - SQLLEN *pLength, - SQLSMALLINT *pPrecision, - SQLSMALLINT *pScale, - SQLSMALLINT *pNullable); -typedef SQLRETURN (SQL_API *SQLGetDiagFieldW_t)( - SQLSMALLINT fHandleType, - SQLHANDLE handle, - SQLSMALLINT iRecord, - SQLSMALLINT fDiagField, - SQLPOINTER rgbDiagInfo, - SQLSMALLINT cbDiagInfoMax, - SQLSMALLINT *pcbDiagInfo); -typedef SQLRETURN (SQL_API *SQLGetDiagRecW_t)( - SQLSMALLINT fHandleType, - SQLHANDLE handle, - SQLSMALLINT iRecord, - SQLWCHAR *szSqlState, - SQLINTEGER *pfNativeError, - SQLWCHAR *szErrorMsg, - SQLSMALLINT cbErrorMsgMax, - SQLSMALLINT *pcbErrorMsg); -typedef SQLRETURN (SQL_API *SQLGetEnvAttr_t)( - SQLHENV EnvironmentHandle, - SQLINTEGER Attribute, - SQLPOINTER Value, - SQLINTEGER BufferLength, - SQLINTEGER *StringLength); -typedef SQLRETURN (SQL_API *SQLGetFunctions_t)( - SQLHDBC ConnectionHandle, - SQLUSMALLINT FunctionId, - SQLUSMALLINT *Supported); -typedef SQLRETURN (SQL_API *SQLGetInfoW_t)( - SQLHDBC hdbc, - SQLUSMALLINT fInfoType, - SQLPOINTER rgbInfoValue, - SQLSMALLINT cbInfoValueMax, - SQLSMALLINT *pcbInfoValue); -typedef SQLRETURN (SQL_API *SQLGetTypeInfoW_t)( - SQLHSTMT StatementHandle, - SQLSMALLINT DataType); -typedef SQLRETURN (SQL_API *SQLGetStmtAttrW_t)( - SQLHSTMT hstmt, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); -typedef SQLRETURN (SQL_API *SQLMoreResults_t)( - SQLHSTMT hstmt); -typedef SQLRETURN (SQL_API *SQLNativeSqlW_t)( - SQLHDBC hdbc, - SQLWCHAR *szSqlStrIn, - SQLINTEGER cbSqlStrIn, - SQLWCHAR *szSqlStr, - SQLINTEGER cbSqlStrMax, - SQLINTEGER *pcbSqlStr); -typedef SQLRETURN (SQL_API *SQLNumParams_t)( - SQLHSTMT hstmt, - SQLSMALLINT *pcpar); -typedef SQLRETURN (SQL_API *SQLNumResultCols_t)( - SQLHSTMT StatementHandle, - SQLSMALLINT *ColumnCount); -typedef SQLRETURN (SQL_API *SQLParamData_t)( - SQLHSTMT StatementHandle, - SQLPOINTER *Value); -typedef SQLRETURN (SQL_API *SQLParamOptions_t)( - SQLHSTMT hstmt, - SQLULEN crow, - SQLULEN *pirow); -typedef SQLRETURN (SQL_API *SQLPrepareW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szSqlStr, - SQLINTEGER cbSqlStr); -typedef SQLRETURN (SQL_API *SQLPrimaryKeysW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName); -typedef SQLRETURN (SQL_API *SQLProcedureColumnsW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szProcName, - SQLSMALLINT cbProcName, - SQLWCHAR *szColumnName, - SQLSMALLINT cbColumnName); -typedef SQLRETURN (SQL_API *SQLProceduresW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szProcName, - SQLSMALLINT cbProcName); -typedef SQLRETURN (SQL_API *SQLPutData_t)( - SQLHSTMT StatementHandle, - SQLPOINTER Data, - SQLLEN StrLen_or_Ind); -typedef SQLRETURN (SQL_API *SQLRowCount_t)( - SQLHSTMT StatementHandle, - SQLLEN *RowCount); -typedef SQLRETURN (SQL_API *SQLSetConnectAttrW_t)( - SQLHDBC hdbc, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValue); -typedef SQLRETURN (SQL_API *SQLSetConnectOptionW_t)( - SQLHDBC hdbc, - SQLUSMALLINT fOption, - SQLULEN vParam); -typedef SQLRETURN (SQL_API *SQLSetCursorNameW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCursor, - SQLSMALLINT cbCursor); -typedef SQLRETURN (SQL_API *SQLSetDescFieldW_t)( - SQLHDESC DescriptorHandle, - SQLSMALLINT RecNumber, - SQLSMALLINT FieldIdentifier, - SQLPOINTER Value, - SQLINTEGER BufferLength); -typedef SQLRETURN (SQL_API *SQLSetDescRec_t)( - SQLHDESC DescriptorHandle, - SQLSMALLINT RecNumber, - SQLSMALLINT Type, - SQLSMALLINT SubType, - SQLLEN Length, - SQLSMALLINT Precision, - SQLSMALLINT Scale, - SQLPOINTER Data, - SQLLEN *StringLength, - SQLLEN *Indicator); -typedef SQLRETURN (SQL_API *SQLSetEnvAttr_t)(SQLHENV EnvironmentHandle, - SQLINTEGER Attribute, SQLPOINTER Value, - SQLINTEGER StringLength); -typedef SQLRETURN (SQL_API *SQLSetPos_t)( - SQLHSTMT hstmt, - SQLSETPOSIROW irow, - SQLUSMALLINT fOption, - SQLUSMALLINT fLock); -typedef SQLRETURN (SQL_API *SQLSetScrollOptions_t)( - SQLHSTMT hstmt, - SQLUSMALLINT fConcurrency, - SQLLEN crowKeyset, - SQLUSMALLINT crowRowset); -typedef SQLRETURN (SQL_API *SQLSetStmtAttrW_t)( - SQLHSTMT hstmt, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax); -typedef SQLRETURN (SQL_API *SQLSpecialColumnsW_t)( - SQLHSTMT hstmt, - SQLUSMALLINT fColType, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLUSMALLINT fScope, - SQLUSMALLINT fNullable); -typedef SQLRETURN (SQL_API *SQLStatisticsW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLUSMALLINT fUnique, - SQLUSMALLINT fAccuracy); -typedef SQLRETURN (SQL_API *SQLTablePrivilegesW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName); -typedef SQLRETURN (SQL_API *SQLTablesW_t)( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLWCHAR *szTableType, - SQLSMALLINT cbTableType); - -#ifdef SQLAPI_WINDOWS -typedef HANDLE (_stdcall *OpenSqlFilestream_t) ( - LPCWSTR FilestreamPath, - SQL_FILESTREAM_DESIRED_ACCESS DesiredAccess, - ULONG OpenOptions, - LPBYTE FilestreamTransactionContext, - SSIZE_T FilestreamTransactionContextLength, - PLARGE_INTEGER AllocationSize); -#endif - -class SQLAPI_API ssNCliAPI : public saAPI -{ -public: - ssNCliAPI(); - - SQLAllocHandle_t SQLAllocHandle; // 3.0 - SQLBindCol_t SQLBindCol; // 1.0 - SQLBindParameter_t SQLBindParameter; // 2.0 - SQLBulkOperations_t SQLBulkOperations; // 3.0 - SQLBrowseConnectW_t SQLBrowseConnectW; // 3.0 - SQLCancel_t SQLCancel; // 1.0 - SQLCloseCursor_t SQLCloseCursor; // 3.0 - SQLColAttributeW_t SQLColAttributeW; - SQLColumnPrivilegesW_t SQLColumnPrivilegesW; - SQLColumnsW_t SQLColumnsW; - SQLConnectW_t SQLConnectW; - SQLCopyDesc_t SQLCopyDesc; // 3.0 - SQLDescribeColW_t SQLDescribeColW; // 1.0 - SQLDescribeParam_t SQLDescribeParam; // 1.0 - SQLDisconnect_t SQLDisconnect; // 1.0 - SQLDriverConnectW_t SQLDriverConnectW; // 1.0 - SQLEndTran_t SQLEndTran; // 3.0 - SQLExecDirectW_t SQLExecDirectW; - SQLExecute_t SQLExecute; // 1.0 - SQLExtendedFetch_t SQLExtendedFetch; // 1.0 - SQLFetch_t SQLFetch; // 1.0 - SQLFetchScroll_t SQLFetchScroll; // 1.0 - SQLForeignKeysW_t SQLForeignKeysW; - SQLFreeHandle_t SQLFreeHandle; // 3.0 - SQLFreeStmt_t SQLFreeStmt; // 1.0 - SQLGetConnectAttrW_t SQLGetConnectAttrW; // 3.0 - SQLGetConnectOptionW_t SQLGetConnectOptionW; - SQLGetCursorNameW_t SQLGetCursorNameW; - SQLGetData_t SQLGetData; // 1.0 - SQLGetDescFieldW_t SQLGetDescFieldW; - SQLGetDescRecW_t SQLGetDescRecW; - SQLGetDiagFieldW_t SQLGetDiagFieldW; - SQLGetDiagRecW_t SQLGetDiagRecW; // 3.0 - SQLGetEnvAttr_t SQLGetEnvAttr; // 3.0 - SQLGetFunctions_t SQLGetFunctions; // 1.0 - SQLGetInfoW_t SQLGetInfoW; // 1.0 - SQLGetStmtAttrW_t SQLGetStmtAttrW; // 3.0 - SQLGetTypeInfoW_t SQLGetTypeInfoW; - SQLMoreResults_t SQLMoreResults; // 1.0 - SQLNativeSqlW_t SQLNativeSqlW; - SQLNumParams_t SQLNumParams; // 1.0 - SQLNumResultCols_t SQLNumResultCols; // 1.0 - SQLParamData_t SQLParamData; // 1.0 - SQLParamOptions_t SQLParamOptions; // 1.0 - SQLPrepareW_t SQLPrepareW; // 1.0 - SQLPrimaryKeysW_t SQLPrimaryKeysW; - SQLProcedureColumnsW_t SQLProcedureColumnsW;// 1.0 - SQLProceduresW_t SQLProceduresW; // 1.0 - SQLPutData_t SQLPutData; // 1.0 - SQLRowCount_t SQLRowCount; // 1.0 - SQLSetConnectAttrW_t SQLSetConnectAttrW; // 3.0 - SQLSetConnectOptionW_t SQLSetConnectOptionW;// 1.0 - SQLSetCursorNameW_t SQLSetCursorNameW; // 1.0 - SQLSetDescFieldW_t SQLSetDescFieldW; // 3.0 - SQLSetDescRec_t SQLSetDescRec; // 3.0 - SQLSetEnvAttr_t SQLSetEnvAttr; // 3.0 - SQLSetPos_t SQLSetPos; // 1.0 - SQLSetScrollOptions_t SQLSetScrollOptions;// 1.0 - SQLSetStmtAttrW_t SQLSetStmtAttrW; // 3.0 - SQLSpecialColumnsW_t SQLSpecialColumnsW; // 1.0 - SQLStatisticsW_t SQLStatisticsW; // 1.0 - SQLTablePrivilegesW_t SQLTablePrivilegesW;// 1.0 - SQLTablesW_t SQLTablesW; // 1.0 - -#ifdef SQLAPI_WINDOWS - OpenSqlFilestream_t OpenSqlFilestream; -#endif -}; - -class SQLAPI_API ssNCliConnectionHandles : public saConnectionHandles -{ -public: - ssNCliConnectionHandles(); - - SQLHENV m_hevn; - SQLHDBC m_hdbc; -}; - -class SQLAPI_API ssNCliCommandHandles : public saCommandHandles -{ -public: - ssNCliCommandHandles(); - - SQLHSTMT m_hstmt; -}; - -extern ssNCliAPI g_ssNCliAPI; - -#endif // !defined(__SSNCLIAPI_H__) +#endif + +// API header(s) +#include +#include +#ifdef SQLAPI_WINDOWS +#include +#else +#include +#endif + +extern void AddNCliSupport(const SAConnection *pCon); +extern void ReleaseNCliSupport(); + +typedef SQLRETURN (SQL_API *SQLAllocHandle_t)(SQLSMALLINT HandleType, + SQLHANDLE InputHandle, SQLHANDLE *OutputHandle); +typedef SQLRETURN (SQL_API *SQLBindCol_t)( + SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, + SQLSMALLINT TargetType, + SQLPOINTER TargetValue, + SQLLEN BufferLength, + SQLLEN *StrLen_or_Ind); +typedef SQLRETURN (SQL_API *SQLBindParameter_t)( + SQLHSTMT hstmt, + SQLUSMALLINT ipar, + SQLSMALLINT fParamType, + SQLSMALLINT fCType, + SQLSMALLINT fSqlType, + SQLULEN cbColDef, + SQLSMALLINT ibScale, + SQLPOINTER rgbValue, + SQLLEN cbValueMax, + SQLLEN *pcbValue); +typedef SQLRETURN (SQL_API *SQLBulkOperations_t)( + SQLHSTMT StatementHandle, + SQLSMALLINT Operation); +typedef SQLRETURN (SQL_API *SQLBrowseConnectW_t)( + SQLHDBC hdbc, + SQLWCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLWCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut); +typedef SQLRETURN (SQL_API *SQLCancel_t)(SQLHSTMT StatementHandle); +typedef SQLRETURN (SQL_API *SQLCloseCursor_t)(SQLHSTMT StatementHandle); +#if defined(_WIN64) || defined(SA_64BIT) +typedef SQLRETURN (SQL_API *SQLColAttributeW_t)( + SQLHSTMT hstmt, + SQLUSMALLINT iCol, + SQLUSMALLINT iField, + SQLPOINTER pCharAttr, + SQLSMALLINT cbCharAttrMax, + SQLSMALLINT *pcbCharAttr, + SQLLEN *pNumAttr); +#else +typedef SQLRETURN (SQL_API *SQLColAttributeW_t)( + SQLHSTMT hstmt, + SQLUSMALLINT iCol, + SQLUSMALLINT iField, + SQLPOINTER pCharAttr, + SQLSMALLINT cbCharAttrMax, + SQLSMALLINT *pcbCharAttr, + SQLPOINTER pNumAttr); +#endif +typedef SQLRETURN (SQL_API *SQLColumnPrivilegesW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLWCHAR *szColumnName, + SQLSMALLINT cbColumnName); +typedef SQLRETURN (SQL_API *SQLColumnsW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLWCHAR *szColumnName, + SQLSMALLINT cbColumnName); +typedef SQLRETURN (SQL_API *SQLConnectW_t)( + SQLHDBC hdbc, + SQLWCHAR *szDSN, + SQLSMALLINT cbDSN, + SQLWCHAR *szUID, + SQLSMALLINT cbUID, + SQLWCHAR *szAuthStr, + SQLSMALLINT cbAuthStr); +typedef SQLRETURN (SQL_API *SQLCopyDesc_t)(SQLHDESC SourceDescHandle, + SQLHDESC TargetDescHandle); +typedef SQLRETURN (SQL_API *SQLDescribeColW_t)( + SQLHSTMT hstmt, + SQLUSMALLINT icol, + SQLWCHAR *szColName, + SQLSMALLINT cbColNameMax, + SQLSMALLINT *pcbColName, + SQLSMALLINT *pfSqlType, + SQLULEN *pcbColDef, + SQLSMALLINT *pibScale, + SQLSMALLINT *pfNullable); +typedef SQLRETURN (SQL_API *SQLDescribeParam_t)( + SQLHSTMT hstmt, + SQLUSMALLINT ipar, + SQLSMALLINT *pfSqlType, + SQLULEN *pcbParamDef, + SQLSMALLINT *pibScale, + SQLSMALLINT *pfNullable); +typedef SQLRETURN (SQL_API *SQLDisconnect_t)(SQLHDBC ConnectionHandle); +typedef SQLRETURN (SQL_API *SQLDriverConnectW_t)( + SQLHDBC hdbc, + SQLHWND hwnd, + SQLWCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLWCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut, + SQLUSMALLINT fDriverCompletion); +typedef SQLRETURN (SQL_API *SQLEndTran_t)(SQLSMALLINT HandleType, SQLHANDLE Handle, + SQLSMALLINT CompletionType); +typedef SQLRETURN (SQL_API *SQLExecDirectW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szSqlStr, + SQLINTEGER cbSqlStr); +typedef SQLRETURN (SQL_API *SQLExecute_t)(SQLHSTMT StatementHandle); +typedef SQLRETURN (SQL_API *SQLExtendedFetch_t)( + SQLHSTMT hstmt, + SQLUSMALLINT fFetchType, + SQLLEN irow, + SQLULEN *pcrow, + SQLUSMALLINT *rgfRowStatus); +typedef SQLRETURN (SQL_API *SQLFetch_t)(SQLHSTMT StatementHandle); +typedef SQLRETURN (SQL_API *SQLFetchScroll_t)( + SQLHSTMT StatementHandle, + SQLSMALLINT FetchOrientation, + SQLLEN FetchOffset); +typedef SQLRETURN (SQL_API *SQLFreeHandle_t)(SQLSMALLINT HandleType, SQLHANDLE Handle); +typedef SQLRETURN (SQL_API *SQLFreeStmt_t)(SQLHSTMT StatementHandle, + SQLUSMALLINT Option); +typedef SQLRETURN (SQL_API *SQLForeignKeysW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szPkCatalogName, + SQLSMALLINT cbPkCatalogName, + SQLWCHAR *szPkSchemaName, + SQLSMALLINT cbPkSchemaName, + SQLWCHAR *szPkTableName, + SQLSMALLINT cbPkTableName, + SQLWCHAR *szFkCatalogName, + SQLSMALLINT cbFkCatalogName, + SQLWCHAR *szFkSchemaName, + SQLSMALLINT cbFkSchemaName, + SQLWCHAR *szFkTableName, + SQLSMALLINT cbFkTableName); +typedef SQLRETURN (SQL_API *SQLGetConnectAttrW_t)( + SQLHDBC hdbc, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); +typedef SQLRETURN (SQL_API *SQLGetConnectOptionW_t)( + SQLHDBC hdbc, + SQLUSMALLINT fOption, + SQLPOINTER pvParam); +typedef SQLRETURN (SQL_API *SQLGetCursorNameW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCursor, + SQLSMALLINT cbCursorMax, + SQLSMALLINT *pcbCursor); +typedef SQLRETURN (SQL_API *SQLGetData_t)( + SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, + SQLSMALLINT TargetType, + SQLPOINTER TargetValue, + SQLLEN BufferLength, + SQLLEN *StrLen_or_Ind); +typedef SQLRETURN (SQL_API *SQLGetDescFieldW_t)( + SQLHDESC hdesc, + SQLSMALLINT iRecord, + SQLSMALLINT iField, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); +typedef SQLRETURN (SQL_API *SQLGetDescRecW_t)( + SQLHDESC hdesc, + SQLSMALLINT iRecord, + SQLWCHAR *szName, + SQLSMALLINT cbNameMax, + SQLSMALLINT *pcbName, + SQLSMALLINT *pfType, + SQLSMALLINT *pfSubType, + SQLLEN *pLength, + SQLSMALLINT *pPrecision, + SQLSMALLINT *pScale, + SQLSMALLINT *pNullable); +typedef SQLRETURN (SQL_API *SQLGetDiagFieldW_t)( + SQLSMALLINT fHandleType, + SQLHANDLE handle, + SQLSMALLINT iRecord, + SQLSMALLINT fDiagField, + SQLPOINTER rgbDiagInfo, + SQLSMALLINT cbDiagInfoMax, + SQLSMALLINT *pcbDiagInfo); +typedef SQLRETURN (SQL_API *SQLGetDiagRecW_t)( + SQLSMALLINT fHandleType, + SQLHANDLE handle, + SQLSMALLINT iRecord, + SQLWCHAR *szSqlState, + SQLINTEGER *pfNativeError, + SQLWCHAR *szErrorMsg, + SQLSMALLINT cbErrorMsgMax, + SQLSMALLINT *pcbErrorMsg); +typedef SQLRETURN (SQL_API *SQLGetEnvAttr_t)( + SQLHENV EnvironmentHandle, + SQLINTEGER Attribute, + SQLPOINTER Value, + SQLINTEGER BufferLength, + SQLINTEGER *StringLength); +typedef SQLRETURN (SQL_API *SQLGetFunctions_t)( + SQLHDBC ConnectionHandle, + SQLUSMALLINT FunctionId, + SQLUSMALLINT *Supported); +typedef SQLRETURN (SQL_API *SQLGetInfoW_t)( + SQLHDBC hdbc, + SQLUSMALLINT fInfoType, + SQLPOINTER rgbInfoValue, + SQLSMALLINT cbInfoValueMax, + SQLSMALLINT *pcbInfoValue); +typedef SQLRETURN (SQL_API *SQLGetTypeInfoW_t)( + SQLHSTMT StatementHandle, + SQLSMALLINT DataType); +typedef SQLRETURN (SQL_API *SQLGetStmtAttrW_t)( + SQLHSTMT hstmt, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); +typedef SQLRETURN (SQL_API *SQLMoreResults_t)( + SQLHSTMT hstmt); +typedef SQLRETURN (SQL_API *SQLNativeSqlW_t)( + SQLHDBC hdbc, + SQLWCHAR *szSqlStrIn, + SQLINTEGER cbSqlStrIn, + SQLWCHAR *szSqlStr, + SQLINTEGER cbSqlStrMax, + SQLINTEGER *pcbSqlStr); +typedef SQLRETURN (SQL_API *SQLNumParams_t)( + SQLHSTMT hstmt, + SQLSMALLINT *pcpar); +typedef SQLRETURN (SQL_API *SQLNumResultCols_t)( + SQLHSTMT StatementHandle, + SQLSMALLINT *ColumnCount); +typedef SQLRETURN (SQL_API *SQLParamData_t)( + SQLHSTMT StatementHandle, + SQLPOINTER *Value); +typedef SQLRETURN (SQL_API *SQLParamOptions_t)( + SQLHSTMT hstmt, + SQLULEN crow, + SQLULEN *pirow); +typedef SQLRETURN (SQL_API *SQLPrepareW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szSqlStr, + SQLINTEGER cbSqlStr); +typedef SQLRETURN (SQL_API *SQLPrimaryKeysW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName); +typedef SQLRETURN (SQL_API *SQLProcedureColumnsW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szProcName, + SQLSMALLINT cbProcName, + SQLWCHAR *szColumnName, + SQLSMALLINT cbColumnName); +typedef SQLRETURN (SQL_API *SQLProceduresW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szProcName, + SQLSMALLINT cbProcName); +typedef SQLRETURN (SQL_API *SQLPutData_t)( + SQLHSTMT StatementHandle, + SQLPOINTER Data, + SQLLEN StrLen_or_Ind); +typedef SQLRETURN (SQL_API *SQLRowCount_t)( + SQLHSTMT StatementHandle, + SQLLEN *RowCount); +typedef SQLRETURN (SQL_API *SQLSetConnectAttrW_t)( + SQLHDBC hdbc, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValue); +typedef SQLRETURN (SQL_API *SQLSetConnectOptionW_t)( + SQLHDBC hdbc, + SQLUSMALLINT fOption, + SQLULEN vParam); +typedef SQLRETURN (SQL_API *SQLSetCursorNameW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCursor, + SQLSMALLINT cbCursor); +typedef SQLRETURN (SQL_API *SQLSetDescFieldW_t)( + SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, + SQLSMALLINT FieldIdentifier, + SQLPOINTER Value, + SQLINTEGER BufferLength); +typedef SQLRETURN (SQL_API *SQLSetDescRec_t)( + SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, + SQLSMALLINT Type, + SQLSMALLINT SubType, + SQLLEN Length, + SQLSMALLINT Precision, + SQLSMALLINT Scale, + SQLPOINTER Data, + SQLLEN *StringLength, + SQLLEN *Indicator); +typedef SQLRETURN (SQL_API *SQLSetEnvAttr_t)(SQLHENV EnvironmentHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER StringLength); +typedef SQLRETURN (SQL_API *SQLSetPos_t)( + SQLHSTMT hstmt, + SQLSETPOSIROW irow, + SQLUSMALLINT fOption, + SQLUSMALLINT fLock); +typedef SQLRETURN (SQL_API *SQLSetScrollOptions_t)( + SQLHSTMT hstmt, + SQLUSMALLINT fConcurrency, + SQLLEN crowKeyset, + SQLUSMALLINT crowRowset); +typedef SQLRETURN (SQL_API *SQLSetStmtAttrW_t)( + SQLHSTMT hstmt, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax); +typedef SQLRETURN (SQL_API *SQLSpecialColumnsW_t)( + SQLHSTMT hstmt, + SQLUSMALLINT fColType, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLUSMALLINT fScope, + SQLUSMALLINT fNullable); +typedef SQLRETURN (SQL_API *SQLStatisticsW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLUSMALLINT fUnique, + SQLUSMALLINT fAccuracy); +typedef SQLRETURN (SQL_API *SQLTablePrivilegesW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName); +typedef SQLRETURN (SQL_API *SQLTablesW_t)( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLWCHAR *szTableType, + SQLSMALLINT cbTableType); + +#ifdef SQLAPI_WINDOWS +typedef HANDLE (_stdcall *OpenSqlFilestream_t) ( + LPCWSTR FilestreamPath, + SQL_FILESTREAM_DESIRED_ACCESS DesiredAccess, + ULONG OpenOptions, + LPBYTE FilestreamTransactionContext, + SSIZE_T FilestreamTransactionContextLength, + PLARGE_INTEGER AllocationSize); +#endif + +class SQLAPI_API ssNCliAPI : public saAPI +{ +public: + ssNCliAPI(); + + bool osDriver; + + SQLAllocHandle_t SQLAllocHandle; // 3.0 + SQLBindCol_t SQLBindCol; // 1.0 + SQLBindParameter_t SQLBindParameter; // 2.0 + SQLBulkOperations_t SQLBulkOperations; // 3.0 + SQLBrowseConnectW_t SQLBrowseConnectW; // 3.0 + SQLCancel_t SQLCancel; // 1.0 + SQLCloseCursor_t SQLCloseCursor; // 3.0 + SQLColAttributeW_t SQLColAttributeW; + SQLColumnPrivilegesW_t SQLColumnPrivilegesW; + SQLColumnsW_t SQLColumnsW; + SQLConnectW_t SQLConnectW; + SQLCopyDesc_t SQLCopyDesc; // 3.0 + SQLDescribeColW_t SQLDescribeColW; // 1.0 + SQLDescribeParam_t SQLDescribeParam; // 1.0 + SQLDisconnect_t SQLDisconnect; // 1.0 + SQLDriverConnectW_t SQLDriverConnectW; // 1.0 + SQLEndTran_t SQLEndTran; // 3.0 + SQLExecDirectW_t SQLExecDirectW; + SQLExecute_t SQLExecute; // 1.0 + SQLExtendedFetch_t SQLExtendedFetch; // 1.0 + SQLFetch_t SQLFetch; // 1.0 + SQLFetchScroll_t SQLFetchScroll; // 1.0 + SQLForeignKeysW_t SQLForeignKeysW; + SQLFreeHandle_t SQLFreeHandle; // 3.0 + SQLFreeStmt_t SQLFreeStmt; // 1.0 + SQLGetConnectAttrW_t SQLGetConnectAttrW; // 3.0 + SQLGetConnectOptionW_t SQLGetConnectOptionW; + SQLGetCursorNameW_t SQLGetCursorNameW; + SQLGetData_t SQLGetData; // 1.0 + SQLGetDescFieldW_t SQLGetDescFieldW; + SQLGetDescRecW_t SQLGetDescRecW; + SQLGetDiagFieldW_t SQLGetDiagFieldW; + SQLGetDiagRecW_t SQLGetDiagRecW; // 3.0 + SQLGetEnvAttr_t SQLGetEnvAttr; // 3.0 + SQLGetFunctions_t SQLGetFunctions; // 1.0 + SQLGetInfoW_t SQLGetInfoW; // 1.0 + SQLGetStmtAttrW_t SQLGetStmtAttrW; // 3.0 + SQLGetTypeInfoW_t SQLGetTypeInfoW; + SQLMoreResults_t SQLMoreResults; // 1.0 + SQLNativeSqlW_t SQLNativeSqlW; + SQLNumParams_t SQLNumParams; // 1.0 + SQLNumResultCols_t SQLNumResultCols; // 1.0 + SQLParamData_t SQLParamData; // 1.0 + SQLParamOptions_t SQLParamOptions; // 1.0 + SQLPrepareW_t SQLPrepareW; // 1.0 + SQLPrimaryKeysW_t SQLPrimaryKeysW; + SQLProcedureColumnsW_t SQLProcedureColumnsW;// 1.0 + SQLProceduresW_t SQLProceduresW; // 1.0 + SQLPutData_t SQLPutData; // 1.0 + SQLRowCount_t SQLRowCount; // 1.0 + SQLSetConnectAttrW_t SQLSetConnectAttrW; // 3.0 + SQLSetConnectOptionW_t SQLSetConnectOptionW;// 1.0 + SQLSetCursorNameW_t SQLSetCursorNameW; // 1.0 + SQLSetDescFieldW_t SQLSetDescFieldW; // 3.0 + SQLSetDescRec_t SQLSetDescRec; // 3.0 + SQLSetEnvAttr_t SQLSetEnvAttr; // 3.0 + SQLSetPos_t SQLSetPos; // 1.0 + SQLSetScrollOptions_t SQLSetScrollOptions;// 1.0 + SQLSetStmtAttrW_t SQLSetStmtAttrW; // 3.0 + SQLSpecialColumnsW_t SQLSpecialColumnsW; // 1.0 + SQLStatisticsW_t SQLStatisticsW; // 1.0 + SQLTablePrivilegesW_t SQLTablePrivilegesW;// 1.0 + SQLTablesW_t SQLTablesW; // 1.0 + +#ifdef SQLAPI_WINDOWS + OpenSqlFilestream_t OpenSqlFilestream; +#endif +}; + +class SQLAPI_API ssNCliConnectionHandles : public saConnectionHandles +{ +public: + ssNCliConnectionHandles(); + + SQLHENV m_hevn; + SQLHDBC m_hdbc; +}; + +class SQLAPI_API ssNCliCommandHandles : public saCommandHandles +{ +public: + ssNCliCommandHandles(); + + SQLHSTMT m_hstmt; +}; + +extern ssNCliAPI g_ssNCliAPI; + +#endif // !defined(__SSNCLIAPI_H__) diff --git a/libraries/SQLAPI/include/ssOleDbAPI.h b/libraries/SQLAPI/include/ssOleDbAPI.h index a925e00a5..52f82f8e7 100644 --- a/libraries/SQLAPI/include/ssOleDbAPI.h +++ b/libraries/SQLAPI/include/ssOleDbAPI.h @@ -18,6 +18,8 @@ class ssOleDbAPI : public saAPI { public: ssOleDbAPI(); + + static bool& ssOleDbAPI::ProcessSQLServerErrorInfo(); }; class SQLAPI_API ssOleDbConnectionHandles : public saConnectionHandles diff --git a/libraries/SQLAPI/include/sybAPI.h b/libraries/SQLAPI/include/sybAPI.h index a6863ce3f..aee356093 100644 --- a/libraries/SQLAPI/include/sybAPI.h +++ b/libraries/SQLAPI/include/sybAPI.h @@ -17,6 +17,7 @@ class SQLAPI_API SASybErrInfo : public SAMutex { public: SASybErrInfo(); + virtual ~SASybErrInfo(); public: CS_MSGNUM msgnumber; diff --git a/src/ba/ba3700.cpp b/src/ba/ba3700.cpp index b7e5aca5e..96f04f49f 100755 --- a/src/ba/ba3700.cpp +++ b/src/ba/ba3700.cpp @@ -52,7 +52,8 @@ protected: static bool mese_commerciale (TMask_field& f, KEY k); static bool fixed_scad (TMask_field& f, KEY k); static bool tipo_rata (TMask_field& f, KEY k); - static bool ult_class (TMask_field& f, KEY k); + static bool ult_class (TMask_field& f, KEY k); + static bool cond_pagamento (TMask_field& f, KEY k); void* _app_data; @@ -93,7 +94,8 @@ bool TCond_pag_app::user_create() _msk->set_handler (F_FIXSCAD_2 , fixed_scad); _msk->set_handler (F_FIXSCAD_3 , fixed_scad); _msk->set_handler (F_TIPO_RATA , tipo_rata); - _msk->set_handler (F_ULT_CLASS , ult_class); + _msk->set_handler (F_ULT_CLASS , ult_class); + _msk->set_handler(F_CONDPAGSDI , cond_pagamento); shuttle._msk = _msk; shuttle._sht = _cs; @@ -264,7 +266,10 @@ bool TCond_pag_app::numero_rate(TMask_field& f, KEY k) } msk->set(F_NUM_RATE,pag->n_rate()); - return TRUE; + + // Finito tutto chiamo il controllo sul tipo pagamento! + + return cond_pagamento(f.mask().field(F_CONDPAGSDI), K_TAB); } bool TCond_pag_app::mese_commerciale(TMask_field& f, KEY k) @@ -375,6 +380,44 @@ bool TCond_pag_app::ult_class(TMask_field& f, KEY k) return TRUE; } +bool TCond_pag_app::cond_pagamento(TMask_field& f, KEY k) +{ + if (!f.to_check(k) || f.mask().query_mode() || !f.mask().get(F_NUM_RATE).full()) + return true; + // Controllo se il tipo è coerente con quello segnato prima + int nrate = f.mask().get_int(F_NUM_RATE); + bool err = false; + switch (atoi(f.get().right(1))) + { + // Pagamento a rate + case 1: + if (nrate <= 1) + { + err = true; + f.set("TP02"); + } + break; + // Pagamento completo + case 2: + if (nrate > 1) + { + err = true; + f.set("TP01"); + } + break; + // Pagamento anticipo + case 3: + // Non so che fare! + break; + } + + if(err) + { + warning_box("Impossibile impostare questo tipo di pagamento con %d rate!", nrate); + } + return true; +} + // qui viene il belloccio bool TCond_pag_app::sheet_action(TSheet_field&, int r, KEY k) { diff --git a/src/ba/ba3700.h b/src/ba/ba3700.h index 12ca2c31d..3be6a393a 100755 --- a/src/ba/ba3700.h +++ b/src/ba/ba3700.h @@ -3,20 +3,21 @@ #define TAB_CPG "%CPG" #define TAB_RPG "%RPG" -#define F_CODICE 201 -#define F_DESC 202 -#define F_SHEET_RPG 203 -#define F_INIZIOSCAD 204 -#define F_MESECOMM 205 -#define F_TIPO_PRIMA_RATA 206 -#define F_RATE_DIFF 208 -#define F_INT_RATE 209 -#define F_NUM_RATE 210 -#define F_TIPO_RATA 211 -#define F_EQUAL_FROM 212 -#define F_START_RATA 213 -#define F_ULT_CLASS 214 -#define F_FIXSCAD_1 215 -#define F_FIXSCAD_2 216 -#define F_FIXSCAD_3 217 +#define F_CODICE 201 +#define F_CONDPAGSDI 202 +#define F_DESC 203 +#define F_SHEET_RPG 204 +#define F_INIZIOSCAD 205 +#define F_MESECOMM 206 +#define F_TIPO_PRIMA_RATA 207 +#define F_RATE_DIFF 208 +#define F_INT_RATE 209 +#define F_NUM_RATE 210 +#define F_TIPO_RATA 211 +#define F_EQUAL_FROM 212 +#define F_START_RATA 213 +#define F_ULT_CLASS 214 +#define F_FIXSCAD_1 215 +#define F_FIXSCAD_2 216 +#define F_FIXSCAD_3 217 diff --git a/src/ba/ba3700a.uml b/src/ba/ba3700a.uml index 5339b2056..f9a33e49f 100755 --- a/src/ba/ba3700a.uml +++ b/src/ba/ba3700a.uml @@ -36,6 +36,15 @@ BEGIN KEY 1 END +LIST F_CONDPAGSDI 4 20 +BEGIN + PROMPT 20 1 "Tipo di pagamento " + FIELD S12 + ITEM "TP01|TP01 A rate" + ITEM "TP02|TP02 Completo" + ITEM "TP03|TP03 Anticipo" +END + STRING F_DESC 50 BEGIN PROMPT 2 2 "Descrizione " diff --git a/src/ba/batbclr.h b/src/ba/batbclr.h index 782ee131f..fa8520101 100755 --- a/src/ba/batbclr.h +++ b/src/ba/batbclr.h @@ -1,3 +1,4 @@ -#define F_CODICERATA 101 -#define F_CODICEALFA 102 -#define F_DESCR 103 +#define F_CODICERATA 101 +#define F_CODICEALFA 102 +#define F_MODPAG 103 +#define F_DESCR 104 diff --git a/src/ba/batbclr.uml b/src/ba/batbclr.uml index 4f075d710..bc150adf0 100755 --- a/src/ba/batbclr.uml +++ b/src/ba/batbclr.uml @@ -50,6 +50,38 @@ BEGIN CHECKTYPE REQUIRED END +STRING F_MODPAG 4 +BEGIN + PROMPT 20 4 "Tipo pagamento " + SHEET "Codice|Tipo pagamento@32" + INPUT S_MODPAG + OUTPUT S_MODPAG + CHECKTYPE REQUIRED + FIELD S12 + ITEM "MP01|contanti" + ITEM "MP02|assegno" + ITEM "MP03|assegno circolare" + ITEM "MP04|contanti presso Tesoreria" + ITEM "MP05|bonifico" + ITEM "MP06|vaglia cambiario" + ITEM "MP07|bollettino bancario" + ITEM "MP08|carta di pagamento" + ITEM "MP09|RID" + ITEM "MP10|RID utenze" + ITEM "MP11|RID veloce" + ITEM "MP12|RIBA" + ITEM "MP13|MAV" + ITEM "MP14|quietanza erario" + ITEM "MP15|giroconto su conti di contabilità speciale" + ITEM "MP16|domiciliazione bancaria" + ITEM "MP17|domiciliazione postale" + ITEM "MP18|bollettino di c/c postale" + ITEM "MP19|SEPA Direct Debit" + ITEM "MP20|SEPA Direct Debit CORE" + ITEM "MP21|SEPA Direct Debit B2B" + ITEM "MP22|Trattenuta su somme già riscosse" +END + STRING F_DESCR 50 BEGIN PROMPT 2 6 "Descrizione " diff --git a/src/cg/cg0200.cpp b/src/cg/cg0200.cpp index 443889809..d77b825c3 100755 --- a/src/cg/cg0200.cpp +++ b/src/cg/cg0200.cpp @@ -85,6 +85,8 @@ protected: static bool rfso_handler(TMask_field& f, KEY k); // Handler Stato static bool stato_handler(TMask_field& f, KEY k); + // Handler codice destinatario per Fatturazione PA/FP + static bool coddest_handler(TMask_field& f, KEY k); public: virtual bool get_next_key(TToken_string& key); @@ -575,6 +577,18 @@ bool TClifo_application::stato_handler(TMask_field& f, KEY k) return true; } +bool TClifo_application::coddest_handler(TMask_field& f, KEY k) +{ + // Controllo che il codice immesso sia di 6/7 cifre in base al clifo + if(f.focusdirty() && !f.empty() && + ((f.mask().get_int(F_ALLEG) == 7 && f.get().size() != 6) || // P.A. + (f.mask().get_int(F_ALLEG) != 7 && f.get().size() != 7))) // Privato + { + warning_box("Lunghezza codice destinatario incoerente"); + } + return true; +} + HIDDEN bool alleg_handler(TMask_field& f, KEY key) { if (f.to_check(key, true)) @@ -1561,6 +1575,7 @@ bool TClifo_application::user_create() // initvar e arrmask _msk->set_handler(DLG_CONTRLAV, contrlav_handler); _msk->set_handler(LST_TIPO_RFSO, rfso_handler); _msk->set_handler(F_STATOCF, stato_handler); + _msk->set_handler(F_PADESTIN, coddest_handler); TSheet_field& ind = _msk->sfield(F_SHEET_G_VEN); ind.set_notify(indsp_notify); diff --git a/src/cg/cg0200.h b/src/cg/cg0200.h index 5a13fa08f..27305d689 100755 --- a/src/cg/cg0200.h +++ b/src/cg/cg0200.h @@ -176,6 +176,7 @@ #define DLG_OGGETTI 304 #define F_BYMAIL 306 #define F_DOCMAIL 307 +#define F_PEC 324 #define DLG_ANAG 308 #define DLG_CONTRLAV 309 #define F_BANA 310 diff --git a/src/cg/cg0200a.uml b/src/cg/cg0200a.uml index bcc454454..18fe9f65d 100755 --- a/src/cg/cg0200a.uml +++ b/src/cg/cg0200a.uml @@ -519,7 +519,7 @@ END GROUPBOX DLG_NULL 76 10 BEGIN - PROMPT 1 4 "Numeri telefonici" + PROMPT 1 4 "Contatti" END STRING F_PTEL 5 @@ -590,33 +590,39 @@ BEGIN HELP "Numero telefonico del fax" END -STRING F_MAIL 50 48 -BEGIN - PROMPT 2 8 "E-mail " - FIELD MAIL -END - -BUTTON DLG_EMAIL 10 2 -BEGIN - PROMPT 62 8 "~Posta" - PICTURE BMP_EMAIL -END - BOOLEAN F_BYMAIL BEGIN - PROMPT 2 9 "Consenso spedizione documenti per posta elettronica" + PROMPT 40 7 "Consenso spedizione doc tramite email" FIELD BYMAIL MESSAGE FALSE CLEAR,F_DOCMAIL MESSAGE TRUE ENABLE,F_DOCMAIL END -STRING F_DOCMAIL 50 +STRING F_MAIL 50 23 BEGIN - PROMPT 2 10 "Indirizzo doc." + PROMPT 2 8 "E-Mail " + FIELD MAIL +END + +STRING F_DOCMAIL 50 20 +BEGIN + PROMPT 40 8 "E-Mail doc" FIELD DOCMAIL CHECKTYPE REQUIRED END +STRING F_PEC 50 23 +BEGIN + PROMPT 2 9 "Pec " + FIELD PEC +END + +BUTTON DLG_EMAIL 10 2 +BEGIN + PROMPT 62 9 "~Posta" + PICTURE BMP_EMAIL +END + BOOLEAN F_SPEDPRI BEGIN PROMPT 2 11 "Informativa Privacy spedita" diff --git a/src/cg/cgpagame.cpp b/src/cg/cgpagame.cpp index dc8fa435f..4c8686305 100755 --- a/src/cg/cgpagame.cpp +++ b/src/cg/cgpagame.cpp @@ -1495,6 +1495,7 @@ bool TPagamento::read(TTable* t, TTable* r) _fixd[1] = t->get_int("I1"); _fixd[2] = t->get_int("I2"); _int_rate = t->get_int("I3"); + _cond_pag = t->get("S12"); // aggiusta _inizio secondo INSCAD; vedi mese commerciale etc. if (_inscad == 'M') diff --git a/src/cg/cgpagame.h b/src/cg/cgpagame.h index c1a8407ed..1576162eb 100755 --- a/src/cg/cgpagame.h +++ b/src/cg/cgpagame.h @@ -65,7 +65,8 @@ class TPagamento : public TObject int _fixd[3]; // giorni scadenza fissa, se desiderati int _roundlit; // decimali arrotondamento importo in lire (sempre 0 per ora) int _roundval; // decimali arrotondamento importo in valuta - int _int_rate; + int _int_rate; + TString _cond_pag; // Condizione di pagamento per SDI, valori ammessi: TP01/02/03 int _rata_ifield(int n, int f) const; long _rata_lfield(int n, int f) const; @@ -148,6 +149,7 @@ public: const TString& code() const { return _code; } const char* desc_tpr() const; const char* desc_tipo(int tipo, char ulc, bool* ok = NULL) const; + const TString& cond_pag_sdi() const { return _cond_pag; } // giorni scadenza fissi, aggiunti poi void set_fixed_scad(int a, int ind) { _fixd[ind] = a; } diff --git a/src/cg/f17.dir b/src/cg/f17.dir index 4fe4f4254..2c435bf72 100755 --- a/src/cg/f17.dir +++ b/src/cg/f17.dir @@ -1,3 +1,3 @@ 17 0 -$cfven|4604|4604|510|0|Clienti/Fornitori per vendite||| +$cfven|4612|4613|511|0|Clienti/Fornitori per vendite||| diff --git a/src/cg/f17.trr b/src/cg/f17.trr index 7df564c69..1ae9d2987 100755 --- a/src/cg/f17.trr +++ b/src/cg/f17.trr @@ -79,7 +79,7 @@ CODCAUSNC|1|3|0|Causale Contabile per le Note di Credito CODCAUSINC|1|3|0|Causale Contabile per gli Incassi RIFDOC|8|1|0|Riferimenti sui documenti IMPMINFAT|4|18|3|Importo minimo Fatture -PADESTIN|1|6|0|Codice ufficio amministrazione +PADESTIN|1|7|0|Codice ufficio amministrazione PARIFAMM|1|20|0|Codice riferimento amministrativo PRODCONAI|1|6|0|Produttore CONAI[6]: acc,all,car,pla,leg,vet 1 diff --git a/src/cg/f20.dir b/src/cg/f20.dir index 0cf9807df..a6f8bd30d 100755 --- a/src/cg/f20.dir +++ b/src/cg/f20.dir @@ -1,3 +1,3 @@ 20 0 -$clifo|0|0|825|0|Clienti/Fornitori||| +$clifo|774|774|875|0|Clienti/Fornitori||| diff --git a/src/cg/f20.trr b/src/cg/f20.trr index ab0ec9931..4b9c2a166 100755 --- a/src/cg/f20.trr +++ b/src/cg/f20.trr @@ -1,5 +1,5 @@ 20 -67 +68 TIPOCF|1|1|0|Tipo liente ornitore CODCF|3|6|0|Codice RAGSOC|1|50|0|Ragione sociale @@ -34,6 +34,7 @@ PTELEX|1|10|0|Prefisso del numero di TELEX TELEX|1|30|0|Prefisso del numero di TELEX MAIL|1|50|0|Indirizzo di posta elettronica generico BYMAIL|8|1|0|Consenso all' invio dei documenti per posta elettronica +PEC|1|50|0|Indirizzo di posta elettronica certificato DOCMAIL|1|50|0|Indirizzo di posta elettronica per i documenti DATANASC|5|8|0|Data di nascita STATONASC|2|3|0|Codice stato di nascita diff --git a/src/fp/Rappresentazione_tabellare_del_tracciato_FatturaPA_versione_1.2.1.xls b/src/fp/Rappresentazione_tabellare_del_tracciato_FatturaPA_versione_1.2.1.xls new file mode 100644 index 0000000000000000000000000000000000000000..94d22552894f82398935073705385d069e5209e6 GIT binary patch literal 186880 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 V>bh;sRQmb%4}v!TZ~rj{egXP88BzcM literal 0 HcmV?d00001 diff --git a/src/fp/fp0.cpp b/src/fp/fp0.cpp new file mode 100644 index 000000000..dace2a5c1 --- /dev/null +++ b/src/fp/fp0.cpp @@ -0,0 +1,17 @@ +#include +#include "fp0.h" + +int main(int argc, char** argv) +{ + int rt = -1; + const int r = (argc > 1) ? atoi( &argv[1][1] ) : 1; + + switch (r) + { + case 2: rt = fp0300(argc, argv); break; // Gestione fatture attive (PAA, Ex Fattura PA) + //case 1: rt = fp0200(argc, argv); break; // Gestione fatture passive (PAF) + default: rt = fp0100(argc, argv); break; // Configurazione + } + return rt; +} + diff --git a/src/fp/fp0.h b/src/fp/fp0.h new file mode 100644 index 000000000..84e1d0d7e --- /dev/null +++ b/src/fp/fp0.h @@ -0,0 +1,8 @@ +#ifndef __TF0_H +#define __TF0_H + +int fp0100(int argc, char* argv[]); +int fp0200(int argc, char* argv[]); +int fp0300(int argc, char* argv[]); + +#endif diff --git a/src/fp/fp0100.cpp b/src/fp/fp0100.cpp new file mode 100644 index 000000000..3c2820c37 --- /dev/null +++ b/src/fp/fp0100.cpp @@ -0,0 +1,126 @@ +#include +#include +#include +#include + +#include "fp0.h" +#include "fp0100a.h" +#include +#include "recset.h" +#include "progind.h" +#include "../ve/velib.h" + +class TParametri_mask : public TAutomask +{ +protected: + void tipi_import(); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TParametri_mask(const char* n); +}; + +TParametri_mask::TParametri_mask(const char * n) : TAutomask(n) +{ + set(F_INDIRIZZO, ini_get_string(CONFIG_DITTA, "fp", "ip")); + set(F_DATABASE, ini_get_string(CONFIG_DITTA, "fp", "db")); + set(F_USER, ini_get_string(CONFIG_DITTA, "fp", "usr")); + set(F_PASSWORD, decode(ini_get_string(CONFIG_DITTA, "fp", "psw") )); + set(F_FLDDEST, ini_get_string(CONFIG_DITTA, "fp", "flddest")); + set(F_FLDUSRDEST, ini_get_string(CONFIG_DITTA, "fp", "fldusrdest")); + +} + +void TParametri_mask::tipi_import() +{ + if(yesno_box("Attenzione! Questa procedura riporterà su tutti i documenti il tipo documento SDI della configurazione!\nEventuali modifiche già fatte verranno sovrascritte, continuare?")) + { + TISAM_recordset tipi("USE %TIP SELECT S12!=''"); + TProgress_monitor p(tipi.items(), "Elaborazione tipi doc"); + for(bool ok = tipi.move_first(); ok; ok = tipi.move_next()) + { + if (!p.add_status()) + break; + + TISAM_recordset docs("USE DOC SELECT TIPODOC==#TIPODOC"); + docs.set_var("#TIPODOC", tipi.get("CODTAB")); + + TString msg = "Elaborazione documenti "; msg << tipi.get("CODTAB"); + TProgress_monitor d(docs.items(), msg); + for (bool ok = docs.move_first(); ok; ok = docs.move_next()) + { + if (!d.add_status()) + break; + TDocumento doc(docs.cursor()->curr()); + doc.put("TIPODOCSDI", tipi.get("S12").as_string()); + if (doc.rewrite() != NOERR) + fatal_box("ERRORE aggiornamento documenti"); + } + } + } +} + +bool TParametri_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_ELABORA: + if (e == fe_button) + tipi_import(); + default: + break; + } + + return true; +} + +class TParametri_ditta : public TSkeleton_application +{ +public: + virtual bool create(); + virtual void main_loop(); +}; + +bool TParametri_ditta::create() +{ + open_files(LF_DOC, LF_RIGHEDOC, -1); + return TSkeleton_application::create(); +} + +void TParametri_ditta::main_loop() +{ + TParametri_mask pm("fp0100a"); + while (pm.run() == K_ENTER) + { + // Testo prima la connessione + TString + ip = pm.get(F_INDIRIZZO), + db = pm.get(F_DATABASE), + ad, + usr = pm.get(F_USER), + psw = pm.get(F_PASSWORD); + ad << ip << "@" << db; + + SSimple_query s(ad, usr, psw, TSDB_MSSQL); + if (s.sq_is_connect()) + { + + ini_set_string(CONFIG_DITTA, "fp", "ip", ip); + ini_set_string(CONFIG_DITTA, "fp", "db", db); + ini_set_string(CONFIG_DITTA, "fp", "usr", usr); + ini_set_string(CONFIG_DITTA, "fp", "psw", encode(psw)); + ini_set_string(CONFIG_DITTA, "fp", "flddest", pm.get(F_FLDDEST)); + ini_set_string(CONFIG_DITTA, "fp", "fldusrdest", pm.get(F_FLDUSRDEST)); + message_box("Dati salvati correttamente!"); + } + else + error_box("Connessione a database non riuscita!"); + } +} + +int fp0100(int argc, char* argv[]) +{ + TParametri_ditta appc; + appc.run(argc, argv, TR("Configurazione FP")); + return 0; +} \ No newline at end of file diff --git a/src/fp/fp0100a.h b/src/fp/fp0100a.h new file mode 100644 index 000000000..7553970f2 --- /dev/null +++ b/src/fp/fp0100a.h @@ -0,0 +1,6 @@ +#define F_INDIRIZZO 104 +#define F_DATABASE 101 +#define F_USER 102 +#define F_PASSWORD 103 +#define F_FLDDEST 104 +#define F_FLDUSRDEST 105 \ No newline at end of file diff --git a/src/fp/fp0100a.uml b/src/fp/fp0100a.uml new file mode 100644 index 000000000..e2dbcc807 --- /dev/null +++ b/src/fp/fp0100a.uml @@ -0,0 +1,64 @@ +#include "fp0100a.h" + +TOOLBAR "topbar" 0 0 0 2 +#include + +BUTTON DLG_ELABORA 2 2 +BEGIN + PROMPT 1 1 "Imp. Tipi Doc" + PICTURE TOOL_ELABORA +END +ENDPAGE + +PAGE "Configurazione FP" 0 2 0 0 + +GROUPBOX DLG_NULL 78 6 +BEGIN + PROMPT 1 1 "@BDatabase" +END + +STRING F_INDIRIZZO 50 +BEGIN + PROMPT 2 2 "Indirizzo " + FLAGS "" + CHECKTYPE REQUIRED +END + + +STRING F_DATABASE 15 +BEGIN + PROMPT 2 3 "Nome " + FLAGS "" + CHECKTYPE REQUIRED +END + +STRING F_USER 15 +BEGIN + PROMPT 2 4 "Utente " + FLAGS "" + CHECKTYPE REQUIRED +END + +STRING F_PASSWORD 15 +BEGIN + PROMPT 2 5 "Password " + FLAGS "*" + CHECKTYPE REQUIRED +END + +STRING F_FLDDEST 50 +BEGIN + PROMPT 2 6 "Destinazione Server " + FLAGS "" + CHECKTYPE REQUIRED +END + +STRING F_FLDUSRDEST 50 +BEGIN + PROMPT 2 7 "Destinazione User " + FLAGS "" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/src/fp/fp0200.cpp b/src/fp/fp0200.cpp new file mode 100644 index 000000000..73c5add88 --- /dev/null +++ b/src/fp/fp0200.cpp @@ -0,0 +1,1757 @@ +#include "fp0.h" +#include "fp0200b.h" + +#include +#include +#include +#include + +#include "../ve/velib05.h" +#include "../cg/cglib03.h" + +#include "../fe/felib.h" + +#include +#include +#include +#include +#include +#include +#include "../cg/cfban.h" + +///////////////////////////////////////////////////////////////////////////////////// +// Utilities +///////////////////////////////////////////////////////////////////////////////////// + +SSimple_query& db() +{ + static SSimple_query* db = new SSimple_query(); + return *db; +} + +// Crea la coppia di chiavi per il db PAF a partire da un documento vero e proprio +static bool chiave_paf(const TDocumento& doc, TString& cess, TString& numdoc) +{ + cess = doc.clifor().vendite().get(CFV_PADESTIN); + CHECK(cess.full(), "Destinatario fattura P.A. non valido"); + + const TCodice_numerazione& codnum = doc.codice_numerazione(); + const long ndoc = doc.numero(); + TString16 fullnumdoc; codnum.complete_num(ndoc, fullnumdoc); + + numdoc.cut(0) << doc.get(DOC_ANNO) << '/' << codnum.codice() << '/' << fullnumdoc; + return cess.full(); +} + +// Crea la coppia di chiavi per il db PAF a partire da un semplice record di testata documento +static bool chiave_paf(const TRectype& doc, TString& cess, TString& numdoc) +{ + const long codcf = doc.get_long(DOC_CODCF); + TString8 key; key.format("C|%ld", codcf); + cess = cache().get(LF_CFVEN, key, CFV_PADESTIN); + CHECK(cess.full(), "Destinatario fattura P.A. non valido"); + + const TCodice_numerazione& codnum = cached_numerazione(doc.get(DOC_CODNUM)); + const long ndoc = doc.get_long(DOC_NDOC); + TString16 fullnumdoc; codnum.complete_num(ndoc, fullnumdoc); + numdoc.cut(0) << doc.get(DOC_ANNO) << '/' << codnum.codice() << '/' << fullnumdoc; + + return cess.full(); +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TAncestor +///////////////////////////////////////////////////////////////////////////////////// + +struct TAncestor : public TObject +{ + TString20 _numdoc; + TDate _datadoc; + + TAncestor(const TRectype& rdoc); +}; + +TAncestor::TAncestor(const TRectype& rdoc) +{ + const int anno = rdoc.get_int(RDOC_ANNO); + const TString4 codnum = rdoc.get(RDOC_CODNUM); + const long ndoc = rdoc.get_long(RDOC_NDOC); + const TCodice_numerazione& num = cached_numerazione(codnum); + + TToken_string kdoc; + kdoc = rdoc.get(RDOC_PROVV); + kdoc.add(anno); + kdoc.add(codnum); + kdoc.add(ndoc); + const TRectype& doc = cache().get(LF_DOC, kdoc); + + TString16 numdoc; num.complete_num(ndoc, numdoc); + _numdoc.format("%d/%s/%s", anno, (const char*)codnum, (const char*)numdoc); + _datadoc = doc.get_date(DOC_DATADOC); +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TPaf_record +///////////////////////////////////////////////////////////////////////////////////// + +// Contenitore di campi di un record di database SQLite +class TPaf_record : public TObject +{ + TString8 _table; + TToken_string _key; + TAssoc_array _fields; + +protected: + void copy(const TPaf_record& rec) { _table = rec._table; _key = rec._key; _fields = rec._fields; } + const TString& var2str(const TString& fld, const TVariant& var) const; + +public: + void reset() { _fields.destroy(); } + void set(const char* fld, const TVariant& var); + void set(const char* fld, long var); + void set(const char* fld, const char* var); + void set(const char* fld, const real& var); + void set(const char* fld, const TString& var); + void set(const char* fld, const TDate& var); + void set(const char* fld, bool var); + const TVariant& get(const char* fld) const; + + bool insert(); + bool remove(); + bool search(); + bool search(const char* k1, const char* k2, const char* k3 = NULL); + + virtual TObject* dup() const { return new TPaf_record(*this); } + virtual bool ok() const { return _table.not_empty(); } + + TPaf_record& operator=(const TPaf_record& rec) { copy(rec); return *this; } + TPaf_record(const TPaf_record& rec) { copy(rec); } + TPaf_record(const char* table); +}; + +// Imposta il valore di un campo variant +void TPaf_record::set(const char* fld, const TVariant& var) +{ + CHECK(fld && *fld, "Null field name"); + + if (var.is_null()) + { + _fields.remove(fld); + } + else + { + TVariant* obj = (TVariant*)_fields.objptr(fld); + if (obj != NULL) + *obj = var; + else + _fields.add(fld, new TVariant(var)); + } +} + +// Imposta il valore di un campo intero +void TPaf_record::set(const char* fld, long val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo stringa +void TPaf_record::set(const char* fld, const char* val) +{ + if (val == NULL) + set(fld, NULL_VARIANT); + else + { + const TVariant var(val); + set(fld, var); + } +} + +// Imposta il valore di un campo stringa +void TPaf_record::set(const char* fld, const TString& val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo numerico +void TPaf_record::set(const char* fld, const real& val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo data in formato ISO +void TPaf_record::set(const char* fld, const TDate& val) +{ + if (val.ok()) + { + const TVariant var(val); + set(fld, var); + } + else + set(fld, ""); +} + +// Imposta il valore di un campo booleano +void TPaf_record::set(const char* fld, bool var) +{ + set(fld, var ? "SI" : "NO"); +} + +// Legge il valore di un campo variant +const TVariant& TPaf_record::get(const char* fld) const +{ + const TVariant* var = (const TVariant*)_fields.objptr(fld); + return var ? *var : NULL_VARIANT; +} + +// Converte un variant in una stringa valida per SQLite +const TString& TPaf_record::var2str(const TString& fldname, const TVariant& var) const +{ + const TFieldtypes vt = var.type(); + if (vt == _realfld) + { + const TCurrency v(var.as_real(), "", ZERO, fldname.find("PRZ")>0 || fldname.find("PREZZO")>0); + TString& tmp = get_tmp_string(); + tmp << '\'' << v.string() << '\''; tmp.replace(',', '.'); + return tmp; + } + if (vt == _datefld) + { + TString& tmp = get_tmp_string(); + tmp << '\'' << var.as_date().string(full, '-', full, full, amg_date) << '\''; + return tmp; + } + + const TString& str = var.as_string(); + + bool apici = vt == _alfafld; + if (apici && str[0] != '0' && real::is_natural(str)) + apici = false; + + if (!apici) + return str; + + TString& tmp = get_tmp_string(); + tmp = str; + for (int a = str.rfind('\''); a >= 0; a--) + { + if (tmp[a] == '\'') + tmp.insert("'", a); + } + tmp.insert("'", 0); + tmp << '\''; + return tmp; +} + +// Elimina il record in base ai campi chiave +bool TPaf_record::remove() +{ + TString256 query; + query << "DELETE FROM " << _table << " WHERE "; + int nkf = 0; + FOR_EACH_TOKEN(_key, fld) + { + const TVariant& var = get(fld); + if (!var.is_null()) + { + if (nkf++ > 0) + query << " AND "; + query << fld << '=' << var2str(fld, var); + } + } + CHECKS(nkf >= 2, "Can't remove partial key on table ", (const char*)_table); + query << ';'; + return db().sq_set_exec(query); +} + +// Callback per la sottostante funzione search() +static int paf_search_record(void* jolly, int cols, char** values, char** names) +{ + TPaf_record& rec = *(TPaf_record*)jolly; + for (int i = 0; i < cols; i++) + rec.set(names[i], values[i]); + return 0; +} + +// Carica un record in base ai campi chiave +bool TPaf_record::search() +{ + CHECKS(_fields.items() >= _key.items(), "Can't search partial key on table ", _table); + TString256 query; + query << "SELECT * FROM " << _table << " WHERE "; + FOR_EACH_TOKEN(_key, fld) + { + const TVariant& var = get(fld); + if (!var.is_null()) + query << fld << '=' << var2str(fld, var) << " AND "; + } + query.rtrim(5); + query << ';'; + // TODO: Da controllare + // return xvt_sql_execute(_db, query, paf_search_record, this) == 1; + return db().sq_set_exec(query); +} + +// Carica un record in base ad un massimo di 3 campi chiave +bool TPaf_record::search(const char* k1, const char* k2, const char* k3) +{ + _fields.destroy(); + + set(_key.get(0), k1); + set(_key.get(1), k2); + if (k3 && *k3) + set(_key.get(2), k3); + + return search(); +} + +// Aggiunge un record al db +bool TPaf_record::insert() +{ + CHECKS(_fields.items() > _key.items(), "Can't insert empty record on table ", _table); + + TString query, values; + query << "INSERT INTO " << _table << "\n("; + FOR_EACH_ASSOC_OBJECT(_fields, obj, fld, itm) + { + const TVariant& var = get(fld); + if (!var.is_null()) + { + query << fld << ','; + values << var2str(fld, var) << ','; + } + } + query.rtrim(1); values.rtrim(1); + query << ")\nVALUES (" << values << ");"; + //return xvt_sql_execute(_db, query, NULL, 0L) == 1; + return db().sq_set_exec(query); +} + +// Crea un record della tabella data ed imposta i nomi dei campi chiave +TPaf_record::TPaf_record(const char* table) : _table(table), _key(15, ',') +{ + _key = ini_get_string("./paf.ini", table, "INDEX_1"); + if (_key.empty()) + { + // Cerco di costruire i nomi della chiave cercando la K, come in P1_KEYHEADERFATT + TConfig cfg("paf.ini", table); + TAssoc_array& fields = cfg.list_variables(); + FOR_EACH_ASSOC_STRING(fields, obj, key, str) + { + if (key[3] == 'K') + _key.add(key); + } + } + CHECKS(!_key.empty_items(), "Invalid primary key for table ", table); +} + +///////////////////////////////////////////////////////////////////////////////////// +// TPa_mask +///////////////////////////////////////////////////////////////////////////////////// + +class TPA_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + void fill(); + void init(); + bool is_fattura(const TRectype& doc) const; + +public: + TPA_mask() : TAutomask("fp0200a") { } +}; + +bool TPA_mask::is_fattura(const TRectype& doc) const +{ + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + if (!td.is_fattura()) // Tengo per buone solo le fatture e le note di credito + return false; + + const TCodice_numerazione& cn = cached_numerazione(doc.get(DOC_CODNUM)); + return cn.tipo() == 2 && !cn.get_bool("B10"); // Controlla se fattura provvisioria esclusa da P.A. +} + + +void TPA_mask::fill() +{ + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + docs.hide(); + + sht.destroy(); + + // Seleziona tutti i clienti che sono pubbliche amministrazioni (PADESTIN!='') + TString query; + query << "USE 17 SELECT PADESTIN!=''" + << "\nJOIN 20 INTO TIPOCF=TIPOCF CODCF==CODCF" + << "\nFROM TIPOCF=C\nTO TIPOCF=C"; + + TISAM_recordset clifo_pa(query); + const TRecnotype n = clifo_pa.items(); + if (n > 0) + { + const TDate dal = get(F_DATAINI); + const bool hide_processed = !get_bool(F_SHOWALL); + + // Record di controllo per eventuali elaborazioni precedenti + TString hfatt(8), bfatt(20); + TPaf_record paf0100f("PAF0100F"); + + TProgress_monitor pi(n, NULL); + for (bool okc = clifo_pa.move_first(); okc; okc = clifo_pa.move_next()) + { + if (!pi.add_status()) + break; + + query.cut(0); + query << "USE 33 KEY 2\nSELECT (BETWEEN(STATO,2,8))"; + query << "\nFROM TIPOCF=C CODCF=#CLIENTE PROVV=D ANNO=" << dal.year() << " DATADOC=" << dal.date2ansi() + << "\nTO TIPOCF=C CODCF=#CLIENTE PROVV=D"; + TISAM_recordset doc_pa(query); + doc_pa.set_var("#CLIENTE", clifo_pa.get(CLI_CODCF)); + const TRectype& doc = doc_pa.cursor()->curr(); + for (bool okd = doc_pa.move_first(); okd; okd = doc_pa.move_next()) + { + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + if (!td.is_fattura()) // Tengo per buone solo le fatture e le note di credito + continue; + + bool sent = false; + if (chiave_paf(doc, hfatt, bfatt)) + { + if (paf0100f.search(hfatt, bfatt)) + { + sent = paf0100f.get("P1_GESTIONE").as_string() == "X"; + if (sent && hide_processed) + continue; + } + } + TToken_string* row = new TToken_string; + *row = sent ? " " : "X"; + row->add(doc_pa.get(DOC_ANNO).as_int(), 1); + row->add(doc_pa.get(DOC_CODNUM).as_string()); + row->add(doc_pa.get(DOC_NDOC).as_int()); + row->add(doc_pa.get(DOC_DATADOC).as_date()); + row->add(clifo_pa.get(CFV_CODCF).as_int()); + row->add(clifo_pa.get("20." CLI_RAGSOC).as_string()); + row->add(clifo_pa.get(CFV_PADESTIN).as_string()); + row->add(clifo_pa.get(CFV_PARIFAMM).as_string()); + row->add(clifo_pa.get("20." CLI_COFI).as_string()); + + bool split = clifo_pa.get("20." CLI_SPLITPAY).as_bool(); + if (split) + { + const long numreg = doc_pa.get(DOC_NUMREG).as_int(); + if (numreg > 0) + { + const TRectype& mov = cache().get(LF_MOV, numreg); + split = is_split_payment(mov); + } + } + row->add(split ? "X" : " "); + + const bool attach = !doc_pa.get("COLL_GOLEM").is_empty(); + row->add(attach ? "X" : " "); + + sht.add(row); + } + } + } + docs.force_update(); + docs.show(); +} + +bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_DATAINI: + if (e == fe_init) + o.set(ini_get_string(CONFIG_DITTA, "pa", "LastXML", "31-03-2015")); else + if (e == fe_modify) + fill(); else + if (e == fe_close) + ini_set_string(CONFIG_DITTA, "pa", "LastXML", o.get()); + break; + case F_SHOWALL: + if (e == fe_modify) + fill(); + break; + case F_DOCS: + if (e == fe_init) + fill(); + if (e == se_query_add || e == se_query_del) + return false; + break; + case DLG_USER: + if (e == fe_button && jolly > 0) + { + TSheet_field& docs = sfield(F_DOCS); + TToken_string& row = docs.row(docs.selected()); + TRectype doc(LF_DOC); + doc.put(DOC_PROVV, 'D'); + doc.put(DOC_ANNO, row.get(1)); + doc.put(DOC_CODNUM, row.get()); + doc.put(DOC_NDOC, row.get()); + if (doc.edit()) + fill(); + } + break; + case DLG_ALL: + { + if (e == fe_button) + { + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + const int items = sht.items(); + + if (items > 0) + { + const TString4 select = *(sht.row(0).get(0)) == 'X' ? "" : "X"; + for (int i = 0; i < items; i++) + sht.row(i).add(select, 0); + docs.force_update(); + } + } + } + break; + default: break; + } + return true; +} + +///////////////////////////////////////////////////////////////////////////////////// +// TDoc2Paf +///////////////////////////////////////////////////////////////////////////////////// + +class TDoc2Paf : public TSkeleton_application +{ + TAnagrafica _ditta; + TString16 _cofi; + TFilename _dbname; + TLog_report* _log; + TString _logpaf; + +private: + int parse_line(const TString& line, TString& var, TString& val) const; + bool create_table(TScanner& paf, const TString& table); + + const TRectype* find_parent_row(const TRectype& rdoc) const; + int find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) const; + +protected: + bool parse_sconto(const TString& formula, TToken_string& sconti) const; + bool get_bnp_iban(const TString& abi, const TString& cab, int prg, TString& iban) const; + bool get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const; + const char* descrizione(const TRiga_documento& rdoc) const; + const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta + + void log(int severity, const char* msg); + bool show_log(); + const char * natura(const TString& codiva) const; + void set_IVA(const TString& codiva, TPaf_record& paf) const; + void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const; + + bool elabora(TDocumentoEsteso& doc); + bool elabora(const TRectype& rec); + bool elabora(const TDoc_key& key); + bool elabora(const TFilename& ini); + bool genera_xml(); + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + + TDoc2Paf() : _log(NULL) {} +}; + +bool TDoc2Paf::parse_sconto(const TString& formula, TToken_string& sconti) const +{ + sconti.cut(0); + int start = 0; + for (int i = 0; ; i++) + { + const char c = formula[i]; + if (c == '+' || c == '-' || c < ' ') + { + if (i > 0) + { + TString8 tok = formula.sub(start, i); + tok.replace(',', '.'); + const real perc = tok; + if (!perc.is_zero()) + sconti.add(tok); + } + if (c < ' ') + break; + start = i; + } + } + return sconti.full(); +} + +bool TDoc2Paf::get_bnp_iban(const TString& abi, const TString& cab, int nprog, TString& iban) const +{ + TTable bnp("BNP"); + TString16 key; + key << abi << cab; + if (nprog > 0) + { + TString4 sprog; sprog.format("%02d", nprog); + key << sprog; + } + bnp.put("CODTAB", key); + int err = bnp.read(_isgteq); + if (err == NOERR && !bnp.get("CODTAB").starts_with(abi)) + err = _iskeynotfound; + if (err == NOERR) + iban = bnp.get("S3"); + + return err == NOERR; +} + +bool TDoc2Paf::get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const +{ + bool found = false; + abi = doc.get(DOC_CODABIP); + cab = doc.get(DOC_CODCABP); + int prg = doc.get_int(DOC_PROGBNP); + + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, prg, iban); + + if (!found) // Se non trovo banca sul DOC la cerco su CFBAN + { + TToken_string key; + key.add("C"); key.add(doc.codcf()); key.add("N"); key.add(1); + const TRectype& cfban = cache().get(LF_CFBAN, key); + if (!cfban.empty()) + { + abi = cfban.get(CFBAN_ABI); + cab = cfban.get(CFBAN_CAB); + prg = cfban.get_int(CFBAN_PROGPR); + found = abi.full() && cab.full(); + iban = cfban.get(CFBAN_IBAN); + if (found && iban.blank()) + get_bnp_iban(abi, cab, prg, iban); + } + } + + if (!found) // Se non trovo banca su CFBAN la cerco su CFVEN + { + const TRectype& cfven = doc.clifor().vendite(); + abi = cfven.get(CFV_CODABIPR); + cab = cfven.get(CFV_CODCABPR); + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, 0, iban); + } + + if (found) + istituto = cache().get("%BAN", abi, "S0"); + + return found; +} + +const char* TDoc2Paf::descrizione(const TRiga_documento& rdoc) const +{ + if (rdoc.get_bool(RDOC_DESCLUNGA)) + { + TString tmp; + tmp << rdoc.get(RDOC_DESCR) << rdoc.get(RDOC_DESCEST); + tmp.replace('\n', ' '); tmp.strip_double_spaces(); tmp.trim(); + TParagraph_string para(tmp, 100); + return para.get(0); + } + return rdoc.get(RDOC_DESCR); +} + +const TRectype* TDoc2Paf::find_parent_row(const TRectype& rdoc) const +{ + const long id = rdoc.get_long(RDOC_DAIDRIGA); + if (id > 0L) + { + TToken_string key; + key.add(rdoc.get(RDOC_DACODNUM)); + if (key.full()) + { + key.add(rdoc.get(RDOC_DAANNO)); + key.add(rdoc.get(RDOC_DAPROVV)); + key.add(rdoc.get(RDOC_DANDOC)); + for (int r = 0; ; r++) + { + if (r == 0) + key.add(id, 4); + else + key.add(r, 4); + const TRectype& rec = cache().get(LF_RIGHEDOC, key); + if (r > 0 && rec.empty()) + break; + if (rec.get_long(RDOC_IDRIGA) == id) + return &rec; + } + } + } + return NULL; +} + +int TDoc2Paf::find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) const +{ + if (rdoc.is_articolo()) + { + for (const TRectype* prdoc = find_parent_row(rdoc); prdoc != NULL; prdoc = find_parent_row(*prdoc)) + { + const TCodice_numerazione& cn = cached_numerazione(prdoc->get(RDOC_CODNUM)); + const int td = cn.tipo(); + if (td > 0 && ancestors.objptr(td) == NULL) + ancestors.add(new TAncestor(*prdoc), td); + } + } + return ancestors.items(); +} + +const TRectype& TDoc2Paf::cco(const TRectype& doc) const +{ + TString80 conkey; + const TString& con = doc.get(DOC_CONTRATTO); + if (con.full()) + { + char tcon = doc.get_char(DOC_MODPAG); + if (tcon < 'C') tcon = 'C'; + conkey.format("%c%6ld%s", tcon, doc.get_long(DOC_CODCF), (const char*)con); + } + return cache().get("&CON", conkey); +} + +void TDoc2Paf::log(int severity, const char* msg) +{ + if (severity < 0) + { + _logpaf = msg; + } + else + if (_log == NULL) + { + _log = new TLog_report; + if (_logpaf.full()) + { + TString txt; + txt << _logpaf << ": " << msg; + _log->log(severity, txt); + } + else + _log->log(severity, msg); + } +} + +bool TDoc2Paf::show_log() +{ + bool ok = true; + if (_log) + { + _log->preview(); + delete _log; + _log = NULL; + ok = noyes_box(TR("Si desidera procedere con la generazione file xml?")); + } + return ok; +} + + +const char * TDoc2Paf::natura(const TString& codiva) const +{ + const TRectype& ai = cache().get("%IVA", codiva); + TString & natura = get_tmp_string(4); + + natura = ai.get("S12"); + if (natura.blank()) + { + const int tipo_iva11 = ai.get_int("S2"); + const bool revcharge = tipo_iva11 >= 31 && tipo_iva11 <= 38; + const TString& tipo = ai.get("S1"); + const int tipo_vendite = ai.get_int("S7"); + + // N1 escluse ex art 15 + if (tipo_vendite == 5) + natura = "N5"; // regime del margine + else + if (revcharge) + natura = "N6"; // Inversione contabile (REVERSE CHARGE) + else + if (tipo == "NS") + natura = "N2"; // Non soggetto + else + if (tipo == "NI") + natura = "N3"; // Non imponibile + else + if (tipo == "ES") + natura = "N4"; // Esente + } + return natura; +} + +void TDoc2Paf::set_IVA(const TString& codiva, TPaf_record& paf) const +{ + const TRectype& ai = cache().get("%IVA", codiva); + const real aliquota = ai.get("R0"); + paf.set("PI_ALIQUOTAIVA", aliquota); + if (codiva.full()) + { + if (aliquota.is_zero()) + paf.set("PI_NATURA", natura(codiva)); + else + paf.set("PI_NATURA", ""); + } +} + +void TDoc2Paf::set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const +{ + const TString8 codiva(rdoc.get(RDOC_CODIVA)); + const TRectype& ai = cache().get("%IVA", codiva); + const real aliquota = ai.get("R0"); + paf.set("PI_ALIQUOTAIVA", aliquota); + if (codiva.full()) + { + if (aliquota.is_zero()) + paf.set("PI_NATURA", natura(codiva)); + else + paf.set("PI_NATURA", ""); + } +} + + +bool TDoc2Paf::elabora(TDocumentoEsteso& doc) +{ + TString8 hfatt; // Codice univoco di 6 caratteri dell'ufficio P.A. + TString20 bfatt; // Codice univoco di 20 caratteri del documento + if (!chiave_paf(doc, hfatt, bfatt)) + return false; + log(-1, bfatt); + + const TFirm& firm = prefix().firm(); + const char* const paese = "IT"; + TCausale caus = TCausale(doc.tipo().causale(), doc.anno()); + + // + TPaf_record paf0100f("PAF0100F"); + paf0100f.set("P1_KEYHEADERFATT", hfatt); + paf0100f.set("P1_KEYBODYFATT", bfatt); + paf0100f.remove(); + + paf0100f.set("P1_TRASMITTPAESE", paese); + paf0100f.set("P1_TRASMITTCOD", _cofi); + paf0100f.set("P1_PRGINVIO", ""); // Ci pensa SiAggPA + paf0100f.set("P1_FMTTRASMISS", "SDI11"); // SDI11 si usa dal 2015 per lo split payment (prima era SDI10) + + paf0100f.set("P1_CODDEST", hfatt); + TString80 tel; tel << firm.get(NDT_PTEL) << firm.get(NDT_TEL); + paf0100f.set("P1_TELEFONO", tel); + paf0100f.set("P1_MAIL", firm.get(NDT_MAIL)); + paf0100f.set("P1_GESTIONE", "D"); + paf0100f.insert(); + // + + // + TPaf_record paf0200f("PAF0200F"); + paf0200f.set("P2_KEYHEADERFATT", hfatt); + paf0200f.set("P2_KEYBODYFATT", bfatt); + paf0200f.remove(); + + if (_ditta.partita_IVA().full()) + { + paf0200f.set("P2_FISCIVAPAESE", paese); // Sempre IT + paf0200f.set("P2_FISCIVACOD", _ditta.partita_IVA()); + } + paf0200f.set("P2_CODFISCALE", _ditta.codice_fiscale()); + if (_ditta.fisica()) + { + paf0200f.set("P2_ANANOME", _ditta.nome()); + paf0200f.set("P2_ANACOGNOME", _ditta.cognome()); + } + else + { + paf0200f.set("P2_ANADENOMIN", _ditta.ragione_sociale()); + } + + const char* regime_fiscale = "RF01"; + if (doc.get_bool(DOC_IVAXCASSA)) + { + // Supponiamo volume d'affari > 200000, altrimenti sarebbe RF17 + regime_fiscale = "RF16"; + } + paf0200f.set("P2_REGFISCALE", regime_fiscale); + + // DatiSede + paf0200f.set("P2_SEDEIND", _ditta.via_residenza()); + paf0200f.set("P2_SEDENRCIVICO", _ditta.civico_residenza()); + paf0200f.set("P2_SEDECAP", _ditta.CAP_residenza()); + paf0200f.set("P2_SEDECOMUNE", _ditta.comune_residenza()); + paf0200f.set("P2_SEDEPROV", _ditta.provincia_residenza()); + paf0200f.set("P2_SEDENAZ", paese); + paf0200f.set("P2_GESTIONE", "D"); + + TAnagrafica cliente(doc.clifor()); + + TString rifamm = cco(doc).get("S4"); + if (rifamm.blank()) + rifamm = doc.clifor().vendite().get(CFV_PARIFAMM); + paf0200f.set("P2_RIFAMMINISTR", rifamm); + + TISAM_recordset unloc("USE UNLOC\nJOIN COMUNI INTO COM==COMCCIAA\nFROM CODDITTA=#DITTA\nTO CODDITTA=#DITTA"); + unloc.set_var("#DITTA", firm.get(NDT_CODDITTA)); + if (unloc.move_first()) + { + const TString& numrea = unloc.get(ULC_NUMCCIAA).as_string(); + if (numrea.full()) + { + paf0200f.set("P2_ISCRREANUM", numrea); + paf0200f.set("P2_ISCRREAUFF", unloc.get("13->" COM_PROVCOM)); + } + } + + if (_ditta.giuridica()) + { + TISAM_recordset anagiu("USE ANAGIU\nFROM CODANAGR=#CODICE\nTO CODANAGR=#CODICE"); + anagiu.set_var("#CODICE", firm.get(NDT_CODANAGR)); + if (anagiu.move_first()) + { + paf0200f.set("P2_ISCRREACAP", anagiu.get(ANG_CAPSOC)); + const int ss = anagiu.get(ANG_STATOSOC).as_int(); + paf0200f.set("P2_ISCRREASLIQUID", (ss == 2 || ss == 3) ? "LS" : "LN"); + } + } + else + paf0200f.set("P2_ISCRREASLIQUID", "LN"); + + paf0200f.insert(); + + // + + // + + TPaf_record paf0400f("PAF0400F"); + paf0400f.set("P4_KEYHEADERFATT", hfatt); + paf0400f.set("P4_KEYBODYFATT", bfatt); + paf0400f.remove(); + + if (cliente.partita_IVA().full()) + { + paf0400f.set("P4_FISCIVAPAESE", paese); + paf0400f.set("P4_FISCIVACOD", cliente.partita_IVA()); + } + paf0400f.set("P4_CODFISC", cliente.codice_fiscale()); + + if (cliente.fisica()) + { + paf0400f.set("P4_ANANOME", cliente.nome()); + paf0400f.set("P4_ANACOGNOME", cliente.cognome()); + } + else + { + paf0400f.set("P4_ANADENOM", cliente.ragione_sociale()); + } + + // DatiSede + paf0400f.set("P4_SEDEIND", cliente.via_residenza()); + paf0400f.set("P4_SEDENRCIVICO", cliente.civico_residenza()); + paf0400f.set("P4_SEDECAP", cliente.CAP_residenza()); + paf0400f.set("P4_SEDECOMUNE", cliente.comune_residenza()); + paf0400f.set("P4_SEDEPROV", cliente.provincia_residenza()); + paf0400f.set("P4_SEDENAZ", "IT"); + paf0400f.set("P4_GESTIONE", "D"); + paf0400f.insert(); + // + + // + TPaf_record paf0700f("PAF0700F"); + paf0700f.set("P7_KEYHEADERFATT", hfatt); + paf0700f.set("P7_KEYBODYFATT", bfatt); + paf0700f.remove(); + paf0700f.set("P7_TIPODOC", doc.is_nota_credito() ? "TD04" : "TD01"); + paf0700f.set("P7_DIVISA", "EUR"); // Aggiungere codice ISO 4217 a tabella divise (%VAL) + paf0700f.set("P7_DATA", doc.data()); + + const TCodice_numerazione& codnum = doc.codice_numerazione(); + TString20 numdoc; codnum.complete_num(doc.numero(), numdoc); + paf0700f.set("P7_NUMERO", numdoc); + paf0700f.set("P7_GESTIONE", "D"); + paf0700f.insert(); + + // + TPaf_record paf0900f("PAF0900F"); + paf0900f.set("P9_KEYHEADERFATT", hfatt); + paf0900f.set("P9_KEYBODYFATT", bfatt); + paf0900f.remove(); + + TString80 sconto_expr = doc.get(DOC_SCONTOPERC); + TToken_string sconti; + if (parse_sconto(sconto_expr, sconti)) + { + long nlin_sconto = 0; + FOR_EACH_TOKEN(sconti, str) + { + const real sconto = str; + if (!sconto.is_zero()) // Precauzione inutile + { + paf0900f.set("P9_RIFNUMLINEA", ++nlin_sconto); + if (sconto > ZERO) + { + paf0900f.set("P9_TIPOSCONTO", "SC"); + paf0900f.set("P9_PERCSCONTO", sconto); + } + else + { + paf0900f.set("P9_TIPOSCONTO", "MG"); + paf0900f.set("P9_PERCSCONTO", -sconto); + } + paf0900f.set("P9_GESTIONE", "D"); + paf0900f.insert(); + } + } + } + // + + // + TPaf_record paf2700f("PAF2700F"); + paf2700f.set("PQ_KEYHEADERFATT", hfatt); + paf2700f.set("PQ_KEYBODYFATT", bfatt); + paf2700f.remove(); + paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc()); + + const TRectype& cont_conv_off = cco(doc); + TString causale = cont_conv_off.get("S1"); + if (causale.full()) + { + causale << ' ' << cont_conv_off.get("S2"); + causale << ' ' << cont_conv_off.get("S3"); + causale.strip_double_spaces(); + causale.cut(200); + } + else + causale = doc.tipo().descrizione(); + paf2700f.set("PQ_CAUSALE", causale); + // paf2700f.set("PQ_ART73", true); + paf2700f.set("PQ_GESTIONE", "D"); + paf2700f.insert(); + // + + // Azzera contratti + TPaf_record paf1000f("PAF1000F"); + paf1000f.set("P0_KEYHEADERFATT", hfatt); + paf1000f.set("P0_KEYBODYFATT", bfatt); + paf1000f.remove(); + + // Azzera convenzioni + TPaf_record paf1100f("PAF1100F"); + paf1100f.set("PA_KEYHEADERFATT", hfatt); + paf1100f.set("PA_KEYBODYFATT", bfatt); + paf1100f.remove(); + + // Azzera ordini + TPaf_record paf1200f("PAF1200F"); + paf1200f.set("PB_KEYHEADERFATT", hfatt); + paf1200f.set("PB_KEYBODYFATT", bfatt); + paf1200f.remove(); + + // Azzera DDT + TPaf_record paf1600f("PAF1600F"); + paf1600f.set("PF_KEYHEADERFATT", hfatt); + paf1600f.set("PF_KEYBODYFATT", bfatt); + paf1600f.remove(); + + const TString16 cup = doc.get(DOC_CUP); + const TString16 cig = doc.get(DOC_CIG); + const TString80 com = doc.get(DOC_CODCMS); + + TString80 con = doc.get(DOC_CONTRATTO); + if (con.full() || cup.full() || cig.full()) + { + char tcon = doc.get_char(DOC_MODPAG); + if (tcon < 'C') tcon = 'C'; + + TDate datadoc; // Data contratto non obbligatoria + if (con.full()) + { + datadoc = cco(doc).get_date("D0"); + } + else + { + // IdDocumento obbligatorio + con = cig; + if (con.blank()) + con = cup; + } + + if (tcon == 'O') + { + paf1000f.set("P0_RIFNUMLINEA", 0L); + paf1000f.set("P0_IDDOC", con); + paf1000f.set("P0_DATADOC", datadoc); + paf1000f.set("P0_COMMCONVENZ", com); + paf1000f.set("P0_CODCUP", cup); + paf1000f.set("P0_CODCIG", cig); + paf1000f.set("P0_GESTIONE", "D"); + paf1000f.insert(); + } + else + if (tcon == 'C') + { + paf1100f.set("PA_RIFNUMLINEA", 0L); + paf1100f.set("PA_IDDOC", con); + paf1100f.set("PA_DATADOCU", datadoc); + paf1100f.set("PA_COMMCONVENZ", com); + paf1100f.set("PA_CODCUP", cup); + paf1100f.set("PA_CODCIG", cig); + paf1000f.set("PA_GESTIONE", "D"); + paf1100f.insert(); + } + else + { + paf1200f.set("PB_RIFNUMLINEA", 0L); + paf1200f.set("PB_IDDOC", con); + paf1200f.set("PB_DATADOCO", datadoc); + paf1200f.set("PB_COMMCONVENZ", com); + paf1200f.set("PB_CODCUP", cup); + paf1200f.set("PB_CODCIG", cig); + paf1200f.set("PB_GESTIONE", "D"); + paf1200f.insert(); + } + } + + if (cup.blank() && cig.blank()) + log(1, "CIG e CUP assenti"); + + // + + TPaf_record paf1800f("PAF1800F"); + paf1800f.set("PI_KEYHEADERFATT", hfatt); + paf1800f.set("PI_KEYBODYFATT", bfatt); + paf1800f.remove(); // Cancella tutte le righe documento + + TPaf_record paf2000f("PAF2000F"); + paf2000f.set("PJ_KEYHEADERFATT", hfatt); + paf2000f.set("PJ_KEYBODYFATT", bfatt); + paf2000f.remove(); // Cancella tutti gli sconti di riga + + long riga = 0; + TString16 codivadefault; + { + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + codivadefault = rdoc->get(RDOC_CODIVA); + if (codivadefault.full()) + break; + } + } + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + paf1800f.reset(); + paf1800f.set("PI_KEYHEADERFATT", hfatt); + paf1800f.set("PI_KEYBODYFATT", bfatt); + paf1800f.set("PI_NUMEROLINEA", ++riga); + paf1800f.set("PI_DESCRIZIONE", descrizione(*rdoc)); + // paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione + + + set_IVA(codivadefault, paf1800f); + + if (rdoc->is_merce()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + const real qta = rdoc->get(RDOC_QTA); + if (qta.is_zero()) + { + TString msg; msg.format("La riga merce %d ha quantità nulla", riga); + log(1, msg); + } + if (qta >= ZERO) + { + paf1800f.set("PI_QUANTITA", qta); + paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); + } + else + { + paf1800f.set("PI_QUANTITA", -qta); + paf1800f.set("PI_PREZZOUNIT", -rdoc->prezzo(true, false)); + } + paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); + set_IVA(*rdoc, paf1800f); + + /* + const TDate data = doc.get(DOC_DATADOC); + paf1800f.set("PI_DTINIZIOPER", data); + paf1800f.set("PI_DTFINEPER", data); + */ + + // + + sconto_expr = rdoc->get(RDOC_SCONTO); + if (parse_sconto(sconto_expr, sconti)) + { + long nlin_sconto = 0; + FOR_EACH_TOKEN(sconti, str) + { + const real perc = str; + if (!perc.is_zero()) + { + paf2000f.set("PJ_KEYNLINEA", (long)r); + paf2000f.set("PJ_KEYNPROGR", ++nlin_sconto); + if (perc > ZERO) + { + paf2000f.set("PJ_TIPOSCONTO", "SC"); + paf2000f.set("PJ_PERCSCONTO", perc); + } + else + { + paf2000f.set("PJ_TIPOSCONTO", "MG"); + paf2000f.set("PJ_PERCSCONTO", -perc); + } + paf2000f.set("PJ_GESTIONE", "D"); + paf2000f.insert(); + } + } + } + // + + TArray ancestors; find_ancestors(*rdoc, ancestors); + for (int i = ancestors.last(); i > 0; i = ancestors.pred(i)) + { + const TAncestor& a = (const TAncestor&)ancestors[i]; + if (i == 1) + { + TPaf_record paf1600f("PAF1600F"); + paf1600f.reset(); + paf1600f.set("PF_KEYHEADERFATT", hfatt); + paf1600f.set("PF_KEYBODYFATT", bfatt); + paf1600f.set("PF_RIFNUMLINEA", (long)r); + paf1600f.set("PF_NUMDDDT", a._numdoc); + paf1600f.set("PF_DATADDT", a._datadoc); + paf1600f.set("PF_GESTIONE", "D"); + paf1600f.insert(); + } + else + if (i == 3) + { + TPaf_record paf1000f("PAF1000F"); + paf1000f.set("P0_KEYHEADERFATT", hfatt); + paf1000f.set("P0_KEYBODYFATT", bfatt); + paf1000f.set("P0_RIFNUMLINEA", (long)r); + paf1000f.set("P0_IDDOC", a._numdoc); + paf1000f.set("P0_DATADOC", a._datadoc); + paf1000f.set("P0_COMMCONVENZ", com); + paf1000f.set("P0_CODCUP", cup); + paf1000f.set("P0_CODCIG", cig); + paf1000f.set("P0_GESTIONE", "D"); + paf1000f.insert(); + } + } + } + else + if (rdoc->is_spese()) + { + const TSpesa_prest& sp = rdoc->spesa(); + const real imp = rdoc->importo(true, false); + real qta = UNO; + if (sp.is_tipo()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + qta = rdoc->get_real(RDOC_QTA); + if (qta.is_zero()) + { + TString msg; msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, (const char*)rdoc->field_qta()); + log(1, msg); + qta = UNO; + } + paf1800f.set("PI_QUANTITA", qta); + } + real prz = imp; + if (qta != UNO) + { + prz = rdoc->prezzo(true, false); + if (prz.is_zero() && !imp.is_zero()) + { + const TPrice price(imp / qta); + prz = price.get_value(); + } + } + paf1800f.set("PI_PREZZOUNIT", prz); + paf1800f.set("PI_PRZTOTALE", imp); + set_IVA(*rdoc, paf1800f); + } + else + if (rdoc->is_prestazione()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + real qta = rdoc->get(RDOC_QTA); if (qta.is_zero()) qta = UNO; + paf1800f.set("PI_QUANTITA", qta); + paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); + paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); + set_IVA(*rdoc, paf1800f); + } + + paf1800f.set("PI_GESTIONE", "D"); + paf1800f.insert(); + } + // + + // + TPaf_record paf2200f("PAF2200F"); + paf2200f.set("PL_KEYHEADERFATT", hfatt); + paf2200f.set("PL_KEYBODYFATT", bfatt); + paf2200f.remove(); // Cancella tutte le righe di riepilogo IVA + + const char* eiva = "I"; // Esigibilità IVA: Immediata, Differita, Split payment + if (doc.is_split_payment()) + eiva = "S"; else + if (doc.get_bool(DOC_LIQDIFF) || doc.get_bool(DOC_IVAXCASSA)) + eiva = "D"; + + long num_riep = 0; + TAssoc_array& tiva = doc.tabella_iva(false); + FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm) + { + const TRiepilogo_iva& riva = *(const TRiepilogo_iva*)itm; + const real aliquota = riva.cod_iva().percentuale(); + paf2200f.set("PL_KEYNPROGR", ++num_riep); + paf2200f.set("PL_ALIQUOTAIVA", aliquota); + if (aliquota.is_zero()) + paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice())); + + paf2200f.set("PL_IMPONIBILE", riva.imponibile()); + paf2200f.set("PL_IMPOSTA", riva.imposta()); + paf2200f.set("PL_ESIGIVA", eiva); + if (*eiva == 'S') + paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72"); + else + paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione()); + paf2200f.set("PL_GESTIONE", "D"); + paf2200f.insert(); + } + // + + // + TPaf_record paf2400f("PAF2400F"); + paf2400f.set("PN_KEYHEADERFATT", hfatt); + paf2400f.set("PN_KEYBODYFATT", bfatt); + paf2400f.remove(); // Cancella i dati pagamento + + TPagamento& pag = doc.pagamento(); + doc.scadenze_recalc(); // Ricalcola array delle rate + TString_array& scad = doc.scadenze(); + const int nrate = scad.items(); // Conta rate generate + const char* rateazione = nrate > 1 ? "TP01" : "TP02"; // A rate (TP01) o una soluzione(TP02)? + paf2400f.set("PN_CONDPAGAMENTO", rateazione); + paf2400f.set("PN_GESTIONE", "D"); + paf2400f.insert(); + + TPaf_record paf2500f("PAF2500F"); + paf2500f.set("PO_KEYHEADERFATT", hfatt); + paf2500f.set("PO_KEYBODYFATT", bfatt); + paf2500f.remove(); // Cancella tutte le rate + + // Imposto i campi uguali per tutte le rate + paf2500f.set("PO_CONDPAGAMENTO", rateazione); // Condizione di pagamento PA + paf2500f.set("PO_CODICEPAGAM", pag.code()); // Condizione di pagamento CAMPO + + TString80 iban, istituto; + TString8 abi, cab; + if (get_bank(doc, iban, abi, cab, istituto)) + { + paf2500f.set("PO_ISTFINANZ", istituto); + paf2500f.set("PO_IBAN", iban); + paf2500f.set("PO_ABI", abi); + paf2500f.set("PO_CAB", cab); + } + + if (cab.blank()) + log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento")); else + if (iban.blank()) + log(1, TR("Non è presente il codice IBAN per il pagamento")); + + for (int nr = 0; nr < nrate; nr++) + { + paf2500f.set("PO_KEYNPROGR", long(nr + 1)); // Numero rata + + const char* mod_pag = "MP01"; // Modalità di pagamento + const int n = nr < pag.n_rate() ? nr : 0; // Si assicura che il numero riga sia accettabile + switch (pag.tipo_rata(n)) + { + case _bonfico: mod_pag = "MP05"; break; // bonifico + case _rid: mod_pag = "MP09"; break; // RID + case _ric_ban: mod_pag = "MP12"; break; // RIBA + default: mod_pag = "MP01"; break; // contanti + } + paf2500f.set("PO_MODALITAPAGAM", mod_pag); + + TToken_string& riga = scad.row(nr); // Data|Importo + paf2500f.set("PO_DATASCADENZA", TDate(riga.get(0))); // Data scadenza + paf2500f.set("PO_IMPORTO", real(riga.get())); // Importo rata + + paf2500f.set("PO_GESTIONE", "D"); + paf2500f.insert(); + } + + TPaf_record paf2600f("PAF2600F"); + paf2600f.set("PP_KEYHEADERFATT", hfatt); + paf2600f.set("PP_KEYBODYFATT", bfatt); + paf2600f.remove(); // Cancella eventuali allegati + TToken_string allegati(doc.get("COLL_GOLEM"), '\n'); + if (allegati.full()) + { + long nprogr = 0; // Numero di file allegati + TFilename fname; + FOR_EACH_TOKEN(allegati, row) + { + const TToken_string entry(row); + if (entry.get(0, fname) && fname.exist()) + { + paf2600f.set("PP_KEYNPROGR", ++nprogr); + paf2600f.set("PP_NOMEATTACHMENT", fname.name()); + paf2600f.set("PP_ATTACHMENT", fname); + fname.upper(); // serve estensione maiuscola + paf2600f.set("PP_FMTATTACHMENT", fname.ext()); + paf2600f.insert(); + } + } + } + + // + + return true; +} + +bool TDoc2Paf::elabora(const TRectype& rec) +{ + bool done = false; + TDocumentoEsteso doc; + if (doc.read(rec) == NOERR) + { + // TODO: Da controllare + // xvt_sql_begin(_db); + done = elabora(doc); + if (done) + done = db().sq_commit(); + else + db().sq_rollback(); + } + return done; +} + +bool TDoc2Paf::elabora(const TDoc_key& key) +{ + TRectype rec(LF_DOC); + rec.put(DOC_PROVV, key.provv()); + rec.put(DOC_ANNO, key.anno()); + rec.put(DOC_CODNUM, key.codnum()); + rec.put(DOC_NDOC, key.ndoc()); + return elabora(rec); +} + +bool TDoc2Paf::elabora(const TFilename& ini) +{ + TConfig cfg(ini, "33"); + const int anno = cfg.get_int(DOC_ANNO); + const long ndoc = cfg.get_long(DOC_NDOC); + const TFixed_string codnum(cfg.get(DOC_CODNUM)); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + return elabora(key); +} + + +bool TDoc2Paf::genera_xml() +{ +#define PABASE "SiaggPA" + + TFilename tmp; + + // Copia eventuali protezioni software + TString_array files; + if (list_files(PABASE"/*.ssa", files) == 0) + { + list_files("*.ssa", files); + FOR_EACH_ARRAY_ROW(files, i, row) + { + tmp = PABASE; tmp.add(*row); + xvt_fsys_fupdate(*row, tmp); + } + } + files.destroy(); + if (list_files(PABASE"/*.ssa", files) != 1) + warning_box(FR("Nella cartella %s deve essere presente esattamente un file .ssa"), PABASE); + + TFilename home; + xvt_sys_get_env("USERPROFILE", home.get_buffer(), home.size()); + home.add("SoftwareSirio"); home.add(PABASE); + if (!dexist(home)) + make_dir(home); + + tmp = home; tmp.add("config.properties"); + xvt_fsys_fupdate(PABASE"/config.properties", tmp); + + tmp = home; tmp.add("configGUI.properties"); + xvt_fsys_fupdate(PABASE"/configGUI.properties", tmp); + + if (tmp.exist()) + { + TJava_profile prop(tmp); + if (prop.get("percorso").blank()) + prop.set("percorso", _dbname.path()); + prop.set("nomePAF", _dbname); + } + else + cantread_box(tmp); + + tmp = PABASE"\\SiaggPACAMPO.jar"; + tmp.make_absolute_path(); + + DIRECTORY old_dir; xvt_fsys_get_dir(&old_dir); + DIRECTORY new_dir; xvt_fsys_convert_str_to_dir(tmp.path(), &new_dir); + xvt_fsys_set_dir(&new_dir); + const bool good = goto_url(tmp); + if (good) + xvt_sys_sleep(3000); + else + error_box(FR("Impossibile eseguire Java -jar %s"), (const char*)tmp); + xvt_fsys_set_dir(&old_dir); + + return good; +} + +void TDoc2Paf::main_loop() +{ + int ndocs = 0; + for (int a = 1; a < argc(); a++) + { + TFilename ini = argv(a); + if (ini.starts_with("-i", true) || ini.starts_with("/i", true)) + ini.ltrim(2); + if (ini.exist() && elabora(ini)) + ndocs++; + else + { + if (ini.find('*') >= 0 || ini.find('?') >= 0) + { + TString_array f; list_files(ini, f); + FOR_EACH_ARRAY_ROW(f, r, row) + { + ini = *row; + if (ini.exist() && elabora(ini)) + ndocs++; + } + } + } + } + if (ndocs > 0) + { + if (show_log()) + genera_xml(); + return; + } + + TPA_mask mask; + mask.set(F_COFI, _cofi); + while (mask.run() == K_ENTER) + { + _cofi = mask.get(F_COFI); + + TString_array& sht = mask.sfield(F_DOCS).rows_array(); + if (!sht.empty()) + { + TProgress_monitor pi(sht.items(), NULL); + ndocs = 0; + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (riga->starts_with("X")) + { + const int anno = riga->get_int(1); + const long ndoc = riga->get_long(3); + const TFixed_string codnum(riga->get(2)); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + if (elabora(key)) + ndocs++; + } + if (!pi.add_status(1)) + break; + } + message_box(FR("Sono stati elaborati %d documenti"), ndocs); + } + + if (ndocs > 0 && show_log()) + genera_xml(); + } +} + +int TDoc2Paf::parse_line(const TString& line, TString& var, TString& val) const +{ + if (line.blank()) + return 0; + + if (line[0] == '[') + { + var = line.mid(1); + var.rtrim(1); + val.cut(0); + return 1; + } + + const int equal = line.find('='); + if (equal < 6) + return 0; + var = line.left(equal); var.trim(); + val = line.mid(equal + 1); val.trim(); + return 2; +} + +bool TDoc2Paf::create_table(TScanner& paf, const TString& table) +{ + TString query, var, val; + if (xvt_sql_table_exists(_db, table)) + { + SLIST fields = xvt_sql_list_fields(_db, table); + while (!paf.eof()) + { + const TString& line = paf.line(); + const int n = parse_line(line, var, val); + if (n <= 0) + break; + if (var.starts_with("INDEX_")) + break; + if (xvt_slist_find_str(fields, var) == NULL) + { + query.cut(0) << "ALTER TABLE " << table << " ADD COLUMN " << var << ' ' << val << " NOT NULL"; + if (val.find("INT") >= 0 || val.find("NUM") >= 0) + query << " DEFAULT 0"; + else + query << " DEFAULT ''"; + query << ";"; + xvt_sql_execute(_db, query, NULL, NULL); // Create table + } + } + xvt_slist_destroy(fields); + } + else + { + query << "CREATE TABLE " << table << " ("; + while (!paf.eof()) + { + const TString& line = paf.line(); + const int n = parse_line(line, var, val); + if (n <= 0) + break; + if (n == 1) + { + paf.push(line); + break; + } + if (var.starts_with("INDEX_")) + { + query.rtrim(1); // toglie ultima , + query << ");"; + xvt_sql_execute(_db, query, NULL, NULL); // Create table + query.cut(0); + query << "CREATE UNIQUE INDEX " + << table << "_1 ON " << table + << " (" << val << ");"; + xvt_sql_execute(_db, query, NULL, NULL); // Create index + break; + } + else + { + query << "\n " << var << ' ' << val << " NOT NULL"; + if (val.find("INT") >= 0 || val.find("NUM") >= 0) + query << " DEFAULT 0"; + else + query << " DEFAULT ''"; + query << ","; + } + } + } + + return true; +} + +bool TDoc2Paf::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, + LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, + LF_DOC, LF_RIGHEDOC, 0); + + TRectype cfven(LF_CFVEN); + if (cfven.type(CFV_PARIFAMM) != _alfafld) + return error_box(TR("Database non convertito per fatturazione P.A.")); + + _ditta.init(LF_NDITTE, prefix().get_codditta()); + TString ad = ini_get_string(CONFIG_DITTA, "fp", "ip"); ad << "@" << ini_get_string(CONFIG_DITTA, "fp", "db"); + db().sq_connect( + ad, + ini_get_string(CONFIG_DITTA, "fp", "usr"), + decode(ini_get_string(CONFIG_DITTA, "fp", "psw")), + TSDB_MSSQL + ); + db().sq_set_autocommit(false); + if (db().sq_is_connect()) + return false; + + const TFilename ini = "paf.ini"; + bool ok = ini.exist(); + if (ok) + { + // TODO: Controllare begin + // xvt_sql_begin(_db); + TScanner paf(ini); + while (ok && !paf.eof()) + { + const TString& p = paf.line(); + if (p.starts_with("[PA") && p.ends_with("F]")) + { + TString16 table = p; table.strip("[]"); + ok = create_table(paf, table); + } + } + + if (ok) + { + TPaf_record panum("PANUM00F"); + panum.set("PJNKEY", "00001"); + if (!panum.search()) + { + panum.set("PJNINV", "0000000000"); + panum.insert(); + } + + db().sq_commit(); + } + else + db().sq_rollback(); + } + else + return cantread_box(ini); + + _cofi = ini_get_string(CONFIG_DITTA, "pa", "TRASMITTCOD"); + if (_cofi.blank()) + _cofi = _ditta.codice_fiscale(); + + return ok && TSkeleton_application::create(); +} + +bool TDoc2Paf::destroy() +{ + if (_cofi.full()) + ini_set_string(CONFIG_DITTA, "pa", "TRASMITTCOD", _cofi); + + return TSkeleton_application::destroy(); +} + +int fp0200(int argc, char* argv[]) +{ + //TFp_app t2t; + //t2t.run(argc, argv, TR("Trasferimento Fatture Elettroniche")); + return 0; +} \ No newline at end of file diff --git a/src/fp/fp0200.cpp~RF1e8fd00e.TMP b/src/fp/fp0200.cpp~RF1e8fd00e.TMP new file mode 100644 index 000000000..179283ca7 --- /dev/null +++ b/src/fp/fp0200.cpp~RF1e8fd00e.TMP @@ -0,0 +1,1757 @@ +#include "fp0.h" +#include "fp0200b.h" + +#include +#include +#include +#include + +#include "../ve/velib05.h" +#include "../cg/cglib03.h" + +#include "../fe/felib.h" + +#include +#include +#include +#include +#include +#include +#include "../cg/cfban.h" + +///////////////////////////////////////////////////////////////////////////////////// +// Utilities +///////////////////////////////////////////////////////////////////////////////////// + +SSimple_query& db() +{ + static SSimple_query* db = new SSimple_query(); + return *db; +} + +// Crea la coppia di chiavi per il db PAF a partire da un documento vero e proprio +static bool chiave_paf(const TDocumento& doc, TString& cess, TString& numdoc) +{ + cess = doc.clifor().vendite().get(CFV_PADESTIN); + CHECK(cess.full(), "Destinatario fattura P.A. non valido"); + + const TCodice_numerazione& codnum = doc.codice_numerazione(); + const long ndoc = doc.numero(); + TString16 fullnumdoc; codnum.complete_num(ndoc, fullnumdoc); + + numdoc.cut(0) << doc.get(DOC_ANNO) << '/' << codnum.codice() << '/' << fullnumdoc; + return cess.full(); +} + +// Crea la coppia di chiavi per il db PAF a partire da un semplice record di testata documento +static bool chiave_paf(const TRectype& doc, TString& cess, TString& numdoc) +{ + const long codcf = doc.get_long(DOC_CODCF); + TString8 key; key.format("C|%ld", codcf); + cess = cache().get(LF_CFVEN, key, CFV_PADESTIN); + CHECK(cess.full(), "Destinatario fattura P.A. non valido"); + + const TCodice_numerazione& codnum = cached_numerazione(doc.get(DOC_CODNUM)); + const long ndoc = doc.get_long(DOC_NDOC); + TString16 fullnumdoc; codnum.complete_num(ndoc, fullnumdoc); + numdoc.cut(0) << doc.get(DOC_ANNO) << '/' << codnum.codice() << '/' << fullnumdoc; + + return cess.full(); +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TAncestor +///////////////////////////////////////////////////////////////////////////////////// + +struct TAncestor : public TObject +{ + TString20 _numdoc; + TDate _datadoc; + + TAncestor(const TRectype& rdoc); +}; + +TAncestor::TAncestor(const TRectype& rdoc) +{ + const int anno = rdoc.get_int(RDOC_ANNO); + const TString4 codnum = rdoc.get(RDOC_CODNUM); + const long ndoc = rdoc.get_long(RDOC_NDOC); + const TCodice_numerazione& num = cached_numerazione(codnum); + + TToken_string kdoc; + kdoc = rdoc.get(RDOC_PROVV); + kdoc.add(anno); + kdoc.add(codnum); + kdoc.add(ndoc); + const TRectype& doc = cache().get(LF_DOC, kdoc); + + TString16 numdoc; num.complete_num(ndoc, numdoc); + _numdoc.format("%d/%s/%s", anno, (const char*)codnum, (const char*)numdoc); + _datadoc = doc.get_date(DOC_DATADOC); +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TPaf_record +///////////////////////////////////////////////////////////////////////////////////// + +// Contenitore di campi di un record di database SQLite +class TPaf_record : public TObject +{ + TString8 _table; + TToken_string _key; + TAssoc_array _fields; + +protected: + void copy(const TPaf_record& rec) { _table = rec._table; _key = rec._key; _fields = rec._fields; } + const TString& var2str(const TString& fld, const TVariant& var) const; + +public: + void reset() { _fields.destroy(); } + void set(const char* fld, const TVariant& var); + void set(const char* fld, long var); + void set(const char* fld, const char* var); + void set(const char* fld, const real& var); + void set(const char* fld, const TString& var); + void set(const char* fld, const TDate& var); + void set(const char* fld, bool var); + const TVariant& get(const char* fld) const; + + bool insert(); + bool remove(); + bool search(); + bool search(const char* k1, const char* k2, const char* k3 = NULL); + + virtual TObject* dup() const { return new TPaf_record(*this); } + virtual bool ok() const { return _table.not_empty(); } + + TPaf_record& operator=(const TPaf_record& rec) { copy(rec); return *this; } + TPaf_record(const TPaf_record& rec) { copy(rec); } + TPaf_record(const char* table); +}; + +// Imposta il valore di un campo variant +void TPaf_record::set(const char* fld, const TVariant& var) +{ + CHECK(fld && *fld, "Null field name"); + + if (var.is_null()) + { + _fields.remove(fld); + } + else + { + TVariant* obj = (TVariant*)_fields.objptr(fld); + if (obj != NULL) + *obj = var; + else + _fields.add(fld, new TVariant(var)); + } +} + +// Imposta il valore di un campo intero +void TPaf_record::set(const char* fld, long val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo stringa +void TPaf_record::set(const char* fld, const char* val) +{ + if (val == NULL) + set(fld, NULL_VARIANT); + else + { + const TVariant var(val); + set(fld, var); + } +} + +// Imposta il valore di un campo stringa +void TPaf_record::set(const char* fld, const TString& val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo numerico +void TPaf_record::set(const char* fld, const real& val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo data in formato ISO +void TPaf_record::set(const char* fld, const TDate& val) +{ + if (val.ok()) + { + const TVariant var(val); + set(fld, var); + } + else + set(fld, ""); +} + +// Imposta il valore di un campo booleano +void TPaf_record::set(const char* fld, bool var) +{ + set(fld, var ? "SI" : "NO"); +} + +// Legge il valore di un campo variant +const TVariant& TPaf_record::get(const char* fld) const +{ + const TVariant* var = (const TVariant*)_fields.objptr(fld); + return var ? *var : NULL_VARIANT; +} + +// Converte un variant in una stringa valida per SQLite +const TString& TPaf_record::var2str(const TString& fldname, const TVariant& var) const +{ + const TFieldtypes vt = var.type(); + if (vt == _realfld) + { + const TCurrency v(var.as_real(), "", ZERO, fldname.find("PRZ")>0 || fldname.find("PREZZO")>0); + TString& tmp = get_tmp_string(); + tmp << '\'' << v.string() << '\''; tmp.replace(',', '.'); + return tmp; + } + if (vt == _datefld) + { + TString& tmp = get_tmp_string(); + tmp << '\'' << var.as_date().string(full, '-', full, full, amg_date) << '\''; + return tmp; + } + + const TString& str = var.as_string(); + + bool apici = vt == _alfafld; + if (apici && str[0] != '0' && real::is_natural(str)) + apici = false; + + if (!apici) + return str; + + TString& tmp = get_tmp_string(); + tmp = str; + for (int a = str.rfind('\''); a >= 0; a--) + { + if (tmp[a] == '\'') + tmp.insert("'", a); + } + tmp.insert("'", 0); + tmp << '\''; + return tmp; +} + +// Elimina il record in base ai campi chiave +bool TPaf_record::remove() +{ + TString256 query; + query << "DELETE FROM " << _table << " WHERE "; + int nkf = 0; + FOR_EACH_TOKEN(_key, fld) + { + const TVariant& var = get(fld); + if (!var.is_null()) + { + if (nkf++ > 0) + query << " AND "; + query << fld << '=' << var2str(fld, var); + } + } + CHECKS(nkf >= 2, "Can't remove partial key on table ", (const char*)_table); + query << ';'; + return db().sq_set_exec(query); +} + +// Callback per la sottostante funzione search() +static int paf_search_record(void* jolly, int cols, char** values, char** names) +{ + TPaf_record& rec = *(TPaf_record*)jolly; + for (int i = 0; i < cols; i++) + rec.set(names[i], values[i]); + return 0; +} + +// Carica un record in base ai campi chiave +bool TPaf_record::search() +{ + CHECKS(_fields.items() >= _key.items(), "Can't search partial key on table ", _table); + TString256 query; + query << "SELECT * FROM " << _table << " WHERE "; + FOR_EACH_TOKEN(_key, fld) + { + const TVariant& var = get(fld); + if (!var.is_null()) + query << fld << '=' << var2str(fld, var) << " AND "; + } + query.rtrim(5); + query << ';'; + // TODO: Da controllare + // return xvt_sql_execute(_db, query, paf_search_record, this) == 1; + return db().sq_set_exec(query); +} + +// Carica un record in base ad un massimo di 3 campi chiave +bool TPaf_record::search(const char* k1, const char* k2, const char* k3) +{ + _fields.destroy(); + + set(_key.get(0), k1); + set(_key.get(1), k2); + if (k3 && *k3) + set(_key.get(2), k3); + + return search(); +} + +// Aggiunge un record al db +bool TPaf_record::insert() +{ + CHECKS(_fields.items() > _key.items(), "Can't insert empty record on table ", _table); + + TString query, values; + query << "INSERT INTO " << _table << "\n("; + FOR_EACH_ASSOC_OBJECT(_fields, obj, fld, itm) + { + const TVariant& var = get(fld); + if (!var.is_null()) + { + query << fld << ','; + values << var2str(fld, var) << ','; + } + } + query.rtrim(1); values.rtrim(1); + query << ")\nVALUES (" << values << ");"; + //return xvt_sql_execute(_db, query, NULL, 0L) == 1; + return db().sq_set_exec(query); +} + +// Crea un record della tabella data ed imposta i nomi dei campi chiave +TPaf_record::TPaf_record(const char* table) : _table(table), _key(15, ',') +{ + _key = ini_get_string("./paf.ini", table, "INDEX_1"); + if (_key.empty()) + { + // Cerco di costruire i nomi della chiave cercando la K, come in P1_KEYHEADERFATT + TConfig cfg("paf.ini", table); + TAssoc_array& fields = cfg.list_variables(); + FOR_EACH_ASSOC_STRING(fields, obj, key, str) + { + if (key[3] == 'K') + _key.add(key); + } + } + CHECKS(!_key.empty_items(), "Invalid primary key for table ", table); +} + +///////////////////////////////////////////////////////////////////////////////////// +// TPa_mask +///////////////////////////////////////////////////////////////////////////////////// + +class TPA_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + void fill(); + void init(); + bool is_fattura(const TRectype& doc) const; + +public: + TPA_mask() : TAutomask("pa0100a") { } +}; + +bool TPA_mask::is_fattura(const TRectype& doc) const +{ + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + if (!td.is_fattura()) // Tengo per buone solo le fatture e le note di credito + return false; + + const TCodice_numerazione& cn = cached_numerazione(doc.get(DOC_CODNUM)); + return cn.tipo() == 2 && !cn.get_bool("B10"); // Controlla se fattura provvisioria esclusa da P.A. +} + + +void TPA_mask::fill() +{ + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + docs.hide(); + + sht.destroy(); + + // Seleziona tutti i clienti che sono pubbliche amministrazioni (PADESTIN!='') + TString query; + query << "USE 17 SELECT PADESTIN!=''" + << "\nJOIN 20 INTO TIPOCF=TIPOCF CODCF==CODCF" + << "\nFROM TIPOCF=C\nTO TIPOCF=C"; + + TISAM_recordset clifo_pa(query); + const TRecnotype n = clifo_pa.items(); + if (n > 0) + { + const TDate dal = get(F_DATAINI); + const bool hide_processed = !get_bool(F_SHOWALL); + + // Record di controllo per eventuali elaborazioni precedenti + TString hfatt(8), bfatt(20); + TPaf_record paf0100f("PAF0100F"); + + TProgress_monitor pi(n, NULL); + for (bool okc = clifo_pa.move_first(); okc; okc = clifo_pa.move_next()) + { + if (!pi.add_status()) + break; + + query.cut(0); + query << "USE 33 KEY 2\nSELECT (BETWEEN(STATO,2,8))"; + query << "\nFROM TIPOCF=C CODCF=#CLIENTE PROVV=D ANNO=" << dal.year() << " DATADOC=" << dal.date2ansi() + << "\nTO TIPOCF=C CODCF=#CLIENTE PROVV=D"; + TISAM_recordset doc_pa(query); + doc_pa.set_var("#CLIENTE", clifo_pa.get(CLI_CODCF)); + const TRectype& doc = doc_pa.cursor()->curr(); + for (bool okd = doc_pa.move_first(); okd; okd = doc_pa.move_next()) + { + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + if (!td.is_fattura()) // Tengo per buone solo le fatture e le note di credito + continue; + + bool sent = false; + if (chiave_paf(doc, hfatt, bfatt)) + { + if (paf0100f.search(hfatt, bfatt)) + { + sent = paf0100f.get("P1_GESTIONE").as_string() == "X"; + if (sent && hide_processed) + continue; + } + } + TToken_string* row = new TToken_string; + *row = sent ? " " : "X"; + row->add(doc_pa.get(DOC_ANNO).as_int(), 1); + row->add(doc_pa.get(DOC_CODNUM).as_string()); + row->add(doc_pa.get(DOC_NDOC).as_int()); + row->add(doc_pa.get(DOC_DATADOC).as_date()); + row->add(clifo_pa.get(CFV_CODCF).as_int()); + row->add(clifo_pa.get("20." CLI_RAGSOC).as_string()); + row->add(clifo_pa.get(CFV_PADESTIN).as_string()); + row->add(clifo_pa.get(CFV_PARIFAMM).as_string()); + row->add(clifo_pa.get("20." CLI_COFI).as_string()); + + bool split = clifo_pa.get("20." CLI_SPLITPAY).as_bool(); + if (split) + { + const long numreg = doc_pa.get(DOC_NUMREG).as_int(); + if (numreg > 0) + { + const TRectype& mov = cache().get(LF_MOV, numreg); + split = is_split_payment(mov); + } + } + row->add(split ? "X" : " "); + + const bool attach = !doc_pa.get("COLL_GOLEM").is_empty(); + row->add(attach ? "X" : " "); + + sht.add(row); + } + } + } + docs.force_update(); + docs.show(); +} + +bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_DATAINI: + if (e == fe_init) + o.set(ini_get_string(CONFIG_DITTA, "pa", "LastXML", "31-03-2015")); else + if (e == fe_modify) + fill(); else + if (e == fe_close) + ini_set_string(CONFIG_DITTA, "pa", "LastXML", o.get()); + break; + case F_SHOWALL: + if (e == fe_modify) + fill(); + break; + case F_DOCS: + if (e == fe_init) + fill(); + if (e == se_query_add || e == se_query_del) + return false; + break; + case DLG_USER: + if (e == fe_button && jolly > 0) + { + TSheet_field& docs = sfield(F_DOCS); + TToken_string& row = docs.row(docs.selected()); + TRectype doc(LF_DOC); + doc.put(DOC_PROVV, 'D'); + doc.put(DOC_ANNO, row.get(1)); + doc.put(DOC_CODNUM, row.get()); + doc.put(DOC_NDOC, row.get()); + if (doc.edit()) + fill(); + } + break; + case DLG_ALL: + { + if (e == fe_button) + { + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + const int items = sht.items(); + + if (items > 0) + { + const TString4 select = *(sht.row(0).get(0)) == 'X' ? "" : "X"; + for (int i = 0; i < items; i++) + sht.row(i).add(select, 0); + docs.force_update(); + } + } + } + break; + default: break; + } + return true; +} + +///////////////////////////////////////////////////////////////////////////////////// +// TDoc2Paf +///////////////////////////////////////////////////////////////////////////////////// + +class TDoc2Paf : public TSkeleton_application +{ + TAnagrafica _ditta; + TString16 _cofi; + TFilename _dbname; + TLog_report* _log; + TString _logpaf; + +private: + int parse_line(const TString& line, TString& var, TString& val) const; + bool create_table(TScanner& paf, const TString& table); + + const TRectype* find_parent_row(const TRectype& rdoc) const; + int find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) const; + +protected: + bool parse_sconto(const TString& formula, TToken_string& sconti) const; + bool get_bnp_iban(const TString& abi, const TString& cab, int prg, TString& iban) const; + bool get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const; + const char* descrizione(const TRiga_documento& rdoc) const; + const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta + + void log(int severity, const char* msg); + bool show_log(); + const char * natura(const TString& codiva) const; + void set_IVA(const TString& codiva, TPaf_record& paf) const; + void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const; + + bool elabora(TDocumentoEsteso& doc); + bool elabora(const TRectype& rec); + bool elabora(const TDoc_key& key); + bool elabora(const TFilename& ini); + bool genera_xml(); + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + + TDoc2Paf() : _log(NULL) {} +}; + +bool TDoc2Paf::parse_sconto(const TString& formula, TToken_string& sconti) const +{ + sconti.cut(0); + int start = 0; + for (int i = 0; ; i++) + { + const char c = formula[i]; + if (c == '+' || c == '-' || c < ' ') + { + if (i > 0) + { + TString8 tok = formula.sub(start, i); + tok.replace(',', '.'); + const real perc = tok; + if (!perc.is_zero()) + sconti.add(tok); + } + if (c < ' ') + break; + start = i; + } + } + return sconti.full(); +} + +bool TDoc2Paf::get_bnp_iban(const TString& abi, const TString& cab, int nprog, TString& iban) const +{ + TTable bnp("BNP"); + TString16 key; + key << abi << cab; + if (nprog > 0) + { + TString4 sprog; sprog.format("%02d", nprog); + key << sprog; + } + bnp.put("CODTAB", key); + int err = bnp.read(_isgteq); + if (err == NOERR && !bnp.get("CODTAB").starts_with(abi)) + err = _iskeynotfound; + if (err == NOERR) + iban = bnp.get("S3"); + + return err == NOERR; +} + +bool TDoc2Paf::get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const +{ + bool found = false; + abi = doc.get(DOC_CODABIP); + cab = doc.get(DOC_CODCABP); + int prg = doc.get_int(DOC_PROGBNP); + + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, prg, iban); + + if (!found) // Se non trovo banca sul DOC la cerco su CFBAN + { + TToken_string key; + key.add("C"); key.add(doc.codcf()); key.add("N"); key.add(1); + const TRectype& cfban = cache().get(LF_CFBAN, key); + if (!cfban.empty()) + { + abi = cfban.get(CFBAN_ABI); + cab = cfban.get(CFBAN_CAB); + prg = cfban.get_int(CFBAN_PROGPR); + found = abi.full() && cab.full(); + iban = cfban.get(CFBAN_IBAN); + if (found && iban.blank()) + get_bnp_iban(abi, cab, prg, iban); + } + } + + if (!found) // Se non trovo banca su CFBAN la cerco su CFVEN + { + const TRectype& cfven = doc.clifor().vendite(); + abi = cfven.get(CFV_CODABIPR); + cab = cfven.get(CFV_CODCABPR); + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, 0, iban); + } + + if (found) + istituto = cache().get("%BAN", abi, "S0"); + + return found; +} + +const char* TDoc2Paf::descrizione(const TRiga_documento& rdoc) const +{ + if (rdoc.get_bool(RDOC_DESCLUNGA)) + { + TString tmp; + tmp << rdoc.get(RDOC_DESCR) << rdoc.get(RDOC_DESCEST); + tmp.replace('\n', ' '); tmp.strip_double_spaces(); tmp.trim(); + TParagraph_string para(tmp, 100); + return para.get(0); + } + return rdoc.get(RDOC_DESCR); +} + +const TRectype* TDoc2Paf::find_parent_row(const TRectype& rdoc) const +{ + const long id = rdoc.get_long(RDOC_DAIDRIGA); + if (id > 0L) + { + TToken_string key; + key.add(rdoc.get(RDOC_DACODNUM)); + if (key.full()) + { + key.add(rdoc.get(RDOC_DAANNO)); + key.add(rdoc.get(RDOC_DAPROVV)); + key.add(rdoc.get(RDOC_DANDOC)); + for (int r = 0; ; r++) + { + if (r == 0) + key.add(id, 4); + else + key.add(r, 4); + const TRectype& rec = cache().get(LF_RIGHEDOC, key); + if (r > 0 && rec.empty()) + break; + if (rec.get_long(RDOC_IDRIGA) == id) + return &rec; + } + } + } + return NULL; +} + +int TDoc2Paf::find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) const +{ + if (rdoc.is_articolo()) + { + for (const TRectype* prdoc = find_parent_row(rdoc); prdoc != NULL; prdoc = find_parent_row(*prdoc)) + { + const TCodice_numerazione& cn = cached_numerazione(prdoc->get(RDOC_CODNUM)); + const int td = cn.tipo(); + if (td > 0 && ancestors.objptr(td) == NULL) + ancestors.add(new TAncestor(*prdoc), td); + } + } + return ancestors.items(); +} + +const TRectype& TDoc2Paf::cco(const TRectype& doc) const +{ + TString80 conkey; + const TString& con = doc.get(DOC_CONTRATTO); + if (con.full()) + { + char tcon = doc.get_char(DOC_MODPAG); + if (tcon < 'C') tcon = 'C'; + conkey.format("%c%6ld%s", tcon, doc.get_long(DOC_CODCF), (const char*)con); + } + return cache().get("&CON", conkey); +} + +void TDoc2Paf::log(int severity, const char* msg) +{ + if (severity < 0) + { + _logpaf = msg; + } + else + if (_log == NULL) + { + _log = new TLog_report; + if (_logpaf.full()) + { + TString txt; + txt << _logpaf << ": " << msg; + _log->log(severity, txt); + } + else + _log->log(severity, msg); + } +} + +bool TDoc2Paf::show_log() +{ + bool ok = true; + if (_log) + { + _log->preview(); + delete _log; + _log = NULL; + ok = noyes_box(TR("Si desidera procedere con la generazione file xml?")); + } + return ok; +} + + +const char * TDoc2Paf::natura(const TString& codiva) const +{ + const TRectype& ai = cache().get("%IVA", codiva); + TString & natura = get_tmp_string(4); + + natura = ai.get("S12"); + if (natura.blank()) + { + const int tipo_iva11 = ai.get_int("S2"); + const bool revcharge = tipo_iva11 >= 31 && tipo_iva11 <= 38; + const TString& tipo = ai.get("S1"); + const int tipo_vendite = ai.get_int("S7"); + + // N1 escluse ex art 15 + if (tipo_vendite == 5) + natura = "N5"; // regime del margine + else + if (revcharge) + natura = "N6"; // Inversione contabile (REVERSE CHARGE) + else + if (tipo == "NS") + natura = "N2"; // Non soggetto + else + if (tipo == "NI") + natura = "N3"; // Non imponibile + else + if (tipo == "ES") + natura = "N4"; // Esente + } + return natura; +} + +void TDoc2Paf::set_IVA(const TString& codiva, TPaf_record& paf) const +{ + const TRectype& ai = cache().get("%IVA", codiva); + const real aliquota = ai.get("R0"); + paf.set("PI_ALIQUOTAIVA", aliquota); + if (codiva.full()) + { + if (aliquota.is_zero()) + paf.set("PI_NATURA", natura(codiva)); + else + paf.set("PI_NATURA", ""); + } +} + +void TDoc2Paf::set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const +{ + const TString8 codiva(rdoc.get(RDOC_CODIVA)); + const TRectype& ai = cache().get("%IVA", codiva); + const real aliquota = ai.get("R0"); + paf.set("PI_ALIQUOTAIVA", aliquota); + if (codiva.full()) + { + if (aliquota.is_zero()) + paf.set("PI_NATURA", natura(codiva)); + else + paf.set("PI_NATURA", ""); + } +} + + +bool TDoc2Paf::elabora(TDocumentoEsteso& doc) +{ + TString8 hfatt; // Codice univoco di 6 caratteri dell'ufficio P.A. + TString20 bfatt; // Codice univoco di 20 caratteri del documento + if (!chiave_paf(doc, hfatt, bfatt)) + return false; + log(-1, bfatt); + + const TFirm& firm = prefix().firm(); + const char* const paese = "IT"; + TCausale caus = TCausale(doc.tipo().causale(), doc.anno()); + + // + TPaf_record paf0100f("PAF0100F"); + paf0100f.set("P1_KEYHEADERFATT", hfatt); + paf0100f.set("P1_KEYBODYFATT", bfatt); + paf0100f.remove(); + + paf0100f.set("P1_TRASMITTPAESE", paese); + paf0100f.set("P1_TRASMITTCOD", _cofi); + paf0100f.set("P1_PRGINVIO", ""); // Ci pensa SiAggPA + paf0100f.set("P1_FMTTRASMISS", "SDI11"); // SDI11 si usa dal 2015 per lo split payment (prima era SDI10) + + paf0100f.set("P1_CODDEST", hfatt); + TString80 tel; tel << firm.get(NDT_PTEL) << firm.get(NDT_TEL); + paf0100f.set("P1_TELEFONO", tel); + paf0100f.set("P1_MAIL", firm.get(NDT_MAIL)); + paf0100f.set("P1_GESTIONE", "D"); + paf0100f.insert(); + // + + // + TPaf_record paf0200f("PAF0200F"); + paf0200f.set("P2_KEYHEADERFATT", hfatt); + paf0200f.set("P2_KEYBODYFATT", bfatt); + paf0200f.remove(); + + if (_ditta.partita_IVA().full()) + { + paf0200f.set("P2_FISCIVAPAESE", paese); // Sempre IT + paf0200f.set("P2_FISCIVACOD", _ditta.partita_IVA()); + } + paf0200f.set("P2_CODFISCALE", _ditta.codice_fiscale()); + if (_ditta.fisica()) + { + paf0200f.set("P2_ANANOME", _ditta.nome()); + paf0200f.set("P2_ANACOGNOME", _ditta.cognome()); + } + else + { + paf0200f.set("P2_ANADENOMIN", _ditta.ragione_sociale()); + } + + const char* regime_fiscale = "RF01"; + if (doc.get_bool(DOC_IVAXCASSA)) + { + // Supponiamo volume d'affari > 200000, altrimenti sarebbe RF17 + regime_fiscale = "RF16"; + } + paf0200f.set("P2_REGFISCALE", regime_fiscale); + + // DatiSede + paf0200f.set("P2_SEDEIND", _ditta.via_residenza()); + paf0200f.set("P2_SEDENRCIVICO", _ditta.civico_residenza()); + paf0200f.set("P2_SEDECAP", _ditta.CAP_residenza()); + paf0200f.set("P2_SEDECOMUNE", _ditta.comune_residenza()); + paf0200f.set("P2_SEDEPROV", _ditta.provincia_residenza()); + paf0200f.set("P2_SEDENAZ", paese); + paf0200f.set("P2_GESTIONE", "D"); + + TAnagrafica cliente(doc.clifor()); + + TString rifamm = cco(doc).get("S4"); + if (rifamm.blank()) + rifamm = doc.clifor().vendite().get(CFV_PARIFAMM); + paf0200f.set("P2_RIFAMMINISTR", rifamm); + + TISAM_recordset unloc("USE UNLOC\nJOIN COMUNI INTO COM==COMCCIAA\nFROM CODDITTA=#DITTA\nTO CODDITTA=#DITTA"); + unloc.set_var("#DITTA", firm.get(NDT_CODDITTA)); + if (unloc.move_first()) + { + const TString& numrea = unloc.get(ULC_NUMCCIAA).as_string(); + if (numrea.full()) + { + paf0200f.set("P2_ISCRREANUM", numrea); + paf0200f.set("P2_ISCRREAUFF", unloc.get("13->" COM_PROVCOM)); + } + } + + if (_ditta.giuridica()) + { + TISAM_recordset anagiu("USE ANAGIU\nFROM CODANAGR=#CODICE\nTO CODANAGR=#CODICE"); + anagiu.set_var("#CODICE", firm.get(NDT_CODANAGR)); + if (anagiu.move_first()) + { + paf0200f.set("P2_ISCRREACAP", anagiu.get(ANG_CAPSOC)); + const int ss = anagiu.get(ANG_STATOSOC).as_int(); + paf0200f.set("P2_ISCRREASLIQUID", (ss == 2 || ss == 3) ? "LS" : "LN"); + } + } + else + paf0200f.set("P2_ISCRREASLIQUID", "LN"); + + paf0200f.insert(); + + // + + // + + TPaf_record paf0400f("PAF0400F"); + paf0400f.set("P4_KEYHEADERFATT", hfatt); + paf0400f.set("P4_KEYBODYFATT", bfatt); + paf0400f.remove(); + + if (cliente.partita_IVA().full()) + { + paf0400f.set("P4_FISCIVAPAESE", paese); + paf0400f.set("P4_FISCIVACOD", cliente.partita_IVA()); + } + paf0400f.set("P4_CODFISC", cliente.codice_fiscale()); + + if (cliente.fisica()) + { + paf0400f.set("P4_ANANOME", cliente.nome()); + paf0400f.set("P4_ANACOGNOME", cliente.cognome()); + } + else + { + paf0400f.set("P4_ANADENOM", cliente.ragione_sociale()); + } + + // DatiSede + paf0400f.set("P4_SEDEIND", cliente.via_residenza()); + paf0400f.set("P4_SEDENRCIVICO", cliente.civico_residenza()); + paf0400f.set("P4_SEDECAP", cliente.CAP_residenza()); + paf0400f.set("P4_SEDECOMUNE", cliente.comune_residenza()); + paf0400f.set("P4_SEDEPROV", cliente.provincia_residenza()); + paf0400f.set("P4_SEDENAZ", "IT"); + paf0400f.set("P4_GESTIONE", "D"); + paf0400f.insert(); + // + + // + TPaf_record paf0700f("PAF0700F"); + paf0700f.set("P7_KEYHEADERFATT", hfatt); + paf0700f.set("P7_KEYBODYFATT", bfatt); + paf0700f.remove(); + paf0700f.set("P7_TIPODOC", doc.is_nota_credito() ? "TD04" : "TD01"); + paf0700f.set("P7_DIVISA", "EUR"); // Aggiungere codice ISO 4217 a tabella divise (%VAL) + paf0700f.set("P7_DATA", doc.data()); + + const TCodice_numerazione& codnum = doc.codice_numerazione(); + TString20 numdoc; codnum.complete_num(doc.numero(), numdoc); + paf0700f.set("P7_NUMERO", numdoc); + paf0700f.set("P7_GESTIONE", "D"); + paf0700f.insert(); + + // + TPaf_record paf0900f("PAF0900F"); + paf0900f.set("P9_KEYHEADERFATT", hfatt); + paf0900f.set("P9_KEYBODYFATT", bfatt); + paf0900f.remove(); + + TString80 sconto_expr = doc.get(DOC_SCONTOPERC); + TToken_string sconti; + if (parse_sconto(sconto_expr, sconti)) + { + long nlin_sconto = 0; + FOR_EACH_TOKEN(sconti, str) + { + const real sconto = str; + if (!sconto.is_zero()) // Precauzione inutile + { + paf0900f.set("P9_RIFNUMLINEA", ++nlin_sconto); + if (sconto > ZERO) + { + paf0900f.set("P9_TIPOSCONTO", "SC"); + paf0900f.set("P9_PERCSCONTO", sconto); + } + else + { + paf0900f.set("P9_TIPOSCONTO", "MG"); + paf0900f.set("P9_PERCSCONTO", -sconto); + } + paf0900f.set("P9_GESTIONE", "D"); + paf0900f.insert(); + } + } + } + // + + // + TPaf_record paf2700f("PAF2700F"); + paf2700f.set("PQ_KEYHEADERFATT", hfatt); + paf2700f.set("PQ_KEYBODYFATT", bfatt); + paf2700f.remove(); + paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc()); + + const TRectype& cont_conv_off = cco(doc); + TString causale = cont_conv_off.get("S1"); + if (causale.full()) + { + causale << ' ' << cont_conv_off.get("S2"); + causale << ' ' << cont_conv_off.get("S3"); + causale.strip_double_spaces(); + causale.cut(200); + } + else + causale = doc.tipo().descrizione(); + paf2700f.set("PQ_CAUSALE", causale); + // paf2700f.set("PQ_ART73", true); + paf2700f.set("PQ_GESTIONE", "D"); + paf2700f.insert(); + // + + // Azzera contratti + TPaf_record paf1000f("PAF1000F"); + paf1000f.set("P0_KEYHEADERFATT", hfatt); + paf1000f.set("P0_KEYBODYFATT", bfatt); + paf1000f.remove(); + + // Azzera convenzioni + TPaf_record paf1100f("PAF1100F"); + paf1100f.set("PA_KEYHEADERFATT", hfatt); + paf1100f.set("PA_KEYBODYFATT", bfatt); + paf1100f.remove(); + + // Azzera ordini + TPaf_record paf1200f("PAF1200F"); + paf1200f.set("PB_KEYHEADERFATT", hfatt); + paf1200f.set("PB_KEYBODYFATT", bfatt); + paf1200f.remove(); + + // Azzera DDT + TPaf_record paf1600f("PAF1600F"); + paf1600f.set("PF_KEYHEADERFATT", hfatt); + paf1600f.set("PF_KEYBODYFATT", bfatt); + paf1600f.remove(); + + const TString16 cup = doc.get(DOC_CUP); + const TString16 cig = doc.get(DOC_CIG); + const TString80 com = doc.get(DOC_CODCMS); + + TString80 con = doc.get(DOC_CONTRATTO); + if (con.full() || cup.full() || cig.full()) + { + char tcon = doc.get_char(DOC_MODPAG); + if (tcon < 'C') tcon = 'C'; + + TDate datadoc; // Data contratto non obbligatoria + if (con.full()) + { + datadoc = cco(doc).get_date("D0"); + } + else + { + // IdDocumento obbligatorio + con = cig; + if (con.blank()) + con = cup; + } + + if (tcon == 'O') + { + paf1000f.set("P0_RIFNUMLINEA", 0L); + paf1000f.set("P0_IDDOC", con); + paf1000f.set("P0_DATADOC", datadoc); + paf1000f.set("P0_COMMCONVENZ", com); + paf1000f.set("P0_CODCUP", cup); + paf1000f.set("P0_CODCIG", cig); + paf1000f.set("P0_GESTIONE", "D"); + paf1000f.insert(); + } + else + if (tcon == 'C') + { + paf1100f.set("PA_RIFNUMLINEA", 0L); + paf1100f.set("PA_IDDOC", con); + paf1100f.set("PA_DATADOCU", datadoc); + paf1100f.set("PA_COMMCONVENZ", com); + paf1100f.set("PA_CODCUP", cup); + paf1100f.set("PA_CODCIG", cig); + paf1000f.set("PA_GESTIONE", "D"); + paf1100f.insert(); + } + else + { + paf1200f.set("PB_RIFNUMLINEA", 0L); + paf1200f.set("PB_IDDOC", con); + paf1200f.set("PB_DATADOCO", datadoc); + paf1200f.set("PB_COMMCONVENZ", com); + paf1200f.set("PB_CODCUP", cup); + paf1200f.set("PB_CODCIG", cig); + paf1200f.set("PB_GESTIONE", "D"); + paf1200f.insert(); + } + } + + if (cup.blank() && cig.blank()) + log(1, "CIG e CUP assenti"); + + // + + TPaf_record paf1800f("PAF1800F"); + paf1800f.set("PI_KEYHEADERFATT", hfatt); + paf1800f.set("PI_KEYBODYFATT", bfatt); + paf1800f.remove(); // Cancella tutte le righe documento + + TPaf_record paf2000f("PAF2000F"); + paf2000f.set("PJ_KEYHEADERFATT", hfatt); + paf2000f.set("PJ_KEYBODYFATT", bfatt); + paf2000f.remove(); // Cancella tutti gli sconti di riga + + long riga = 0; + TString16 codivadefault; + { + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + codivadefault = rdoc->get(RDOC_CODIVA); + if (codivadefault.full()) + break; + } + } + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + paf1800f.reset(); + paf1800f.set("PI_KEYHEADERFATT", hfatt); + paf1800f.set("PI_KEYBODYFATT", bfatt); + paf1800f.set("PI_NUMEROLINEA", ++riga); + paf1800f.set("PI_DESCRIZIONE", descrizione(*rdoc)); + // paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione + + + set_IVA(codivadefault, paf1800f); + + if (rdoc->is_merce()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + const real qta = rdoc->get(RDOC_QTA); + if (qta.is_zero()) + { + TString msg; msg.format("La riga merce %d ha quantità nulla", riga); + log(1, msg); + } + if (qta >= ZERO) + { + paf1800f.set("PI_QUANTITA", qta); + paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); + } + else + { + paf1800f.set("PI_QUANTITA", -qta); + paf1800f.set("PI_PREZZOUNIT", -rdoc->prezzo(true, false)); + } + paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); + set_IVA(*rdoc, paf1800f); + + /* + const TDate data = doc.get(DOC_DATADOC); + paf1800f.set("PI_DTINIZIOPER", data); + paf1800f.set("PI_DTFINEPER", data); + */ + + // + + sconto_expr = rdoc->get(RDOC_SCONTO); + if (parse_sconto(sconto_expr, sconti)) + { + long nlin_sconto = 0; + FOR_EACH_TOKEN(sconti, str) + { + const real perc = str; + if (!perc.is_zero()) + { + paf2000f.set("PJ_KEYNLINEA", (long)r); + paf2000f.set("PJ_KEYNPROGR", ++nlin_sconto); + if (perc > ZERO) + { + paf2000f.set("PJ_TIPOSCONTO", "SC"); + paf2000f.set("PJ_PERCSCONTO", perc); + } + else + { + paf2000f.set("PJ_TIPOSCONTO", "MG"); + paf2000f.set("PJ_PERCSCONTO", -perc); + } + paf2000f.set("PJ_GESTIONE", "D"); + paf2000f.insert(); + } + } + } + // + + TArray ancestors; find_ancestors(*rdoc, ancestors); + for (int i = ancestors.last(); i > 0; i = ancestors.pred(i)) + { + const TAncestor& a = (const TAncestor&)ancestors[i]; + if (i == 1) + { + TPaf_record paf1600f("PAF1600F"); + paf1600f.reset(); + paf1600f.set("PF_KEYHEADERFATT", hfatt); + paf1600f.set("PF_KEYBODYFATT", bfatt); + paf1600f.set("PF_RIFNUMLINEA", (long)r); + paf1600f.set("PF_NUMDDDT", a._numdoc); + paf1600f.set("PF_DATADDT", a._datadoc); + paf1600f.set("PF_GESTIONE", "D"); + paf1600f.insert(); + } + else + if (i == 3) + { + TPaf_record paf1000f("PAF1000F"); + paf1000f.set("P0_KEYHEADERFATT", hfatt); + paf1000f.set("P0_KEYBODYFATT", bfatt); + paf1000f.set("P0_RIFNUMLINEA", (long)r); + paf1000f.set("P0_IDDOC", a._numdoc); + paf1000f.set("P0_DATADOC", a._datadoc); + paf1000f.set("P0_COMMCONVENZ", com); + paf1000f.set("P0_CODCUP", cup); + paf1000f.set("P0_CODCIG", cig); + paf1000f.set("P0_GESTIONE", "D"); + paf1000f.insert(); + } + } + } + else + if (rdoc->is_spese()) + { + const TSpesa_prest& sp = rdoc->spesa(); + const real imp = rdoc->importo(true, false); + real qta = UNO; + if (sp.is_tipo()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + qta = rdoc->get_real(RDOC_QTA); + if (qta.is_zero()) + { + TString msg; msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, (const char*)rdoc->field_qta()); + log(1, msg); + qta = UNO; + } + paf1800f.set("PI_QUANTITA", qta); + } + real prz = imp; + if (qta != UNO) + { + prz = rdoc->prezzo(true, false); + if (prz.is_zero() && !imp.is_zero()) + { + const TPrice price(imp / qta); + prz = price.get_value(); + } + } + paf1800f.set("PI_PREZZOUNIT", prz); + paf1800f.set("PI_PRZTOTALE", imp); + set_IVA(*rdoc, paf1800f); + } + else + if (rdoc->is_prestazione()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + real qta = rdoc->get(RDOC_QTA); if (qta.is_zero()) qta = UNO; + paf1800f.set("PI_QUANTITA", qta); + paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); + paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); + set_IVA(*rdoc, paf1800f); + } + + paf1800f.set("PI_GESTIONE", "D"); + paf1800f.insert(); + } + // + + // + TPaf_record paf2200f("PAF2200F"); + paf2200f.set("PL_KEYHEADERFATT", hfatt); + paf2200f.set("PL_KEYBODYFATT", bfatt); + paf2200f.remove(); // Cancella tutte le righe di riepilogo IVA + + const char* eiva = "I"; // Esigibilità IVA: Immediata, Differita, Split payment + if (doc.is_split_payment()) + eiva = "S"; else + if (doc.get_bool(DOC_LIQDIFF) || doc.get_bool(DOC_IVAXCASSA)) + eiva = "D"; + + long num_riep = 0; + TAssoc_array& tiva = doc.tabella_iva(false); + FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm) + { + const TRiepilogo_iva& riva = *(const TRiepilogo_iva*)itm; + const real aliquota = riva.cod_iva().percentuale(); + paf2200f.set("PL_KEYNPROGR", ++num_riep); + paf2200f.set("PL_ALIQUOTAIVA", aliquota); + if (aliquota.is_zero()) + paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice())); + + paf2200f.set("PL_IMPONIBILE", riva.imponibile()); + paf2200f.set("PL_IMPOSTA", riva.imposta()); + paf2200f.set("PL_ESIGIVA", eiva); + if (*eiva == 'S') + paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72"); + else + paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione()); + paf2200f.set("PL_GESTIONE", "D"); + paf2200f.insert(); + } + // + + // + TPaf_record paf2400f("PAF2400F"); + paf2400f.set("PN_KEYHEADERFATT", hfatt); + paf2400f.set("PN_KEYBODYFATT", bfatt); + paf2400f.remove(); // Cancella i dati pagamento + + TPagamento& pag = doc.pagamento(); + doc.scadenze_recalc(); // Ricalcola array delle rate + TString_array& scad = doc.scadenze(); + const int nrate = scad.items(); // Conta rate generate + const char* rateazione = nrate > 1 ? "TP01" : "TP02"; // A rate (TP01) o una soluzione(TP02)? + paf2400f.set("PN_CONDPAGAMENTO", rateazione); + paf2400f.set("PN_GESTIONE", "D"); + paf2400f.insert(); + + TPaf_record paf2500f("PAF2500F"); + paf2500f.set("PO_KEYHEADERFATT", hfatt); + paf2500f.set("PO_KEYBODYFATT", bfatt); + paf2500f.remove(); // Cancella tutte le rate + + // Imposto i campi uguali per tutte le rate + paf2500f.set("PO_CONDPAGAMENTO", rateazione); // Condizione di pagamento PA + paf2500f.set("PO_CODICEPAGAM", pag.code()); // Condizione di pagamento CAMPO + + TString80 iban, istituto; + TString8 abi, cab; + if (get_bank(doc, iban, abi, cab, istituto)) + { + paf2500f.set("PO_ISTFINANZ", istituto); + paf2500f.set("PO_IBAN", iban); + paf2500f.set("PO_ABI", abi); + paf2500f.set("PO_CAB", cab); + } + + if (cab.blank()) + log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento")); else + if (iban.blank()) + log(1, TR("Non è presente il codice IBAN per il pagamento")); + + for (int nr = 0; nr < nrate; nr++) + { + paf2500f.set("PO_KEYNPROGR", long(nr + 1)); // Numero rata + + const char* mod_pag = "MP01"; // Modalità di pagamento + const int n = nr < pag.n_rate() ? nr : 0; // Si assicura che il numero riga sia accettabile + switch (pag.tipo_rata(n)) + { + case _bonfico: mod_pag = "MP05"; break; // bonifico + case _rid: mod_pag = "MP09"; break; // RID + case _ric_ban: mod_pag = "MP12"; break; // RIBA + default: mod_pag = "MP01"; break; // contanti + } + paf2500f.set("PO_MODALITAPAGAM", mod_pag); + + TToken_string& riga = scad.row(nr); // Data|Importo + paf2500f.set("PO_DATASCADENZA", TDate(riga.get(0))); // Data scadenza + paf2500f.set("PO_IMPORTO", real(riga.get())); // Importo rata + + paf2500f.set("PO_GESTIONE", "D"); + paf2500f.insert(); + } + + TPaf_record paf2600f("PAF2600F"); + paf2600f.set("PP_KEYHEADERFATT", hfatt); + paf2600f.set("PP_KEYBODYFATT", bfatt); + paf2600f.remove(); // Cancella eventuali allegati + TToken_string allegati(doc.get("COLL_GOLEM"), '\n'); + if (allegati.full()) + { + long nprogr = 0; // Numero di file allegati + TFilename fname; + FOR_EACH_TOKEN(allegati, row) + { + const TToken_string entry(row); + if (entry.get(0, fname) && fname.exist()) + { + paf2600f.set("PP_KEYNPROGR", ++nprogr); + paf2600f.set("PP_NOMEATTACHMENT", fname.name()); + paf2600f.set("PP_ATTACHMENT", fname); + fname.upper(); // serve estensione maiuscola + paf2600f.set("PP_FMTATTACHMENT", fname.ext()); + paf2600f.insert(); + } + } + } + + // + + return true; +} + +bool TDoc2Paf::elabora(const TRectype& rec) +{ + bool done = false; + TDocumentoEsteso doc; + if (doc.read(rec) == NOERR) + { + // TODO: Da controllare + // xvt_sql_begin(_db); + done = elabora(doc); + if (done) + done = db().sq_commit(); + else + db().sq_rollback(); + } + return done; +} + +bool TDoc2Paf::elabora(const TDoc_key& key) +{ + TRectype rec(LF_DOC); + rec.put(DOC_PROVV, key.provv()); + rec.put(DOC_ANNO, key.anno()); + rec.put(DOC_CODNUM, key.codnum()); + rec.put(DOC_NDOC, key.ndoc()); + return elabora(rec); +} + +bool TDoc2Paf::elabora(const TFilename& ini) +{ + TConfig cfg(ini, "33"); + const int anno = cfg.get_int(DOC_ANNO); + const long ndoc = cfg.get_long(DOC_NDOC); + const TFixed_string codnum(cfg.get(DOC_CODNUM)); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + return elabora(key); +} + + +bool TDoc2Paf::genera_xml() +{ +#define PABASE "SiaggPA" + + TFilename tmp; + + // Copia eventuali protezioni software + TString_array files; + if (list_files(PABASE"/*.ssa", files) == 0) + { + list_files("*.ssa", files); + FOR_EACH_ARRAY_ROW(files, i, row) + { + tmp = PABASE; tmp.add(*row); + xvt_fsys_fupdate(*row, tmp); + } + } + files.destroy(); + if (list_files(PABASE"/*.ssa", files) != 1) + warning_box(FR("Nella cartella %s deve essere presente esattamente un file .ssa"), PABASE); + + TFilename home; + xvt_sys_get_env("USERPROFILE", home.get_buffer(), home.size()); + home.add("SoftwareSirio"); home.add(PABASE); + if (!dexist(home)) + make_dir(home); + + tmp = home; tmp.add("config.properties"); + xvt_fsys_fupdate(PABASE"/config.properties", tmp); + + tmp = home; tmp.add("configGUI.properties"); + xvt_fsys_fupdate(PABASE"/configGUI.properties", tmp); + + if (tmp.exist()) + { + TJava_profile prop(tmp); + if (prop.get("percorso").blank()) + prop.set("percorso", _dbname.path()); + prop.set("nomePAF", _dbname); + } + else + cantread_box(tmp); + + tmp = PABASE"\\SiaggPACAMPO.jar"; + tmp.make_absolute_path(); + + DIRECTORY old_dir; xvt_fsys_get_dir(&old_dir); + DIRECTORY new_dir; xvt_fsys_convert_str_to_dir(tmp.path(), &new_dir); + xvt_fsys_set_dir(&new_dir); + const bool good = goto_url(tmp); + if (good) + xvt_sys_sleep(3000); + else + error_box(FR("Impossibile eseguire Java -jar %s"), (const char*)tmp); + xvt_fsys_set_dir(&old_dir); + + return good; +} + +void TDoc2Paf::main_loop() +{ + int ndocs = 0; + for (int a = 1; a < argc(); a++) + { + TFilename ini = argv(a); + if (ini.starts_with("-i", true) || ini.starts_with("/i", true)) + ini.ltrim(2); + if (ini.exist() && elabora(ini)) + ndocs++; + else + { + if (ini.find('*') >= 0 || ini.find('?') >= 0) + { + TString_array f; list_files(ini, f); + FOR_EACH_ARRAY_ROW(f, r, row) + { + ini = *row; + if (ini.exist() && elabora(ini)) + ndocs++; + } + } + } + } + if (ndocs > 0) + { + if (show_log()) + genera_xml(); + return; + } + + TPA_mask mask; + mask.set(F_COFI, _cofi); + while (mask.run() == K_ENTER) + { + _cofi = mask.get(F_COFI); + + TString_array& sht = mask.sfield(F_DOCS).rows_array(); + if (!sht.empty()) + { + TProgress_monitor pi(sht.items(), NULL); + ndocs = 0; + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (riga->starts_with("X")) + { + const int anno = riga->get_int(1); + const long ndoc = riga->get_long(3); + const TFixed_string codnum(riga->get(2)); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + if (elabora(key)) + ndocs++; + } + if (!pi.add_status(1)) + break; + } + message_box(FR("Sono stati elaborati %d documenti"), ndocs); + } + + if (ndocs > 0 && show_log()) + genera_xml(); + } +} + +int TDoc2Paf::parse_line(const TString& line, TString& var, TString& val) const +{ + if (line.blank()) + return 0; + + if (line[0] == '[') + { + var = line.mid(1); + var.rtrim(1); + val.cut(0); + return 1; + } + + const int equal = line.find('='); + if (equal < 6) + return 0; + var = line.left(equal); var.trim(); + val = line.mid(equal + 1); val.trim(); + return 2; +} + +bool TDoc2Paf::create_table(TScanner& paf, const TString& table) +{ + TString query, var, val; + if (xvt_sql_table_exists(_db, table)) + { + SLIST fields = xvt_sql_list_fields(_db, table); + while (!paf.eof()) + { + const TString& line = paf.line(); + const int n = parse_line(line, var, val); + if (n <= 0) + break; + if (var.starts_with("INDEX_")) + break; + if (xvt_slist_find_str(fields, var) == NULL) + { + query.cut(0) << "ALTER TABLE " << table << " ADD COLUMN " << var << ' ' << val << " NOT NULL"; + if (val.find("INT") >= 0 || val.find("NUM") >= 0) + query << " DEFAULT 0"; + else + query << " DEFAULT ''"; + query << ";"; + xvt_sql_execute(_db, query, NULL, NULL); // Create table + } + } + xvt_slist_destroy(fields); + } + else + { + query << "CREATE TABLE " << table << " ("; + while (!paf.eof()) + { + const TString& line = paf.line(); + const int n = parse_line(line, var, val); + if (n <= 0) + break; + if (n == 1) + { + paf.push(line); + break; + } + if (var.starts_with("INDEX_")) + { + query.rtrim(1); // toglie ultima , + query << ");"; + xvt_sql_execute(_db, query, NULL, NULL); // Create table + query.cut(0); + query << "CREATE UNIQUE INDEX " + << table << "_1 ON " << table + << " (" << val << ");"; + xvt_sql_execute(_db, query, NULL, NULL); // Create index + break; + } + else + { + query << "\n " << var << ' ' << val << " NOT NULL"; + if (val.find("INT") >= 0 || val.find("NUM") >= 0) + query << " DEFAULT 0"; + else + query << " DEFAULT ''"; + query << ","; + } + } + } + + return true; +} + +bool TDoc2Paf::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, + LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, + LF_DOC, LF_RIGHEDOC, 0); + + TRectype cfven(LF_CFVEN); + if (cfven.type(CFV_PARIFAMM) != _alfafld) + return error_box(TR("Database non convertito per fatturazione P.A.")); + + _ditta.init(LF_NDITTE, prefix().get_codditta()); + TString ad = ini_get_string(CONFIG_USER, "fp", "ip"); ad << "@" << ini_get_string(CONFIG_USER, "fp", "db"); + db().sq_connect( + ad, + ini_get_string(CONFIG_USER, "fp", "usr"), + decode(ini_get_string(CONFIG_USER, "fp", "psw")), + TSDB_MSSQL + ); + db().sq_set_autocommit(false); + if (db().sq_is_connect()) + return false; + + const TFilename ini = "paf.ini"; + bool ok = ini.exist(); + if (ok) + { + // TODO: Controllare begin + // xvt_sql_begin(_db); + TScanner paf(ini); + while (ok && !paf.eof()) + { + const TString& p = paf.line(); + if (p.starts_with("[PA") && p.ends_with("F]")) + { + TString16 table = p; table.strip("[]"); + ok = create_table(paf, table); + } + } + + if (ok) + { + TPaf_record panum("PANUM00F"); + panum.set("PJNKEY", "00001"); + if (!panum.search()) + { + panum.set("PJNINV", "0000000000"); + panum.insert(); + } + + db().sq_commit(); + } + else + db().sq_rollback(); + } + else + return cantread_box(ini); + + _cofi = ini_get_string(CONFIG_DITTA, "pa", "TRASMITTCOD"); + if (_cofi.blank()) + _cofi = _ditta.codice_fiscale(); + + return ok && TSkeleton_application::create(); +} + +bool TDoc2Paf::destroy() +{ + if (_cofi.full()) + ini_set_string(CONFIG_DITTA, "pa", "TRASMITTCOD", _cofi); + + return TSkeleton_application::destroy(); +} + +int fp0200(int argc, char* argv[]) +{ + //TFp_app t2t; + //t2t.run(argc, argv, TR("Trasferimento Fatture Elettroniche")); + return 0; +} \ No newline at end of file diff --git a/src/fp/fp0200a.h b/src/fp/fp0200a.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/fp/fp0200a.uml b/src/fp/fp0200a.uml new file mode 100644 index 000000000..159424c4d --- /dev/null +++ b/src/fp/fp0200a.uml @@ -0,0 +1,467 @@ +#include "fp0200a.h" + +TOOLBAR "topbar" 0 0 0 2 +BUTTON DLG_RECALC 2 2 +BEGIN + PROMPT 1 1 "Carica" + PICTURE TOOL_CONVERT +END + +BUTTON DLG_ARCHIVE 2 2 +BEGIN + PROMPT 2 1 "Controlla" + PICTURE TOOL_SMILE +END + +BUTTON DLG_SAVEREC 2 2 +BEGIN + PROMPT 3 1 "Salva" + PICTURE TOOL_SAVEREC +END + +BUTTON DLG_EDIT 10 2 +BEGIN + PROMPT 3 1 "E~xcel" + PICTURE TOOL_EXCEL +END + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "Esporta" + PICTURE TOOL_ELABORA +END + +BUTTON DLG_EMAIL 2 2 +BEGIN + PROMPT 1 1 "Crea XML" + PICTURE TOOL_EMAIL +END + +#include +ENDPAGE + +PAGE "Impostazioni" 0 2 0 0 + +DATE F_DATAINI +BEGIN + PROMPT 1 1 "Data iniziale:" + CHECKTYPE REQUIRED + VALIDATE DATE_CMP_FUNC <= F_DATAFIN + WARNING "La data iniziale non può essere maggiore della data finale" +END + +DATE F_DATAFIN +BEGIN + PROMPT 40 1 "Data Finale: " + CHECKTYPE REQUIRED + VALIDATE DATE_CMP_FUNC >= F_DATAINI + WARNING "La data finale non può essere minore della data iniziale" +END + +RADIOBUTTON F_TIPOCF 15 +BEGIN + PROMPT 1 2 "Tipo C/F" + ITEM "C|Cliente" + ITEM "F|Fornitore" +END + +NUMBER F_CODCF 6 +BEGIN + PROMPT 18 3 "Codice:" + USE LF_CLIFO + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CODCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Occasionale@C" OCCAS + DISPLAY "Codice Fiscale@16" COFI + DISPLAY "Partita IVA@15" PAIV + OUTPUT F_CODCF CODCF + OUTPUT F_RAGSOC RAGSOC + CHEKTYPE NORMAL + GROUP 1 + FLAGS "" +END + +STRING F_RAGSOC 50 49 +BEGIN + PROMPT 18 4 "R.Soc: " + USE LF_CLIFO KEY 2 + INPUT TIPOCF F_TIPOCF SELECT + INPUT RAGSOC F_RAGSOC + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODCF + DISPLAY "Codice Fiscale@16" COFI + DISPLAY "Partita IVA@15" PAIV + COPY OUTPUT F_CODCF + ADD RUN CG0 -1 + GROUP 1 + FLAGS "" +END + + +RADIOBUTTON F_FATTSEL 25 +BEGIN + PROMPT 1 6 "Fatture da visualizzare" + ITEM "0|Da inviare" + ITEM "1|Inviate" + ITEM "2|Mai elaborati" + ITEM "3|Forzate" + ITEM "4|Errate" + ITEM "5|Disabilitate" + ITEM "6|Tutti" +END + +GROUPBOX DLG_NULL 65 5 +BEGIN + PROMPT 30 6 "Tipi documento selezionati" +END + +BOOLEAN B_TIPO_AUTOFATT +BEGIN + PROMPT 31 7 "Autofattura" + FLAGS "" +END +BOOLEAN B_TIPO_FATTACQ +BEGIN + PROMPT 45 7 "Fatt d'Acq" + FLAGS "" +END +BOOLEAN B_TIPO_FATTFISC +BEGIN + PROMPT 60 7 "Fatt Fisc" + FLAGS "" +END +BOOLEAN B_TIPO_FATTVEN +BEGIN + PROMPT 75 7 "Fatt Ven" + FLAGS "" +END + +BOOLEAN B_TIPO_FATTSCO +BEGIN + PROMPT 31 8 "Fatt Scontr" + FLAGS "" +END + +BOOLEAN B_TIPO_NOTC +BEGIN + PROMPT 45 8 "Nota Cred" + FLAGS "" +END +BOOLEAN B_TIPO_NOTD +BEGIN + PROMPT 60 8 "Nota Deb" + FLAGS "" +END +BOOLEAN B_TIPO_BOLLADOG +BEGIN + PROMPT 75 8 "Bolla Dog" + FLAGS "" +END +BOOLEAN B_TIPO_STORDOC +BEGIN + PROMPT 31 9 "Storno Doc" + FLAGS "" +END + +ENDPAGE + +PAGE "Trasferimento Fatture" 0 2 0 0 + +SPREADSHEET F_RIGHE +BEGIN + PROMPT 0 0 "Righe movimenti" + ITEM "Data\n Reg.@8F" + ITEM "Tipo\nDocum.@2F" + ITEM "Tipo\nDoc. AE.@5F" + ITEM "Numero\nDocum.@5F" + ITEM "Data\nDocum.@10" + ITEM "Aliquota@4" + ITEM "Imponibile@10" + ITEM "Imposta@10" + ITEM "Natura\nIVA@4" + ITEM "% Detr.@6" + ITEM "C/F@2" + ITEM "Codice@6" + ITEM "Occas.@16" + ITEM "Ragione Sociale@35" + ITEM "RF/SO@16" + ITEM "Rag. Soc. RF/SO@35" + ITEM "Partita IVA@11" + ITEM "Codice Fiscale@15" + ITEM "Rev.\nCharge@4" + ITEM "Auto\nfatt.@3" + ITEM "Spedita@5" + ITEM "Inviare@5" + ITEM "Modificata@10" + ITEM "N.\nRegistraz.@10" + ITEM "Codici Errori@10" + +END + +ENDPAGE + +ENDMASK + +PAGE "Riga" -1 -1 69 14 + +BOOLEAN A_SPEDITA +BEGIN + PROMPT 52 10 "Gia' spedita" + FIELD SPEDITA + FLAGS "D" +END + +LIST A_INVIO 1 15 +BEGIN + PROMPT 1 10 "Da inviare" + ITEM "X|X, Da Inviare" + ITEM "I|I, Inviato" + ITEM "N|N, Disabilitato" + ITEM "F|F, Forzato" + ITEM "E|E, Errato" + FIELD INVIO +END + +BOOLEAN A_FORZATA +BEGIN + PROMPT 30 10 "Forzatura manuale" + FIELD FORZATURA +END + +NUMBER A_NUMERO 10 +BEGIN + PROMPT 1 0 "N.Movimento" + FLAGS "D" + FIELD PROGR +END + +DATE A_DATAREG +BEGIN + PROMPT 26 0 "Data reg." + FIELD DATAREG + CHEKTYPE REQUIRED +END + +LIST A_TIPOCF 1 10 +BEGIN + PROMPT 1 1 "Tipo C/F " + ITEM "C|Cliente" + ITEM "F|Fornitore" + FIELD TIPOCF + FLAGS "D" +END + +NUMBER A_CODCF 6 +BEGIN + PROMPT 26 1 "Cod. C/F" + USE LF_CLIFO + INPUT TIPOCF A_TIPOCF SELECT + INPUT CODCF A_CODCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Occasionale@C" OCCAS + DISPLAY "Partita IVA" PAIV + DISPLAY "Codice fiscale@16" COFI + OUTPUT A_CODCF CODCF + OUTPUT A_RAGSOC RAGSOC + OUTPUT A_PAIV PAIV + OUTPUT A_COFI COFI + ADD RUN cg0 -1 + FIELD CODCF +END + +STRING A_OCFPI 16 +BEGIN + PROMPT 44 1 "Occas." + USE LF_OCCAS + INPUT CFPI A_OCFPI + DISPLAY "Codice@16" CFPI + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Partita IVA" PAIV + DISPLAY "Codice fiscale@16" COFI + OUTPUT A_OCFPI CFPI + OUTPUT A_RAGSOC RAGSOC + OUTPUT A_PAIV PAIV + OUTPUT A_COFI COFI + CHEKTYPE NORMAL + GROUP 3 + ADD RUN cg0 -6 + FIELD OCFPI +END + +STRING A_RAGSOC 50 47 +BEGIN + FIELD RAGSOC + PROMPT 1 2 "Ragione Sociale" + FLAGS "D" +END + +STRING A_RFSO 6 +BEGIN + FIELD RFSO + PROMPT 1 4 "Codice RF/SO: " + HELP "Codice Rappresentante Fiscale o Stabile Organizzazione" + FLAGS "D" +END + +STRING A_RAGSOCRFSO 50 47 +BEGIN + FIELD RAGSOCRFSO + PROMPT 1 5 "Rag. Soc. RF/SO" + HELP "Ragione Sociale RF/SO" + FLAGS "D" +END + +STRING A_TIPODOC 2 +BEGIN + PROMPT 23 6 "Tipo doc. " + FIELD TIPODOC + USE %TPD + INPUT CODTAB A_TIPODOC + DISPLAY "Tipo " CODTAB + DISPLAY "Descrizione @50" S0 + OUTPUT A_TIPODOC CODTAB + WARNING "Tipo documento errato" + CHECKTYPE REQUIRED + FLAGS "HUD" + ADD NONE +END + +LIST A_TIPODOCAE 6 +BEGIN + PROMPT 23 6 "Tipo doc. " + ITEM "TD01|TD01" + ITEM "TD04|TD04" + ITEM "TD05|TD05" + ITEM "TD07|TD07" + ITEM "TD08|TD08" + ITEM "TD10|TD10" + ITEM "TD11|TD11" + ITEM "ERR0|Errore" +END + +STRING A_NUMDOC 7 +BEGIN + PROMPT 42 6 "Num. doc. " + FLAGS "U" + FIELD NUMDOC + CHEKTYPE REQUIRED +END + +DATE A_DATADOC +BEGIN + PROMPT 1 6 "Data doc." + FIELD DATADOC + CHEKTYPE REQUIRED +END + +LIST A_NATURA 1 35 +BEGIN + PROMPT 20 7 "Natura IVA" + ITEM "|IVA ordinaria" + ITEM "N1|N1 - IVA esclusa ex art 15" + ITEM "N2|N2 - IVA non soggetta" + ITEM "N3|N3 - IVA non imponibile" + ITEM "N4|N4 - IVA esente" + ITEM "N5|N5 - IVA in regime del margine" + ITEM "N6|N6 - IVA in reverse charge" + ITEM "N7|N7 - IVA assolta in altro stato U3" +END + +STRING A_ALIQUOTA 4 +BEGIN + PROMPT 1 7 "Aliquota " + HELP "Codice aliquota" + FIELD CODTAB + KEY 1 + USE %IVA + FLAGS "U" + INPUT CODTAB A_ALIQUOTA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo" S1 + DISPLAY "%@5" R0 + DISPLAY "Vent." S6 + DISPLAY "Sospeso" B2 + OUTPUT A_ALIQUOTA CODTAB + CHECKTYPE REQUIRED + VALIDATE ZEROFILL_FUNC 2 +END + +STRING A_DETRAIB 6 +BEGIN + PROMPT 1 8 "% Detraibilita'" + HELP "Percentuale di detraibilita'" + FLAGS "D" +END + +NUMBER A_IMPONIBILE 12 2 +BEGIN + PROMPT 42 8 "Imponibile" +END + +NUMBER A_IMPOSTA 12 2 +BEGIN + PROMPT 42 9 "Imposta " +END + +BOOLEAN A_REVERSE +BEGIN + PROMPT 1 9 "Reverse charge" +END + +BOOLEAN A_AUTOFATT +BEGIN + PROMPT 25 9 "Autofattura" + FLAGS "D" +END + +STRING A_PAIV 12 +BEGIN + PROMPT 1 3 "Partita IVA " + FLAGS "D" +END + +STRING A_COFI 16 +BEGIN + PROMPT 33 3 "Codice Fiscale" + FLAGS "D" +END + +STRING A_CODERR 10 +BEGIN + PROMPT 0 13 "Codici errori" + //FLAGS "D" +END + +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_USER 2 2 +BEGIN + PROMPT 2 1 "Collega" + PICTURE TOOL_LINK +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 2 1 "Elimina" + PICTURE TOOL_DELREC +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 4 1 "" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/src/fp/fp0200b.h b/src/fp/fp0200b.h new file mode 100644 index 000000000..67694070f --- /dev/null +++ b/src/fp/fp0200b.h @@ -0,0 +1,308 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // dongle() +#include // Oracle Recset +#include +#include +#include // std::map + +#include "../ve/velib05.h" +#include "../cg/cglib03.h" +#include "../fe/felib.h" + +#include "fp0200a.h" +#include "../tf/tfutility.h" +#include + +#ifdef DISABLED +///////////////////////////////////////////////////////////////////////////////////// +// Globals +///////////////////////////////////////////////////////////////////////////////////// + +enum return_code +{ + found, // Trovato + foundcust, // Trovato in trasfatt + foundidcust,// Trovato ma con id customizzato + nextmov, // Trovato ma cambiato movimento + eof, // EOF rmoviva + eofcust, // EOF trasfatt + after // File mov su un movimento dopo rispetto a rmoviva +}; + +// Su DB: X o ''->Da inviare, F->Forzato, I->Inviato, N->Non inviare +enum filter_fatt +{ + toSend, // "", "X", "F", "E" + sent, // "I" + untouched, // "", "X" + forced, // "F" + disabled, // "N" + err, // "E" + all // Nessun controllo +}; + +#define SHEET_GAP 101 +#define DTE_PROVV "DTE0000001" +#define DTR_PROVV "DTR0000001" +#define TOLLARANZA 0.05 +// Flag invio +#define FLAG_INVIO "X" +#define FLAG_ERRORE "E" +#define FLAG_NINVIO "N" +#define FLAG_FORZATO "F" +#define FLAG_INVIATO "I" +#define SPESOMETROBASE "ModuliSirio" +#define REG_ATT 1 +#define REG_PAS 2 +#define CARATTERI_SPECIALI "àèéìòù°" + +/* Così facendo basta modificare la maschera (e le dichiarazioni di conseguenza) + * per avere l'inserimento nello sheet corretto */ +enum spesometroFields{ + _spedita = A_SPEDITA - SHEET_GAP, + _invio = A_INVIO - SHEET_GAP, + _forzata = A_FORZATA - SHEET_GAP, + _numero = A_NUMERO - SHEET_GAP, + _datareg = A_DATAREG - SHEET_GAP, + _tipocf = A_TIPOCF - SHEET_GAP, + _codcf = A_CODCF - SHEET_GAP, + _occas = A_OCFPI - SHEET_GAP, + _ragsoc = A_RAGSOC - SHEET_GAP, + _rfso = A_RFSO - SHEET_GAP, + _ragsocrfso = A_RAGSOCRFSO - SHEET_GAP, + _codnum = A_TIPODOC - SHEET_GAP, + _codnumAE = A_TIPODOCAE - SHEET_GAP, + _numdoc = A_NUMDOC - SHEET_GAP, + _datadoc = A_DATADOC - SHEET_GAP, + _natura = A_NATURA - SHEET_GAP, + _aliquota = A_ALIQUOTA - SHEET_GAP, + _detraibile = A_DETRAIB - SHEET_GAP, + _imponibile = A_IMPONIBILE - SHEET_GAP, + _importoIVA = A_IMPOSTA - SHEET_GAP, // Imposta è già preso + _reverse = A_REVERSE - SHEET_GAP, + _autofatt = A_AUTOFATT - SHEET_GAP, + _paiv = A_PAIV - SHEET_GAP, + _codfis = A_COFI - SHEET_GAP, + _coderr = A_CODERR - SHEET_GAP +}; + +///////////////////////////////////////////////////////////////////////////////////// +// Utilities +///////////////////////////////////////////////////////////////////////////////////// + +// Da un id ritorna il tipo doc corrispondente +TString getTipoDoc(int id); +int getTipoDoc(TString id); + +// Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h) +static SLIST_ELT xvt_slist_find_str(SLIST list, const char* str); +// Aggiorna il file dst se più vecchio di src (Potrebbe diventare una funzione di XVT.h) +bool xvt_fsys_fupdate(const char* src, const char* dst); +// Decodifica il tipo di documento per il trasferimento fatture +const char * decodTipo(TToken_string* strarr); +// Salvo un singolo record +//bool saveRec(TToken_string row, bool esportato = false); +// Ritorno una data in formato ANSI +inline TDate toDate(const char * date) { return TDate(date).string(); } +// Salto se la riga non è abilitata +#define IF_IS_ENABLED(strarr) if(strcmp(strarr->get(_invio), FLAG_INVIO) != 0 && strcmp(strarr->get(_invio), FLAG_FORZATO) != 0 && strcmp(strarr->get(_invio), FLAG_INVIATO) != 0) continue; +// Ritorno il carattere senza accento maiuscolo +inline const char * noSpecial(char a); +// Ritorno se è ancora valida la bolla doganale senza informazioni fornitore +bool bd2017(); + + +///////////////////////////////////////////////////////////////////////////////////// +// TFp_record +///////////////////////////////////////////////////////////////////////////////////// + +// Connessione a db +SSimple_query& db() +{ + SSimple_query * _db = nullptr; + if (_db == nullptr) + _db = new SSimple_query(); + return *_db; +} + +// Contenitore di campi di un record di database MSSQL +class TFp_record : public TObject +{ + TString8 _table; + TToken_string _key; + TAssoc_array _fields; + +protected: + void copy(const TFp_record& rec) { _table = rec._table; _key = rec._key; _fields = rec._fields; } + const TString& var2str(const TString& fld, const TVariant& var) const; + +public: + void reset() { _fields.destroy(); } + void set(const char* fld, const TVariant& var); + void set(const char* fld, long var); + void set(const char* fld, const char* var); + void set(const char* fld, const real& var); + void set(const char* fld, const TString& var); + void set(const char* fld, const TDate& var); + void set(const char* fld, bool var); + const TVariant& get(const char* fld) const; + + bool insert(); + bool remove(); + bool search(); + bool search(const char* k1, const char* k2 = NULL, const char* k3 = NULL); + + virtual TObject* dup() const { return new TFp_record(*this); } + virtual bool ok() const { return _table.not_empty(); } + + TFp_record& operator=(const TFp_record& rec) { copy(rec); return *this; } + TFp_record(const TFp_record& rec) { copy(rec); } + TFp_record(const char* table); +}; + +///////////////////////////////////////////////////////////////////////////////////// +// TFp_cursors +///////////////////////////////////////////////////////////////////////////////////// + +/* + * Classe per la gestione di RMOVIVA, MOV, TFCUST + */ +class TFp_cursors : TObject +{ + friend class TCursor; + TISAM_recordset* c_rmoviva; + TISAM_recordset* c_trasfatt; + bool _newMov; + bool _newCust; + // Se trovo un record custom devo saltare tutti quelli che trovo successivamente, per fare ciò utilizzo una TToken_string + TToken_string _alqCust; + + TRectype _next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento + TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom + bool checkEnabled(TISAM_recordset* origCur); +public: + //TFp_cursors(); + ~TFp_cursors(); + long int getIvaItems() { return c_rmoviva->items(); } + long int getIvaPos() { return c_rmoviva->cursor()->pos(); } + TRectype getIva() { return c_rmoviva->cursor()->curr(); } + int next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf, TString& ocfpi); // Legge tutto il prossimo movimento, in importi mette per ogni codiva la somma + + int updateFilters(const char tipocf, const long codcf, TDate dal, TDate al, int cod = toSend); +}; + +///////////////////////////////////////////////////////////////////////////////////// +// TFp_mask +///////////////////////////////////////////////////////////////////////////////////// + +class TFp_mask : public TAutomask +{ + friend class TFp_cursors; + + TMaskmode _mode; + bool _sheet_dirty; + bool _filter_changed; + +protected: + virtual void next_page(int p); + TRecnotype nuovo_progr() const; + void changeInvio(TString tipocf, TString codcf, TString numdoc, TString invio) const; + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void openJava(); + +public: + void setFilterChanged() { _filter_changed = true; } + void load_sheet(); + TFp_mask(TString msk); + ~TFp_mask(); + // Carico i tipi documento all'inizio + void loadConfig(); + // Salvo i tipi documento + void saveConfig(); + // Salvo tutti i records + bool saveAll(); + // Controllo tutti i records + bool checkAll(); + // Testo validità record + bool checkRec(TPrinter* stampa, TToken_string* rec); + // Controllo che siano presenti records + bool checkNotEmpty(); + // Controllo finale prima di inviare il tutto, se ci sono fatture + // con più volte lo stesso codice aliquota disabilito il precedente + void theFinalCheckDown(); + // Mette il flag di invio = [flag] per la riga numero [nrow] + void flagRow(int nrow, TString flag); + // Salto se la riga ha un tipo invio non del filtro + bool checkInvio(const TString& invio); +}; + +// Funzione inline di stampa +inline void printError(TPrinter* stampa, TString movimento, TString documento, TString msgerr); +TFp_mask& msk(); + +///////////////////////////////////////////////////////////////////////////////////// +// TFp_app +///////////////////////////////////////////////////////////////////////////////////// + +struct clifoDoc +{ + long contCliFo; + long countDoc; + std::map docID; +}; + +class TFp_app : public TSkeleton_application +{ + TAnagrafica _ditta; + TString16 _cofi; + TFilename _dbname; + TLog_report* _log; + TString _logTFF; + bool _append; + TString myrfso; + static long header; + // Solitamente nei programmi di campo cerco di sfruttare le classi interne ma per mancanza di tempo sono costretto a usare l'std::vector + std::map mCliDoc; + +private: + int parse_line(const TString& line, TString& var, TString& val) const; + bool create_table(TScanner& TFF, const TString& table); + TString getKey(TToken_string* strarr); + TString getHeader(TToken_string* strarr); + TString getBody(TToken_string* strarr, bool add = true); + bool tff0100(TSheet_field& sheet); // Header esportazione + bool tff0200(TString key); // Anagrafica ditta + bool tff0300(TString key, TRectype r_ana); // Rappresentante fiscale ditta + bool tff0400(TSheet_field& sheet); // Anagrafica clifo + bool tff0700(TSheet_field& sheet); // Testata documento + bool tff2200(TToken_string* strarr, int nriga); // Riepilogo aliquote + bool tff3100(TToken_string* strarr, TRectype r_ana); // Rappresentante fiscale clifo + bool setEsportato(TSheet_field& sheet); + bool emptyTables(TString key); // Cancella da tutte le tabelle i record con chiave key + +protected: + void log(int severity, const char* msg); + bool show_log(); + bool syncronizeDB(); + bool verifyDB(const bool create); + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + bool send(TFp_mask* msk); + + TFp_app() : _log(NULL) {} +}; + +#endif \ No newline at end of file diff --git a/src/fp/fp0300.cpp b/src/fp/fp0300.cpp new file mode 100644 index 000000000..491c0b56b --- /dev/null +++ b/src/fp/fp0300.cpp @@ -0,0 +1,1849 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../ve/velib05.h" +#include "../cg/cglib03.h" + +#include "fp0.h" +#include "fp0300a.h" + +#include "../fe/felib.h" +#include "fplib01.h" + +#include +#include +#include +#include +#include +#include +#include "../cg/cfban.h" + + +///////////////////////////////////////////////////////////////////////////////////// +// Globals +///////////////////////////////////////////////////////////////////////////////////// + +#define LEN_HFATT 20 +#define LEN_BFATT 50 + +#define FLD_TIPO_SDI "S3[37,40]" + +///////////////////////////////////////////////////////////////////////////////////// +// Utilities +///////////////////////////////////////////////////////////////////////////////////// + +/* + * HFATT: tipocf(1) + codcf(6) + * BFATT: datadoc(8) + tipodoc_SDI(4) + numdoc(7) + */ + +// Crea la coppia di chiavi per il db PAF a partire da un documento vero e proprio +static bool chiave_paf(const TDocumento& doc, TString& hfatt, TString& bfatt) +{ + hfatt.cut(0); + if (doc.clifor().occasionale()) + hfatt << "O" << doc.get("OCFPI"); + else + hfatt << doc.clifor().tipo() << doc.clifor().codice(); + CHECK(hfatt.full(), "Destinatario fattura P.A. non valido"); + + const TCodice_numerazione& codnum = doc.codice_numerazione(); + const long ndoc = doc.numero(); + TString16 fullnumdoc; + codnum.complete_num(ndoc, fullnumdoc); + + bfatt.cut(0) << doc.get_date(DOC_DATADOC).date2ansi() << '/' << doc.tipo().tipo_doc_sdi() << '/' << fullnumdoc; + return hfatt.full() && bfatt.full(); +} + +// Crea la coppia di chiavi per il db PAF a partire da un semplice record di testata documento +static bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt) +{ + TDocumento d(doc); + chiave_paf(d, hfatt, bfatt); + return hfatt.full(); +} + +// Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h) +static SLIST_ELT xvt_slist_find_str(SLIST list, const char* str) +{ + SLIST_ELT e = NULL; + for (e = xvt_slist_get_first(list); e; e = xvt_slist_get_next(list, e)) + { + const char* val = xvt_slist_get(list, e, NULL); + if (xvt_str_compare_ignoring_case(str, val) == 0) + break; + } + return e; +} + +// Aggiorna il file dst se più vecchio di src (Potrebbe diventare una funzione di XVT.h) +bool xvt_fsys_fupdate(const char* src, const char* dst) +{ + bool ok = false; + if (xvt_fsys_file_exists(src)) + { + const long tsrc = xvt_fsys_file_attr(src, XVT_FILE_ATTR_MTIME); + if (tsrc > 0) + { + long tdst = 0; + if (xvt_fsys_file_exists(dst)) + tdst = xvt_fsys_file_attr(dst, XVT_FILE_ATTR_MTIME); + if (tsrc > tdst) + ok = xvt_fsys_fcopy(src, dst) != 0; + } + } + + return ok; +} + +///////////////////////////////////////////////////////////////////////////////////// +// TAncestor +///////////////////////////////////////////////////////////////////////////////////// + +struct TAncestor : public TObject +{ + TString20 _numdoc; + TDate _datadoc; + + TAncestor(const TRectype& rdoc); +}; + +TAncestor::TAncestor(const TRectype& rdoc) +{ + const int anno = rdoc.get_int(RDOC_ANNO); + const TString4 codnum = rdoc.get(RDOC_CODNUM); + const long ndoc = rdoc.get_long(RDOC_NDOC); + const TCodice_numerazione& num = cached_numerazione(codnum); + + TToken_string kdoc; + kdoc = rdoc.get(RDOC_PROVV); + kdoc.add(anno); + kdoc.add(codnum); + kdoc.add(ndoc); + const TRectype& doc = cache().get(LF_DOC, kdoc); + + TString16 numdoc; + num.complete_num(ndoc, numdoc); + _numdoc.format("%d/%s/%s", anno, (const char*)codnum, (const char*)numdoc); + _datadoc = doc.get_date(DOC_DATADOC); +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TPaf_record +///////////////////////////////////////////////////////////////////////////////////// + +// Contenitore di campi di un record di database SQLite +class TPaf_record : public TObject +{ + TString8 _table; + TToken_string _key; + TAssoc_array _fields; + +protected: + void copy(const TPaf_record& rec) + { + _table = rec._table; + _key = rec._key; + _fields = rec._fields; + } + + const TString& var2str(const TString& fld, const TVariant& var) const; + +public: + void reset() { _fields.destroy(); } + void set(const char* fld, const TVariant& var); + void set(const char* fld, long var); + void set(const char* fld, const char* var); + void set(const char* fld, const real& var); + void set(const char* fld, const TString& var); + void set(const char* fld, const TDate& var); + void set(const char* fld, bool var); + const TVariant& get(const char* fld) const; + + bool insert(); + bool remove(); + bool search(); + bool search(const char* k1, const char* k2, const char* k3 = NULL); + + virtual TObject* dup() const { return new TPaf_record(*this); } + virtual bool ok() const { return _table.not_empty(); } + + TPaf_record& operator=(const TPaf_record& rec) + { + copy(rec); + return *this; + } + + TPaf_record(const TPaf_record& rec) { copy(rec); } + TPaf_record(const char* table); +}; + +// Imposta il valore di un campo variant +void TPaf_record::set(const char* fld, const TVariant& var) +{ + CHECK(fld && *fld, "Null field name"); + + if (var.is_null()) + { + _fields.remove(fld); + } + else + { + TVariant* obj = (TVariant*)_fields.objptr(fld); + if (obj != NULL) + *obj = var; + else + _fields.add(fld, new TVariant(var)); + } +} + +// Imposta il valore di un campo intero +void TPaf_record::set(const char* fld, long val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo stringa +void TPaf_record::set(const char* fld, const char* val) +{ + if (val == NULL) + set(fld, NULL_VARIANT); + else + { + const TVariant var(val); + set(fld, var); + } +} + +// Imposta il valore di un campo stringa +void TPaf_record::set(const char* fld, const TString& val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo numerico +void TPaf_record::set(const char* fld, const real& val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo data in formato ISO +void TPaf_record::set(const char* fld, const TDate& val) +{ + if (val.ok()) + { + const TVariant var(val); + set(fld, var); + } + else + set(fld, ""); +} + +// Imposta il valore di un campo booleano +void TPaf_record::set(const char* fld, bool var) +{ + set(fld, var ? "SI" : "NO"); +} + +// Legge il valore di un campo variant +const TVariant& TPaf_record::get(const char* fld) const +{ + const TVariant* var = (const TVariant*)_fields.objptr(fld); + return var ? *var : NULL_VARIANT; +} + +// Converte un variant in una stringa valida per SQLite +const TString& TPaf_record::var2str(const TString& fldname, const TVariant& var) const +{ + const TFieldtypes vt = var.type(); + if (vt == _realfld) + { + const TCurrency v(var.as_real(), "", ZERO, fldname.find("PRZ") > 0 || fldname.find("PREZZO") > 0); + TString& tmp = get_tmp_string(); + tmp << '\'' << v.string() << '\''; + tmp.replace(',', '.'); + return tmp; + } + if (vt == _datefld) + { + TString& tmp = get_tmp_string(); + tmp << '\'' << var.as_date().string(full, '-', full, full, amg_date) << '\''; + return tmp; + } + + const TString& str = var.as_string(); + + bool apici = vt == _alfafld; + if (apici && str[0] != '0' && real::is_natural(str)) + apici = false; + + if (!apici) + return str; + + TString& tmp = get_tmp_string(); + tmp = str; + for (int a = str.rfind('\''); a >= 0; a--) + { + if (tmp[a] == '\'') + tmp.insert("'", a); + } + tmp.insert("'", 0); + tmp << '\''; + return tmp; +} + +// Elimina il record in base ai campi chiave +bool TPaf_record::remove() +{ + TString256 query; + query << "DELETE FROM " << _table << " WHERE "; + int nkf = 0; + FOR_EACH_TOKEN(_key, fld) + { + const TVariant& var = get(fld); + if (!var.is_null()) + { + if (nkf++ > 0) + query << " AND "; + query << fld << '=' << var2str(fld, var); + } + } + CHECKS(nkf >= 2, "Can't remove partial key on table ", (const char*)_table); + query << ';'; + return db().sq_set_exec(query); +} + +// Carica un record in base ai campi chiave +bool TPaf_record::search() +{ + CHECKS(_fields.items() > 0, "Can't search with empty key on table ", static_cast(_table)); + TString256 query; + query << "SELECT * FROM " << _table << " WHERE "; + FOR_EACH_TOKEN(_key, fld) + { + const TVariant& var = get(fld); + if (!var.is_null()) + query << fld << '=' << var2str(fld, var) << " AND "; + } + query.rtrim(5); + query << ';'; + + // return xvt_sql_execute(_db, query, paf_search_record, this) == 1; + // TODO: Valutare + return db().sq_set_exec(query); +} + +// Carica un record in base ad un massimo di 3 campi chiave +bool TPaf_record::search(const char* k1, const char* k2, const char* k3) +{ + _fields.destroy(); + + set(_key.get(0), k1); + set(_key.get(1), k2); + if (k3 && *k3) + set(_key.get(2), k3); + + return search(); +} + +// Aggiunge un record al db +bool TPaf_record::insert() +{ + CHECKS(_fields.items() > _key.items(), "Can't insert empty record on table ", _table); + + TString query, values; + query << "INSERT INTO " << _table << "\n("; + FOR_EACH_ASSOC_OBJECT(_fields, obj, fld, itm) + { + const TVariant& var = get(fld); + if (!var.is_null()) + { + query << fld << ','; + values << var2str(fld, var) << ','; + } + } + query.rtrim(1); + values.rtrim(1); + query << ")\nVALUES (" << values << ");"; + return db().sq_set_exec(query); +} + +// Crea un record della tabella data ed imposta i nomi dei campi chiave +TPaf_record::TPaf_record(const char* table) : _table(table), _key(15, ',') +{ + TString q; + q << "SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = '" << table << + "' ORDER BY ORDINAL_POSITION"; + for (bool ok = db().sq_set_exec(q); ok; ok = db().sq_next()) + { + _key.add(db().sq_get("COLUMN_NAME")); + } + CHECKS(!_key.empty_items(), "Invalid primary key for table ", table); +} + +///////////////////////////////////////////////////////////////////////////////////// +// TPa_mask +///////////////////////////////////////////////////////////////////////////////////// + +class TPA_mask : public TAutomask +{ +protected: + void setFilterChanged(); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void next_page(int p); + bool checkNotEmpty(); + + void fill(); + void init(); + bool is_fattura(const TRectype& doc) const; + + bool _filter_changed; + +public: + TPA_mask() : TAutomask("fp0300a"), _filter_changed(true) + { + } +}; + +bool TPA_mask::is_fattura(const TRectype& doc) const +{ + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + if (!td.is_fattura()) // Tengo per buone solo le fatture e le note di credito + return false; + + const TCodice_numerazione& cn = cached_numerazione(doc.get(DOC_CODNUM)); + return cn.tipo() == 2 && !cn.get_bool("B10"); // Controlla se fattura provvisioria esclusa da P.A. +} + + +void TPA_mask::fill() +{ + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + docs.hide(); + + sht.destroy(); + + const TDate dal = get(F_DATAINI); + const char filter_selected = get(F_FATTSEL)[0]; + + // Record di controllo per eventuali elaborazioni precedenti + TString hfatt(LEN_HFATT), bfatt(LEN_BFATT); + TPaf_record paf0100f("PAF0100F"); + + TString query; + + query << "USE 33 " << + "SELECT (BETWEEN(33.DATADOC,#DADATADOC,#ADATADOC))&&(33.TIPOCF=='C')&&(17.PADESTIN!='')&&(400@." FLD_TIPO_SDI "!='')"; + if(get(F_DATIPODOC).full() && get(F_ATIPODOC).full()) + { + query << "&&(BETWEEN(33.TIPODOC, #DATIPODOC, #ATIPODOC))"; + } + else if(get(F_DATIPODOC).full()) + { + query << "&&(33.TIPODOC>=#DATIPODOC)"; + } + else if (get(F_ATIPODOC).full()) + { + query << "&&(33.TIPODOC<=#ATIPODOC)"; + } + query << "\nJOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << + "JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << + "JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC"; + + TISAM_recordset rec(query); + if (get(F_DATIPODOC).full()) + rec.set_var("#DATIPODOC", get(F_DATIPODOC)); + if (get(F_ATIPODOC).full()) + rec.set_var("#ATIPODOC", get(F_ATIPODOC)); + + rec.set_var("#DADATADOC", get_date(F_DATAINI)); + rec.set_var("#ADATADOC", get_date(F_DATAEND)); + + TProgress_monitor pi(rec.items(), NULL); + + for (bool okc = rec.move_first(); okc; okc = rec.move_next()) + { + if (!pi.add_status()) + break; + const TRectype& doc = rec.cursor()->curr(); + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + + bool sent = false; + if (chiave_paf(doc, hfatt, bfatt)) + { + if (paf0100f.search(NULL, hfatt, bfatt)) + { + if (filter_selected && paf0100f.get("P1_GESTIONE").as_string()[0] != filter_selected) + continue; + } + } + + TToken_string* row = new TToken_string; + *row = sent ? " " : "X"; + row->add(rec.get(DOC_ANNO).as_int(), 1); + row->add(rec.get(DOC_CODNUM).as_string()); + row->add(rec.get(DOC_TIPODOC).as_string()); + row->add(rec.get("400.S3").as_string().mid(37,4)); + row->add(rec.get(DOC_NDOC).as_int()); + row->add(rec.get(DOC_DATADOC).as_date()); + row->add(rec.get(CFV_CODCF).as_int()); + row->add(rec.get("20." CLI_RAGSOC).as_string()); + row->add(rec.get(CFV_PADESTIN).as_string()); + row->add(rec.get(CFV_PARIFAMM).as_string()); + row->add(rec.get("20." CLI_COFI).as_string()); + row->add(!td.invio_xml() ? "X" : ""); + + bool split = rec.get("20." CLI_SPLITPAY).as_bool(); + if (split) + { + const long numreg = rec.get(DOC_NUMREG).as_int(); + if (numreg > 0) + { + const TRectype& mov = cache().get(LF_MOV, numreg); + split = is_split_payment(mov); + } + } + row->add(split ? "X" : " "); + + const bool attach = !rec.get("COLL_GOLEM").is_empty(); + row->add(attach ? "X" : " "); + + sht.add(row); + } + + docs.force_update(); + docs.show(); +} + +void TPA_mask::setFilterChanged() +{ + _filter_changed = true; +} + +bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_RECALC: + if (e == fe_button) + next_page(1); + break; + case F_DATAINI: + if (e == fe_init) + o.set(ini_get_string(CONFIG_DITTA, "fp", "LastXML", "01-01-2018")); + else if (e == fe_close) + ini_set_string(CONFIG_DITTA, "fp", "LastXML", o.get()); + break; + case F_DATAEND: + if (e == fe_init) + o.set(TDate(TODAY)); + case F_DOCS: + if (e == se_query_add || e == se_query_del) + return false; + break; + case DLG_USER: + if (e == fe_button && jolly > 0) + { + TSheet_field& docs = sfield(F_DOCS); + TToken_string& row = docs.row(docs.selected()); + TRectype doc(LF_DOC); + doc.put(DOC_PROVV, 'D'); + doc.put(DOC_ANNO, row.get(1)); + doc.put(DOC_CODNUM, row.get(2)); + doc.put(DOC_TIPODOC, row.get(3)); + doc.put(DOC_NDOC, row.get(5)); + if (doc.edit()) + fill(); + } + break; + case DLG_ALL: + { + if (e == fe_button) + { + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + const int items = sht.items(); + + if (items > 0) + { + const TString4 select = *(sht.row(0).get(0)) == 'X' ? "" : "X"; + for (int i = 0; i < items; i++) + sht.row(i).add(select, 0); + docs.force_update(); + } + } + } + break; + default: break; + } + if (e == fe_modify && jolly == 0) + { + if (o.dlg() >= START_MASK && o.dlg() <= END_MASK) + { + setFilterChanged(); + } + } + return true; +} + +void TPA_mask::next_page(int p) +{ + TAutomask::next_page(p); + if (_filter_changed) + { + TSheet_field& sf = sfield(F_DOCS); + if (curr_win() == sf.parent()) + { + fill(); + sf.force_update(); + _filter_changed = false; + } + } +} + +bool TPA_mask::checkNotEmpty() +{ + TSheet_field& sheet = sfield(F_DOCS); + TString msg; + + if (sheet.empty()) + msg = "La tabella dei movimenti è vuota, vuoi caricarla con i filtri selezionati?"; + else if (_filter_changed) + msg = "I filtri sono stati cambiati, vuoi ricaricare la tabella con i nuovi filtri selezionati?"; + + if (msg.full() && yesno_box(msg)) + { + next_page(1); + } + return sheet.full(); +} + +///////////////////////////////////////////////////////////////////////////////////// +// TDoc2Paf +///////////////////////////////////////////////////////////////////////////////////// + +class TDoc2Paf : public TSkeleton_application +{ + TAnagrafica _ditta; + TString16 _cofi; + TFilename _dbname; + TLog_report* _log; + TString _logpaf; + TString _def_fld; + TString _def_usr_fld; + +private: + int parse_line(const TString& line, TString& var, TString& val) const; + bool create_table(TScanner& paf, const TString& table); + + const TRectype* find_parent_row(const TRectype& rdoc) const; + int find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) const; + +protected: + bool parse_sconto(const TString& formula, TToken_string& sconti) const; + bool get_bnp_iban(const TString& abi, const TString& cab, int prg, TString& iban) const; + bool get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, + TString& istituto) const; + const char* descrizione(const TRiga_documento& rdoc) const; + const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta + + void log(int severity, const char* msg); + bool show_log(); + const char* natura(const TString& codiva) const; + static void set_IVA(const TString& codiva, TPaf_record& paf); + static void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf); + static void add_row_art(const TString codice_tipo, const TString& codice_valore, TPaf_record& paf); + + + bool elabora(TDocumentoEsteso& doc); + bool elabora(const TRectype& rec); + bool elabora(const TDoc_key& key); + bool elabora(const TFilename& ini); + //bool genera_xml(); + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + + TDoc2Paf() : _log(NULL) + { + } +}; + +bool TDoc2Paf::parse_sconto(const TString& formula, TToken_string& sconti) const +{ + sconti.cut(0); + int start = 0; + for (int i = 0; ; i++) + { + const char c = formula[i]; + if (c == '+' || c == '-' || c < ' ') + { + if (i > 0) + { + TString8 tok = formula.sub(start, i); + tok.replace(',', '.'); + const real perc = tok; + if (!perc.is_zero()) + sconti.add(tok); + } + if (c < ' ') + break; + start = i; + } + } + return sconti.full(); +} + +bool TDoc2Paf::get_bnp_iban(const TString& abi, const TString& cab, int nprog, TString& iban) const +{ + TTable bnp("BNP"); + TString16 key; + key << abi << cab; + if (nprog > 0) + { + TString4 sprog; + sprog.format("%02d", nprog); + key << sprog; + } + bnp.put("CODTAB", key); + int err = bnp.read(_isgteq); + if (err == NOERR && !bnp.get("CODTAB").starts_with(abi)) + err = _iskeynotfound; + if (err == NOERR) + iban = bnp.get("S3"); + + return err == NOERR; +} + +bool TDoc2Paf::get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const +{ + bool found = false; + abi = doc.get(DOC_CODABIP); + cab = doc.get(DOC_CODCABP); + int prg = doc.get_int(DOC_PROGBNP); + + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, prg, iban); + + if (!found) // Se non trovo banca sul DOC la cerco su CFBAN + { + TToken_string key; + key.add("C"); + key.add(doc.codcf()); + key.add("N"); + key.add(1); + const TRectype& cfban = cache().get(LF_CFBAN, key); + if (!cfban.empty()) + { + abi = cfban.get(CFBAN_ABI); + cab = cfban.get(CFBAN_CAB); + prg = cfban.get_int(CFBAN_PROGPR); + found = abi.full() && cab.full(); + iban = cfban.get(CFBAN_IBAN); + if (found && iban.blank()) + get_bnp_iban(abi, cab, prg, iban); + } + } + + if (!found) // Se non trovo banca su CFBAN la cerco su CFVEN + { + const TRectype& cfven = doc.clifor().vendite(); + abi = cfven.get(CFV_CODABIPR); + cab = cfven.get(CFV_CODCABPR); + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, 0, iban); + } + + if (found) + istituto = cache().get("%BAN", abi, "S0"); + + return found; +} + +const char* TDoc2Paf::descrizione(const TRiga_documento& rdoc) const +{ + if (rdoc.get_bool(RDOC_DESCLUNGA)) + { + TString tmp; + tmp << rdoc.get(RDOC_DESCR) << rdoc.get(RDOC_DESCEST); + tmp.replace('\n', ' '); + tmp.strip_double_spaces(); + tmp.trim(); + TParagraph_string para(tmp, 100); + return para.get(0); + } + return rdoc.get(RDOC_DESCR); +} + +const TRectype* TDoc2Paf::find_parent_row(const TRectype& rdoc) const +{ + const long id = rdoc.get_long(RDOC_DAIDRIGA); + if (id > 0L) + { + TToken_string key; + key.add(rdoc.get(RDOC_DACODNUM)); + if (key.full()) + { + key.add(rdoc.get(RDOC_DAANNO)); + key.add(rdoc.get(RDOC_DAPROVV)); + key.add(rdoc.get(RDOC_DANDOC)); + for (int r = 0; ; r++) + { + if (r == 0) + key.add(id, 4); + else + key.add(r, 4); + const TRectype& rec = cache().get(LF_RIGHEDOC, key); + if (r > 0 && rec.empty()) + break; + if (rec.get_long(RDOC_IDRIGA) == id) + return &rec; + } + } + } + return NULL; +} + +int TDoc2Paf::find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) const +{ + if (rdoc.is_articolo()) + { + for (const TRectype* prdoc = find_parent_row(rdoc); prdoc != NULL; prdoc = find_parent_row(*prdoc)) + { + const TCodice_numerazione& cn = cached_numerazione(prdoc->get(RDOC_CODNUM)); + const int td = cn.tipo(); + if (td > 0 && ancestors.objptr(td) == NULL) + ancestors.add(new TAncestor(*prdoc), td); + } + } + return ancestors.items(); +} + +const TRectype& TDoc2Paf::cco(const TRectype& doc) const +{ + TString80 conkey; + const TString& con = doc.get(DOC_CONTRATTO); + if (con.full()) + { + char tcon = doc.get_char(DOC_MODPAG); + if (tcon < 'C') tcon = 'C'; + conkey.format("%c%6ld%s", tcon, doc.get_long(DOC_CODCF), (const char*)con); + } + return cache().get("&CON", conkey); +} + +void TDoc2Paf::log(int severity, const char* msg) +{ + if (severity < 0) + { + _logpaf = msg; + } + else if (_log == NULL) + { + _log = new TLog_report; + if (_logpaf.full()) + { + TString txt; + txt << _logpaf << ": " << msg; + _log->log(severity, txt); + } + else + _log->log(severity, msg); + } +} + +bool TDoc2Paf::show_log() +{ + bool ok = true; + if (_log) + { + _log->preview(); + delete _log; + _log = NULL; + ok = noyes_box(TR("Si desidera procedere con la generazione file xml?")); + } + return ok; +} + + +const char* TDoc2Paf::natura(const TString& codiva) const +{ + return cache().get("%IVA", codiva, "S12"); +} + +void TDoc2Paf::set_IVA(const TString& codiva, TPaf_record& paf) +{ + // É necessario il cast a real? + paf.set("PI_ALIQUOTAIVA", static_cast(cache().get("%IVA", codiva, "R0"))); + paf.set("PI_NATURA", cache().get("%IVA", codiva, "S12")); +} + +void TDoc2Paf::set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) +{ + set_IVA(rdoc.get(RDOC_CODIVA), paf); +} + +void TDoc2Paf::add_row_art(const TString codice_tipo, const TString& codice_valore, TPaf_record& paf) +{ + static long riga_art = 0; + paf.set("PY_KEYNLINAR", ++riga_art); + paf.set("PY_TIPOARTICOLO", codice_tipo); + paf.set("PY_VALOREARTICOLO", codice_valore); + paf.insert(); +} + + +bool TDoc2Paf::elabora(TDocumentoEsteso& doc) +{ + TString8 hfatt; // Codice univoco di 6 caratteri dell'ufficio P.A. o di 7 caratteri per un privato + TString20 bfatt; // Codice univoco di 20 caratteri del documento + + TAnagrafica clifo(doc.clifor().tipo(), doc.clifor().codice()); + + TString8 coddest = doc.clifor().vendite().get("PADESTIN"); + TString pec = doc.clifor().get("PEC"); + bool enapec = false; + if(coddest.empty()) + { + // Controllo se ha la pec + if (pec.full()) + { + coddest = "0000000"; + enapec = true; + } + // Controllo se è straniero + else if(clifo.estero()) + { + coddest = "XXXXXXX"; + } + else + return false; + } + + bool privato = coddest.len() != 6; + + + if (!chiave_paf(doc, hfatt, bfatt)) + return false; + log(-1, bfatt); + + const TFirm& firm = prefix().firm(); + const char* const paese = "IT"; + TCausale caus = TCausale(doc.tipo().causale(), doc.anno()); + + // + TPaf_record paf0100f("PAF0100F"); + paf0100f.set("P1_KEYPRGINVIO", ""); // Ci pensa SiAggFP + paf0100f.set("P1_KEYHEADERFATT", hfatt); + paf0100f.set("P1_KEYBODYFATT", bfatt); + paf0100f.remove(); + + paf0100f.set("P1_TRASMITTPAESE", paese); + paf0100f.set("P1_TRASMITTCOD", _cofi); + paf0100f.set("P1_FMTTRASMISS", privato? "FPR12" : "FPA12"); // SDI11 si usa dal 2015 per lo split payment (prima era SDI10) + + paf0100f.set("P1_CODDEST", coddest); + TString80 tel; + tel << firm.get(NDT_PTEL) << firm.get(NDT_TEL); + paf0100f.set("P1_TELEFONO", tel); + paf0100f.set("P1_MAIL", firm.get(NDT_MAIL)); + paf0100f.set("P1_GESTIONE", "P"); + paf0100f.insert(); + // + + if (enapec) + { + // + TPaf_record paf3200f("PAF3200F"); + paf3200f.set("PU_KEYHEADERFATT", hfatt); + paf3200f.set("PU_KEYBODYFATT", bfatt); + paf3200f.remove(); + paf3200f.set("PU_PEC", bfatt); + paf3200f.insert(); + // + } + + // + TPaf_record paf0200f("PAF0200F"); + paf0200f.set("P2_KEYHEADERFATT", hfatt); + paf0200f.set("P2_KEYBODYFATT", bfatt); + paf0200f.remove(); + + if (_ditta.partita_IVA().full()) + { + paf0200f.set("P2_FISCIVAPAESE", _ditta.stato_partita_IVA()); + paf0200f.set("P2_FISCIVACOD", _ditta.partita_IVA()); + } + paf0200f.set("P2_CODFISCALE", _ditta.codice_fiscale()); + if (_ditta.fisica()) + { + paf0200f.set("P2_ANANOME", _ditta.nome()); + paf0200f.set("P2_ANACOGNOME", _ditta.cognome()); + } + else + { + paf0200f.set("P2_ANADENOMIN", _ditta.ragione_sociale()); + } + + paf0200f.set("P2_REGFISCALE", doc.tipo().reg_fisc()); + + // DatiSede + paf0200f.set("P2_SEDEIND", _ditta.via_residenza()); + paf0200f.set("P2_SEDENRCIVICO", _ditta.civico_residenza()); + paf0200f.set("P2_SEDECAP", _ditta.CAP_residenza()); + paf0200f.set("P2_SEDECOMUNE", _ditta.comune_residenza()); + paf0200f.set("P2_SEDEPROV", _ditta.provincia_residenza()); + paf0200f.set("P2_SEDENAZ", paese); + paf0200f.set("P2_GESTIONE", "D"); + + TAnagrafica cliente(doc.clifor()); + + TString rifamm = cco(doc).get("S4"); + if (rifamm.blank()) + rifamm = doc.clifor().vendite().get(CFV_PARIFAMM); + paf0200f.set("P2_RIFAMMINISTR", rifamm); + + TISAM_recordset unloc("USE UNLOC\nJOIN COMUNI INTO COM==COMCCIAA\nFROM CODDITTA=#DITTA\nTO CODDITTA=#DITTA"); + unloc.set_var("#DITTA", firm.get(NDT_CODDITTA)); + if (unloc.move_first()) + { + const TString& numrea = unloc.get(ULC_NUMCCIAA).as_string(); + if (numrea.full()) + { + paf0200f.set("P2_ISCRREANUM", numrea); + paf0200f.set("P2_ISCRREAUFF", unloc.get("13->" COM_PROVCOM)); + } + } + + if (_ditta.giuridica()) + { + TISAM_recordset anagiu("USE ANAGIU\nFROM CODANAGR=#CODICE\nTO CODANAGR=#CODICE"); + anagiu.set_var("#CODICE", firm.get(NDT_CODANAGR)); + if (anagiu.move_first()) + { + paf0200f.set("P2_ISCRREACAP", anagiu.get(ANG_CAPSOC)); + const int ss = anagiu.get(ANG_STATOSOC).as_int(); + paf0200f.set("P2_ISCRREASLIQUID", (ss == 2 || ss == 3) ? "LS" : "LN"); + } + } + else + paf0200f.set("P2_ISCRREASLIQUID", "LN"); + + paf0200f.insert(); + + // + + // + + TPaf_record paf0400f("PAF0400F"); + paf0400f.set("P4_KEYHEADERFATT", hfatt); + paf0400f.set("P4_KEYBODYFATT", bfatt); + paf0400f.remove(); + + if (cliente.partita_IVA().full()) + { + paf0400f.set("P4_FISCIVAPAESE", cliente.stato_partita_IVA()); + paf0400f.set("P4_FISCIVACOD", cliente.partita_IVA()); + } + paf0400f.set("P4_CODFISC", cliente.codice_fiscale()); + + if (cliente.fisica()) + { + paf0400f.set("P4_ANANOME", cliente.nome()); + paf0400f.set("P4_ANACOGNOME", cliente.cognome()); + } + else + { + paf0400f.set("P4_ANADENOM", cliente.ragione_sociale()); + } + + // DatiSede + paf0400f.set("P4_SEDEIND", cliente.via_residenza()); + paf0400f.set("P4_SEDENRCIVICO", cliente.civico_residenza()); + paf0400f.set("P4_SEDECAP", cliente.CAP_residenza()); + paf0400f.set("P4_SEDECOMUNE", cliente.comune_residenza()); + paf0400f.set("P4_SEDEPROV", cliente.provincia_residenza()); + paf0400f.set("P4_SEDENAZ", cliente.stato_residenza_ISO()); + paf0400f.set("P4_GESTIONE", "D"); + paf0400f.insert(); + // + + // + TPaf_record paf0700f("PAF0700F"); + paf0700f.set("P7_KEYHEADERFATT", hfatt); + paf0700f.set("P7_KEYBODYFATT", bfatt); + paf0700f.remove(); + paf0700f.set("P7_TIPODOC", doc.tipo().tipo_doc_sdi()); + paf0700f.set("P7_DIVISA", "EUR"); // Aggiungere codice ISO 4217 a tabella divise (%VAL) + paf0700f.set("P7_DATA", doc.data()); + + const TCodice_numerazione& codnum = doc.codice_numerazione(); + TString20 numdoc; + codnum.complete_num(doc.numero(), numdoc); + paf0700f.set("P7_NUMERO", numdoc); + paf0700f.set("P7_GESTIONE", "D"); + + // + if(doc.get_real("BOLLI") > ZERO) + { + paf0700f.set("P7_IMPORTOBOLLO", doc.get("BOLLI")); + } + // + + // + // Non la mettiamo! + // + + // Non inserisco più adesso il paf0700f ma lo faccio alla fine (per inserire le ritenute) + + // + TPaf_record paf0900f("PAF0900F"); + paf0900f.set("P9_KEYHEADERFATT", hfatt); + paf0900f.set("P9_KEYBODYFATT", bfatt); + paf0900f.remove(); + + TString80 sconto_expr = doc.get(DOC_SCONTOPERC); + TToken_string sconti; + if (parse_sconto(sconto_expr, sconti)) + { + long nlin_sconto = 0; + FOR_EACH_TOKEN(sconti, str) + { + const real sconto = str; + if (!sconto.is_zero()) // Precauzione inutile + { + paf0900f.set("P9_RIFNUMLINEA", ++nlin_sconto); + if (sconto > ZERO) + { + paf0900f.set("P9_TIPOSCONTO", "SC"); + paf0900f.set("P9_PERCSCONTO", sconto); + } + else + { + paf0900f.set("P9_TIPOSCONTO", "MG"); + paf0900f.set("P9_PERCSCONTO", -sconto); + } + paf0900f.set("P9_GESTIONE", "D"); + paf0900f.insert(); + } + } + } + // + + // + TPaf_record paf2700f("PAF2700F"); + paf2700f.set("PQ_KEYHEADERFATT", hfatt); + paf2700f.set("PQ_KEYBODYFATT", bfatt); + paf2700f.remove(); + paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc()); + + const TRectype& cont_conv_off = cco(doc); + TString causale = cont_conv_off.get("S1"); + if (causale.full()) + { + causale << ' ' << cont_conv_off.get("S2"); + causale << ' ' << cont_conv_off.get("S3"); + causale.strip_double_spaces(); + causale.cut(200); + } + else + causale = doc.tipo().descrizione(); + paf2700f.set("PQ_CAUSALE", causale); + // paf2700f.set("PQ_ART73", true); + paf2700f.set("PQ_GESTIONE", "D"); + paf2700f.insert(); + // + + // Azzera contratti + TPaf_record paf1000f("PAF1000F"); + paf1000f.set("P0_KEYHEADERFATT", hfatt); + paf1000f.set("P0_KEYBODYFATT", bfatt); + paf1000f.remove(); + + // Azzera convenzioni + TPaf_record paf1100f("PAF1100F"); + paf1100f.set("PA_KEYHEADERFATT", hfatt); + paf1100f.set("PA_KEYBODYFATT", bfatt); + paf1100f.remove(); + + // Azzera ordini + TPaf_record paf1200f("PAF1200F"); + paf1200f.set("PB_KEYHEADERFATT", hfatt); + paf1200f.set("PB_KEYBODYFATT", bfatt); + paf1200f.remove(); + + // Azzera DDT + TPaf_record paf1600f("PAF1600F"); + paf1600f.set("PF_KEYHEADERFATT", hfatt); + paf1600f.set("PF_KEYBODYFATT", bfatt); + paf1600f.remove(); + + const TString16 cup = doc.get(DOC_CUP); + const TString16 cig = doc.get(DOC_CIG); + const TString80 com = doc.get(DOC_CODCMS); + + TString80 con = doc.get(DOC_CONTRATTO); + if (con.full() || cup.full() || cig.full()) + { + char tcon = doc.get_char(DOC_MODPAG); + if (tcon < 'C') tcon = 'C'; + + TDate datadoc; // Data contratto non obbligatoria + if (con.full()) + { + datadoc = cco(doc).get_date("D0"); + } + else + { + // IdDocumento obbligatorio + con = cig; + if (con.blank()) + con = cup; + } + + if (tcon == 'O') + { + paf1000f.set("P0_RIFNUMLINEA", 0L); + paf1000f.set("P0_IDDOC", con); + paf1000f.set("P0_DATADOC", datadoc); + paf1000f.set("P0_COMMCONVENZ", com); + paf1000f.set("P0_CODCUP", cup); + paf1000f.set("P0_CODCIG", cig); + paf1000f.set("P0_GESTIONE", "D"); + paf1000f.insert(); + } + else if (tcon == 'C') + { + paf1100f.set("PA_RIFNUMLINEA", 0L); + paf1100f.set("PA_IDDOC", con); + paf1100f.set("PA_DATADOCU", datadoc); + paf1100f.set("PA_COMMCONVENZ", com); + paf1100f.set("PA_CODCUP", cup); + paf1100f.set("PA_CODCIG", cig); + paf1000f.set("PA_GESTIONE", "D"); + paf1100f.insert(); + } + else + { + paf1200f.set("PB_RIFNUMLINEA", 0L); + paf1200f.set("PB_IDDOC", con); + paf1200f.set("PB_DATADOCO", datadoc); + paf1200f.set("PB_COMMCONVENZ", com); + paf1200f.set("PB_CODCUP", cup); + paf1200f.set("PB_CODCIG", cig); + paf1200f.set("PB_GESTIONE", "D"); + paf1200f.insert(); + } + } + + if (cup.blank() && cig.blank()) + log(1, "CIG e CUP assenti"); + + // + + TPaf_record paf1800f("PAF1800F"); + paf1800f.set("PI_KEYHEADERFATT", hfatt); + paf1800f.set("PI_KEYBODYFATT", bfatt); + paf1800f.remove(); // Cancella tutte le righe documento + + TPaf_record paf2000f("PAF2000F"); + paf2000f.set("PJ_KEYHEADERFATT", hfatt); + paf2000f.set("PJ_KEYBODYFATT", bfatt); + paf2000f.remove(); // Cancella tutti gli sconti di riga + + TPaf_record paf1900f("PAF1900F"); + paf1900f.set("PY_KEYHEADERFATT", hfatt); + paf1900f.set("PY_KEYBODYFATT", bfatt); + paf1900f.remove(); // Cancella tutte le righe articoli del documento + + + long riga = 0; + TString16 codivadefault; + { + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + codivadefault = rdoc->get(RDOC_CODIVA); + if (codivadefault.full()) + break; + } + } + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + paf1800f.reset(); + paf1800f.set("PI_KEYHEADERFATT", hfatt); + paf1800f.set("PI_KEYBODYFATT", bfatt); + paf1800f.set("PI_NUMEROLINEA", ++riga); + paf1800f.set("PI_DESCRIZIONE", descrizione(*rdoc)); + // paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione + + // + long riga_art = 0; + TArticolo& art = rdoc->articolo(); + if (art.ok()) + { + paf1900f.reset(); + paf1900f.set("PY_KEYHEADERFATT", hfatt); + paf1900f.set("PY_KEYBODYFATT", bfatt); + paf1900f.set("PY_KEYNLINEA", riga); + + TString& tmp = get_tmp_string(); + + if (art.codice().full()) + { + tmp.cut(0) << art.codice(); // Fixed_string di merda + add_row_art("Codice interno", tmp, paf1900f); + } + if (rdoc->tipo().codice() == "14") + { + add_row_art("Codice cliente", rdoc->get("CODARTALT"), paf1900f); + } + } + // + + + set_IVA(codivadefault, paf1800f); + + if (rdoc->is_merce()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + const real qta = rdoc->get(RDOC_QTA); + if (qta.is_zero()) + { + TString msg; + msg.format("La riga merce %d ha quantità nulla", riga); + log(1, msg); + } + if (qta >= ZERO) + { + paf1800f.set("PI_QUANTITA", qta); + paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); + } + else + { + paf1800f.set("PI_QUANTITA", -qta); + paf1800f.set("PI_PREZZOUNIT", -rdoc->prezzo(true, false)); + } + paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); + set_IVA(*rdoc, paf1800f); + + /* + const TDate data = doc.get(DOC_DATADOC); + paf1800f.set("PI_DTINIZIOPER", data); + paf1800f.set("PI_DTFINEPER", data); + */ + + // + + sconto_expr = rdoc->get(RDOC_SCONTO); + if (parse_sconto(sconto_expr, sconti)) + { + long nlin_sconto = 0; + FOR_EACH_TOKEN(sconti, str) + { + const real perc = str; + if (!perc.is_zero()) + { + paf2000f.set("PJ_KEYNLINEA", (long)r); + paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto); + if (perc > ZERO) + { + paf2000f.set("PJ_TIPOSCONTO", "SC"); + paf2000f.set("PJ_PERCSCONTO", perc); + } + else + { + paf2000f.set("PJ_TIPOSCONTO", "MG"); + paf2000f.set("PJ_PERCSCONTO", -perc); + } + paf2000f.set("PJ_GESTIONE", "D"); + paf2000f.insert(); + } + } + } + // + + + /* + * Ogni riga si può rifare a un DDT/Ordine diverso, per questo devo inserire i dati da qua e non in testata + */ + TArray ancestors; + find_ancestors(*rdoc, ancestors); + for (int i = ancestors.last(); i > 0; i = ancestors.pred(i)) + { + const TAncestor& a = (const TAncestor&)ancestors[i]; + if (i == 1) + { + // + TPaf_record paf1600f("PAF1600F"); + paf1600f.reset(); + paf1600f.set("PF_KEYHEADERFATT", hfatt); + paf1600f.set("PF_KEYBODYFATT", bfatt); + paf1600f.set("PF_RIFNUMLINEA", (long)r); + paf1600f.set("PF_NUMDDDT", a._numdoc); + paf1600f.set("PF_DATADDT", a._datadoc); + paf1600f.set("PF_GESTIONE", "D"); + paf1600f.insert(); + // + } + else if (i == 3) + { + // + TPaf_record paf1000f("PAF1000F"); + paf1000f.set("P0_KEYHEADERFATT", hfatt); + paf1000f.set("P0_KEYBODYFATT", bfatt); + paf1000f.set("P0_RIFNUMLINEA", (long)r); + paf1000f.set("P0_IDDOC", a._numdoc); + paf1000f.set("P0_DATADOC", a._datadoc); + paf1000f.set("P0_COMMCONVENZ", com); + paf1000f.set("P0_CODCUP", cup); + paf1000f.set("P0_CODCIG", cig); + paf1000f.set("P0_GESTIONE", "D"); + paf1000f.insert(); + // + } + } + + } + else if (rdoc->is_spese()) + { + const TSpesa_prest& sp = rdoc->spesa(); + const real imp = rdoc->importo(true, false); + real qta = UNO; + if (sp.is_tipo()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + qta = rdoc->get_real(RDOC_QTA); + if (qta.is_zero()) + { + TString msg; + msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, (const char*)rdoc->field_qta()); + log(1, msg); + qta = UNO; + } + paf1800f.set("PI_QUANTITA", qta); + } + real prz = imp; + if (qta != UNO) + { + prz = rdoc->prezzo(true, false); + if (prz.is_zero() && !imp.is_zero()) + { + const TPrice price(imp / qta); + prz = price.get_value(); + } + } + paf1800f.set("PI_PREZZOUNIT", prz); + paf1800f.set("PI_PRZTOTALE", imp); + set_IVA(*rdoc, paf1800f); + + // Controllo se è una ritenuta fiscale + // + if(sp.tipo_ritenuta() == 'F') + { + paf0700f.set("P7_TIPORITENUTA", cliente.fisica() ? "RT01" : "RT02"); + paf0700f.set("P7_IMPORTORIT", doc.imponibile() * sp.perc() / CENTO); + paf0700f.set("P7_ALIQUOTARIT", TCodiceIVA(sp.cod_iva()).percentuale()); + paf0700f.set("P7_CAUSPAGAM", cache().get("CA7", to_tstring(sp.caus_770()), "S2")); + } + // + } + else if (rdoc->is_prestazione()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + real qta = rdoc->get(RDOC_QTA); + if (qta.is_zero()) qta = UNO; + paf1800f.set("PI_QUANTITA", qta); + paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); + paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); + set_IVA(*rdoc, paf1800f); + } + + paf1800f.set("PI_GESTIONE", "D"); + paf1800f.insert(); + } + // + + + // + /* + * Non valorizziamo nulla al momento in quanto su Campo i dati obbligatori non ci sono/non sono obbligatori + TString cod_vettore = doc.get("CODVETT1"); + // É una fattura accompagnatoria! + if(cod_vettore.full()) + { + } + */ + // + + // Salvo la testata + paf0700f.insert(); + + // + TPaf_record paf2200f("PAF2200F"); + paf2200f.set("PL_KEYHEADERFATT", hfatt); + paf2200f.set("PL_KEYBODYFATT", bfatt); + paf2200f.remove(); // Cancella tutte le righe di riepilogo IVA + + const char* eiva = "I"; // Esigibilità IVA: Immediata, Differita, Split payment + if (doc.is_split_payment()) + eiva = "S"; + else if (doc.get_bool(DOC_LIQDIFF) || doc.get_bool(DOC_IVAXCASSA)) + eiva = "D"; + + long num_riep = 0; + TAssoc_array& tiva = doc.tabella_iva(false); + FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm) + { + const TRiepilogo_iva& riva = *(const TRiepilogo_iva*)itm; + const real aliquota = riva.cod_iva().percentuale(); + paf2200f.set("PL_ALIQUOTAIVA", aliquota); + if (aliquota.is_zero()) + paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice())); + + paf2200f.set("PL_IMPONIBILE", riva.imponibile()); + paf2200f.set("PL_IMPOSTA", riva.imposta()); + paf2200f.set("PL_ESIGIVA", eiva); + if (*eiva == 'S') + paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72"); + else + paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione()); + paf2200f.set("PL_GESTIONE", "D"); + paf2200f.insert(); + } + // + + // + TPaf_record paf2400f("PAF2400F"); + paf2400f.set("PN_KEYHEADERFATT", hfatt); + paf2400f.set("PN_KEYBODYFATT", bfatt); + paf2400f.remove(); // Cancella i dati pagamento + + TPagamento& pag = doc.pagamento(); + doc.scadenze_recalc(); // Ricalcola array delle rate + TString_array& scad = doc.scadenze(); + const int nrate = scad.items(); // Conta rate generate + const char* rateazione = pag.cond_pag_sdi(); // A rate (TP01) o una soluzione(TP02)? + paf2400f.set("PN_RIGA", ZERO); // Al momento non gestiamo più tipologie di pagamento per documento + paf2400f.set("PN_CONDPAGAMENTO", rateazione); + paf2400f.set("PN_GESTIONE", "D"); + paf2400f.insert(); + + TPaf_record paf2500f("PAF2500F"); + paf2500f.set("PO_KEYHEADERFATT", hfatt); + paf2500f.set("PO_KEYBODYFATT", bfatt); + paf2500f.remove(); // Cancella tutte le rate + + // Imposto i campi uguali per tutte le rate + paf2500f.set("PO_CONDPAGAMENTO", rateazione); // Condizione di pagamento PA + paf2500f.set("PO_CODICEPAGAM", pag.code()); // Condizione di pagamento CAMPO + + TString80 iban, istituto; + TString8 abi, cab; + if (get_bank(doc, iban, abi, cab, istituto)) + { + paf2500f.set("PO_ISTFINANZ", istituto); + paf2500f.set("PO_IBAN", iban); + paf2500f.set("PO_ABI", abi); + paf2500f.set("PO_CAB", cab); + } + + if (cab.blank()) + log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento")); + else if (iban.blank()) + log(1, TR("Non è presente il codice IBAN per il pagamento")); + + for (int nr = 0; nr < nrate; nr++) + { + paf2500f.set("PO_RIGA", long(nr + 1)); // Numero rata +#ifdef DBG + bool tolla = true; + TString pop = cache().get("%CLR", pag.ulc_rata(nr < pag.n_rate() ? nr : 0), "S12"); + bool aaaa = true; +#endif + paf2500f.set("PO_MODALITAPAGAM", cache().get("%CLR", pag.ulc_rata(nr < pag.n_rate() ? nr : 0), "S12")); // Si assicura che il numero riga sia accettabile + + TToken_string& riga = scad.row(nr); // Data|Importo + paf2500f.set("PO_DATASCADENZA", TDate(riga.get(0))); // Data scadenza + paf2500f.set("PO_IMPORTO", real(riga.get())); // Importo rata + + paf2500f.set("PO_GESTIONE", "D"); + paf2500f.insert(); + } + + TPaf_record paf2600f("PAF2600F"); + paf2600f.set("PP_KEYHEADERFATT", hfatt); + paf2600f.set("PP_KEYBODYFATT", bfatt); + paf2600f.remove(); // Cancella eventuali allegati + TToken_string allegati(doc.get("COLL_GOLEM"), '\n'); + if (allegati.full()) + { + long nprogr = 0; // Numero di file allegati + TFilename fname; + FOR_EACH_TOKEN(allegati, row) + { + const TToken_string entry(row); + if (entry.get(0, fname) && fname.exist()) + { + static TString dest_path; + static TString dest_usr_path; + + dest_path.cut(0) << _def_fld << fname.name(); + dest_usr_path.cut(0) << _def_usr_fld << fname.name(); + + if(!fcopy(fname, dest_usr_path)) + { + if (yesno_box("Errore critico nel copiare il file %s, si desidera continuare?", fname.name())) + continue; + else + return false; + } + + // Provo a copiare il file + paf2600f.set("PP_NUMEROLINEA", ++nprogr); + paf2600f.set("PP_NOMEATTACHMENT", fname.name()); + paf2600f.set("PP_ATTACHMENT", dest_path); + fname.upper(); // serve estensione maiuscola + paf2600f.set("PP_FMTATTACHMENT", fname.ext()); + paf2600f.insert(); + } + } + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + /* + if(td.invio_xml()) + { + // Genero il pdf del documento e lo allego + + } + */ + } + + // + return true; +} + +bool TDoc2Paf::elabora(const TRectype& rec) +{ + TDocumentoEsteso doc; + if (doc.read(rec) == NOERR) + { + return elabora(doc) ? db().sq_commit() : db().sq_rollback(); + } + return false; +} + +bool TDoc2Paf::elabora(const TDoc_key& key) +{ + TRectype rec(LF_DOC); + rec.put(DOC_PROVV, key.provv()); + rec.put(DOC_ANNO, key.anno()); + rec.put(DOC_CODNUM, key.codnum()); + rec.put(DOC_NDOC, key.ndoc()); + return elabora(rec); +} + +bool TDoc2Paf::elabora(const TFilename& ini) +{ + TConfig cfg(ini, "33"); + const int anno = cfg.get_int(DOC_ANNO); + const long ndoc = cfg.get_long(DOC_NDOC); + const TFixed_string codnum(cfg.get(DOC_CODNUM)); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + return elabora(key); +} + +/* +bool TDoc2Paf::genera_xml() +{ + #define PABASE "SiaggPA" + + TFilename tmp; + + // Copia eventuali protezioni software + TString_array files; + if (list_files(PABASE"/*.ssa", files) == 0) + { + list_files("*.ssa", files); + FOR_EACH_ARRAY_ROW(files, i, row) + { + tmp = PABASE; tmp.add(*row); + xvt_fsys_fupdate(*row, tmp); + } + } + files.destroy(); + if (list_files(PABASE"/*.ssa", files) != 1) + warning_box(FR("Nella cartella %s deve essere presente esattamente un file .ssa"), PABASE); + + TFilename home; + xvt_sys_get_env("USERPROFILE", home.get_buffer(), home.size()); + home.add("SoftwareSirio"); home.add(PABASE); + if (!dexist(home)) + make_dir(home); + + tmp = home; tmp.add("config.properties"); + xvt_fsys_fupdate(PABASE"/config.properties", tmp); + + tmp = home; tmp.add("configGUI.properties"); + xvt_fsys_fupdate(PABASE"/configGUI.properties", tmp); + + if (tmp.exist()) + { + TJava_profile prop(tmp); + if (prop.get("percorso").blank()) + prop.set("percorso", _dbname.path()); + prop.set("nomePAF", _dbname); + } + else + cantread_box(tmp); + + tmp = PABASE"\\SiaggPACAMPO.jar"; + tmp.make_absolute_path(); + + DIRECTORY old_dir; xvt_fsys_get_dir(&old_dir); + DIRECTORY new_dir; xvt_fsys_convert_str_to_dir(tmp.path(), &new_dir); + xvt_fsys_set_dir(&new_dir); + const bool good = goto_url(tmp); + if (good) + xvt_sys_sleep(3000); + else + error_box(FR("Impossibile eseguire Java -jar %s"), (const char*)tmp); + xvt_fsys_set_dir(&old_dir); + + return good; +} +*/ +void TDoc2Paf::main_loop() +{ + int ndocs = 0; + for (int a = 1; a < argc(); a++) + { + TFilename ini = argv(a); + if (ini.starts_with("-i", true) || ini.starts_with("/i", true)) + ini.ltrim(2); + if (ini.exist() && elabora(ini)) + ndocs++; + else + { + if (ini.find('*') >= 0 || ini.find('?') >= 0) + { + TString_array f; + list_files(ini, f); + FOR_EACH_ARRAY_ROW(f, r, row) + { + ini = *row; + if (ini.exist() && elabora(ini)) + ndocs++; + } + } + } + } + if (ndocs > 0) + { + show_log(); + //if (show_log()) + //genera_xml(); + return; + } + + TPA_mask mask; + mask.set(F_COFI, _cofi); + while (mask.run() == K_ENTER) + { + _cofi = mask.get(F_COFI); + + _def_fld = ini_get_string(CONFIG_DITTA, "fp", "flddest"); + if(!_def_fld.ends_with("\\")) + { + _def_fld << "\\"; + } + + _def_usr_fld = ini_get_string(CONFIG_DITTA, "fp", "fldusrdest", ""); + if(_def_usr_fld.empty()) + { + _def_usr_fld = _def_fld; + } + else if (!_def_fld.ends_with("\\")) + { + _def_usr_fld << "\\"; + } + + TString_array& sht = mask.sfield(F_DOCS).rows_array(); + if (!sht.empty()) + { + TProgress_monitor pi(sht.items(), NULL); + ndocs = 0; + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (riga->starts_with("X")) + { + const int anno = riga->get_int(mask.sfield(F_DOCS).cid2index(S_ANNO)); + const long ndoc = riga->get_long(mask.sfield(F_DOCS).cid2index(S_NDOC)); + const TFixed_string codnum(riga->get(mask.sfield(F_DOCS).cid2index(S_CODNUM))); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + if (elabora(key)) + ndocs++; + } + if (!pi.add_status(1)) + break; + } + message_box(FR("Sono stati elaborati %d documenti"), ndocs); + } + + if (ndocs > 0 && show_log()) + //genera_xml(); + return; + } +} + +bool TDoc2Paf::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, + LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, + LF_DOC, LF_RIGHEDOC, 0); + + TRectype cfven(LF_CFVEN); + if (cfven.type(CFV_PARIFAMM) != _alfafld) + return error_box(TR("Database non convertito per fatturazione P.A.")); + + _ditta.init(LF_NDITTE, prefix().get_codditta()); + + _cofi = ini_get_string(CONFIG_DITTA, "fp", "TRASMITTCOD"); + if (_cofi.blank()) + _cofi = _ditta.codice_fiscale(); + + return check_tables() && TSkeleton_application::create(); + +} + +bool TDoc2Paf::destroy() +{ + if (_cofi.full()) + ini_set_string(CONFIG_DITTA, "fp", "TRASMITTCOD", _cofi); + + db().sq_disconnect(); + return TSkeleton_application::destroy(); +} + +int fp0300(int argc, char* argv[]) +{ + TDoc2Paf d2p; + d2p.run(argc, argv, TR("Fatturazione P.A.")); + return 0; +} diff --git a/src/fp/fp0300.cpp~RF5235131.TMP b/src/fp/fp0300.cpp~RF5235131.TMP new file mode 100644 index 000000000..ee864dc15 --- /dev/null +++ b/src/fp/fp0300.cpp~RF5235131.TMP @@ -0,0 +1,1652 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../ve/velib05.h" +#include "../cg/cglib03.h" + +#include "fp0.h" +#include "fp0300a.h" + +#include "../fe/felib.h" +#include "fplib01.h" + +#include +#include +#include +#include +#include +#include +#include "../cg/cfban.h" + + +///////////////////////////////////////////////////////////////////////////////////// +// Globals +///////////////////////////////////////////////////////////////////////////////////// + + + +///////////////////////////////////////////////////////////////////////////////////// +// Utilities +///////////////////////////////////////////////////////////////////////////////////// + +/* + * HFATT: tipocf(1) + codcf(6) + * BFATT: datadoc(8) + tipodoc_SDI(4) + numdoc(7) + */ + +// Crea la coppia di chiavi per il db PAF a partire da un documento vero e proprio +static bool chiave_paf(const TDocumento& doc, TString& hfatt, TString& bfatt) +{ + hfatt.cut(0); + if (doc.clifor().occasionale()) + hfatt << "O" << doc.get("OCFPI"); + else + hfatt << doc.clifor().tipo() << doc.clifor().codice(); + CHECK(hfatt.full(), "Destinatario fattura P.A. non valido"); + + const TCodice_numerazione& codnum = doc.codice_numerazione(); + const long ndoc = doc.numero(); + TString16 fullnumdoc; codnum.complete_num(ndoc, fullnumdoc); + + bfatt.cut(0) << doc.get_date(DOC_DATADOC).date2ansi() << '/' << doc.tipo().tipo_doc_sdi() << '/' << fullnumdoc; + return hfatt.full() && bfatt.full(); +} + +// Crea la coppia di chiavi per il db PAF a partire da un semplice record di testata documento +static bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt) +{ + TDocumento d(doc); + chiave_paf(d, hfatt, bfatt); + return hfatt.full(); +} + +// Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h) +static SLIST_ELT xvt_slist_find_str(SLIST list, const char* str) +{ + SLIST_ELT e = NULL; + for (e = xvt_slist_get_first(list); e; e = xvt_slist_get_next(list, e)) + { + const char* val = xvt_slist_get(list, e, NULL); + if (xvt_str_compare_ignoring_case(str, val) == 0) + break; + } + return e; +} + +// Aggiorna il file dst se più vecchio di src (Potrebbe diventare una funzione di XVT.h) +bool xvt_fsys_fupdate(const char* src, const char* dst) +{ + bool ok = false; + if (xvt_fsys_file_exists(src)) + { + const long tsrc = xvt_fsys_file_attr(src, XVT_FILE_ATTR_MTIME); + if (tsrc > 0) + { + long tdst = 0; + if (xvt_fsys_file_exists(dst)) + tdst = xvt_fsys_file_attr(dst, XVT_FILE_ATTR_MTIME); + if (tsrc > tdst) + ok = xvt_fsys_fcopy(src, dst) != 0; + } + } + + return ok; +} + +///////////////////////////////////////////////////////////////////////////////////// +// TAncestor +///////////////////////////////////////////////////////////////////////////////////// + +struct TAncestor : public TObject +{ + TString20 _numdoc; + TDate _datadoc; + + TAncestor(const TRectype& rdoc); +}; + +TAncestor::TAncestor(const TRectype& rdoc) +{ + const int anno = rdoc.get_int(RDOC_ANNO); + const TString4 codnum = rdoc.get(RDOC_CODNUM); + const long ndoc = rdoc.get_long(RDOC_NDOC); + const TCodice_numerazione& num = cached_numerazione(codnum); + + TToken_string kdoc; + kdoc = rdoc.get(RDOC_PROVV); + kdoc.add(anno); + kdoc.add(codnum); + kdoc.add(ndoc); + const TRectype& doc = cache().get(LF_DOC, kdoc); + + TString16 numdoc; num.complete_num(ndoc, numdoc); + _numdoc.format("%d/%s/%s", anno, (const char*)codnum, (const char*)numdoc); + _datadoc = doc.get_date(DOC_DATADOC); +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TPaf_record +///////////////////////////////////////////////////////////////////////////////////// + +// Contenitore di campi di un record di database SQLite +class TPaf_record : public TObject +{ + TString8 _table; + TToken_string _key; + TAssoc_array _fields; + +protected: + void copy(const TPaf_record& rec) { _table = rec._table; _key = rec._key; _fields = rec._fields; } + const TString& var2str(const TString& fld, const TVariant& var) const; + +public: + void reset() { _fields.destroy(); } + void set(const char* fld, const TVariant& var); + void set(const char* fld, long var); + void set(const char* fld, const char* var); + void set(const char* fld, const real& var); + void set(const char* fld, const TString& var); + void set(const char* fld, const TDate& var); + void set(const char* fld, bool var); + const TVariant& get(const char* fld) const; + + bool insert(); + bool remove(); + bool search(); + bool search(const char* k1, const char* k2, const char* k3 = NULL); + + virtual TObject* dup() const { return new TPaf_record(*this); } + virtual bool ok() const { return _table.not_empty(); } + + TPaf_record& operator=(const TPaf_record& rec) { copy(rec); return *this; } + TPaf_record(const TPaf_record& rec) { copy(rec); } + TPaf_record(const char* table); +}; + +// Imposta il valore di un campo variant +void TPaf_record::set(const char* fld, const TVariant& var) +{ + CHECK(fld && *fld, "Null field name"); + + if (var.is_null()) + { + _fields.remove(fld); + } + else + { + TVariant* obj = (TVariant*)_fields.objptr(fld); + if (obj != NULL) + *obj = var; + else + _fields.add(fld, new TVariant(var)); + } +} + +// Imposta il valore di un campo intero +void TPaf_record::set(const char* fld, long val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo stringa +void TPaf_record::set(const char* fld, const char* val) +{ + if (val == NULL) + set(fld, NULL_VARIANT); + else + { + const TVariant var(val); + set(fld, var); + } +} + +// Imposta il valore di un campo stringa +void TPaf_record::set(const char* fld, const TString& val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo numerico +void TPaf_record::set(const char* fld, const real& val) +{ + const TVariant var(val); + set(fld, var); +} + +// Imposta il valore di un campo data in formato ISO +void TPaf_record::set(const char* fld, const TDate& val) +{ + if (val.ok()) + { + const TVariant var(val); + set(fld, var); + } + else + set(fld, ""); +} + +// Imposta il valore di un campo booleano +void TPaf_record::set(const char* fld, bool var) +{ + set(fld, var ? "SI" : "NO"); +} + +// Legge il valore di un campo variant +const TVariant& TPaf_record::get(const char* fld) const +{ + const TVariant* var = (const TVariant*)_fields.objptr(fld); + return var ? *var : NULL_VARIANT; +} + +// Converte un variant in una stringa valida per SQLite +const TString& TPaf_record::var2str(const TString& fldname, const TVariant& var) const +{ + const TFieldtypes vt = var.type(); + if (vt == _realfld) + { + const TCurrency v(var.as_real(), "", ZERO, fldname.find("PRZ")>0 || fldname.find("PREZZO")>0); + TString& tmp = get_tmp_string(); + tmp << '\'' << v.string() << '\''; tmp.replace(',','.'); + return tmp; + } + if (vt == _datefld) + { + TString& tmp = get_tmp_string(); + tmp << '\'' << var.as_date().string(full, '-', full, full, amg_date) << '\''; + return tmp; + } + + const TString& str = var.as_string(); + + bool apici = vt == _alfafld; + if (apici && str[0] != '0' && real::is_natural(str)) + apici = false; + + if (!apici) + return str; + + TString& tmp = get_tmp_string(); + tmp = str; + for (int a = str.rfind('\''); a >= 0; a--) + { + if (tmp[a] == '\'') + tmp.insert("'", a); + } + tmp.insert("'", 0); + tmp << '\''; + return tmp; +} + +// Elimina il record in base ai campi chiave +bool TPaf_record::remove() +{ + TString256 query; + query << "DELETE FROM " << _table << " WHERE "; + int nkf = 0; + FOR_EACH_TOKEN(_key, fld) + { + const TVariant& var = get(fld); + if (!var.is_null()) + { + if (nkf++ > 0) + query << " AND "; + query << fld << '=' << var2str(fld, var) ; + } + } + CHECKS(nkf >= 2, "Can't remove partial key on table ", (const char*)_table); + query << ';'; + return db().sq_set_exec(query); +} + +// Callback per la sottostante funzione search() +static int paf_search_record(void* jolly, int cols, char** values, char** names) +{ + TPaf_record& rec = *(TPaf_record*)jolly; + for (int i = 0; i < cols; i++) + rec.set(names[i], values[i]); + return 0; +} + +// Carica un record in base ai campi chiave +bool TPaf_record::search() +{ + CHECKS(_fields.items() > 0, "Can't search with empty key on table ", static_cast(_table)); + TString256 query; + query << "SELECT * FROM " << _table << " WHERE "; + FOR_EACH_TOKEN(_key, fld) + { + const TVariant& var = get(fld); + if (!var.is_null()) + query << fld << '=' << var2str(fld, var) << " AND "; + } + query.rtrim(5); + query << ';'; + + // return xvt_sql_execute(_db, query, paf_search_record, this) == 1; + // TODO: Valutare + return db().sq_set_exec(query); +} + +// Carica un record in base ad un massimo di 3 campi chiave +bool TPaf_record::search(const char* k1, const char* k2, const char* k3) +{ + _fields.destroy(); + + set(_key.get(0), k1); + set(_key.get(1), k2); + if (k3 && *k3) + set(_key.get(2), k3); + + return search(); +} + +// Aggiunge un record al db +bool TPaf_record::insert() +{ + CHECKS(_fields.items() > _key.items(), "Can't insert empty record on table ", _table); + + TString query, values; + query << "INSERT INTO " << _table << "\n("; + FOR_EACH_ASSOC_OBJECT(_fields, obj, fld, itm) + { + const TVariant& var = get(fld); + if (!var.is_null()) + { + query << fld << ','; + values << var2str(fld, var) << ','; + } + } + query.rtrim(1); values.rtrim(1); + query << ")\nVALUES (" << values << ");"; + return db().sq_set_exec(query); +} + +// Crea un record della tabella data ed imposta i nomi dei campi chiave +TPaf_record::TPaf_record(const char* table) : _table(table), _key(15, ',') +{ + TString q; + q << "SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = '" << table << "' ORDER BY ORDINAL_POSITION"; + for (bool ok = db().sq_set_exec(q); ok; ok = db().sq_next()) + { + _key.add(db().sq_get("COLUMN_NAME")); + } + CHECKS(!_key.empty_items(), "Invalid primary key for table ", table); +} + +///////////////////////////////////////////////////////////////////////////////////// +// TPa_mask +///////////////////////////////////////////////////////////////////////////////////// + +class TPA_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + void fill(); + void init(); + bool is_fattura(const TRectype& doc) const; + +public: + TPA_mask() : TAutomask("fp0300a") { } +}; + +bool TPA_mask::is_fattura(const TRectype& doc) const +{ + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + if (!td.is_fattura()) // Tengo per buone solo le fatture e le note di credito + return false; + + const TCodice_numerazione& cn = cached_numerazione(doc.get(DOC_CODNUM)); + return cn.tipo() == 2 && !cn.get_bool("B10"); // Controlla se fattura provvisioria esclusa da P.A. +} + + +void TPA_mask::fill() +{ + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + docs.hide(); + + sht.destroy(); + + // Seleziona tutti i clienti che sono pubbliche amministrazioni (PADESTIN!='') + TString query; + query << "USE 17 SELECT PADESTIN!=''" + << "\nJOIN 20 INTO TIPOCF=TIPOCF CODCF==CODCF" + << "\nFROM TIPOCF=C\nTO TIPOCF=C"; + + TISAM_recordset clifo_pa(query); + const TRecnotype n = clifo_pa.items(); + if (n > 0) + { + const TDate dal = get(F_DATAINI); + const char filter_selected = get(F_FATTSEL)[0]; + + // Record di controllo per eventuali elaborazioni precedenti + TString hfatt(8), bfatt(20); + TPaf_record paf0100f("PAF0100F"); + + TProgress_monitor pi(n, NULL); + for (bool okc = clifo_pa.move_first(); okc; okc = clifo_pa.move_next()) + { + if (!pi.add_status()) + break; + + query.cut(0); + query << "USE 33 KEY 2\nSELECT (BETWEEN(STATO,2,8))"; + query << "\nFROM TIPOCF=C CODCF=#CLIENTE PROVV=D ANNO=" << dal.year() << " DATADOC=" << dal.date2ansi() + << "\nTO TIPOCF=C CODCF=#CLIENTE PROVV=D"; + TISAM_recordset doc_pa(query); + doc_pa.set_var("#CLIENTE", clifo_pa.get(CLI_CODCF)); + const TRectype& doc = doc_pa.cursor()->curr(); + for (bool okd = doc_pa.move_first(); okd; okd = doc_pa.move_next()) + { + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + if (!td.is_fattura() || td.tipo_doc_sdi().empty()) // Tengo per buone solo le fatture e le note di credito e che hanno il tipo doc SDI per l'invio + continue; + + bool sent = false; + if (chiave_paf(doc, hfatt, bfatt)) + { + if (paf0100f.search(NULL, hfatt, bfatt)) + { + sent = paf0100f.get("P1_GESTIONE").as_string() == "X"; + if (sent && !filter_selected) + continue; + } + } + + TToken_string* row = new TToken_string; + *row = sent ? " " : "X"; + row->add(doc_pa.get(DOC_ANNO).as_int(), 1); + row->add(doc_pa.get(DOC_CODNUM).as_string()); + row->add(td.tipo_doc_sdi()); + row->add(doc_pa.get(DOC_NDOC).as_int()); + row->add(doc_pa.get(DOC_DATADOC).as_date()); + row->add(clifo_pa.get(CFV_CODCF).as_int()); + row->add(clifo_pa.get("20." CLI_RAGSOC).as_string()); + row->add(clifo_pa.get(CFV_PADESTIN).as_string()); + row->add(clifo_pa.get(CFV_PARIFAMM).as_string()); + row->add(clifo_pa.get("20." CLI_COFI).as_string()); + row->add(!td.invio_xml() ? "X" : ""); + + bool split = clifo_pa.get("20." CLI_SPLITPAY).as_bool(); + if (split) + { + const long numreg = doc_pa.get(DOC_NUMREG).as_int(); + if (numreg > 0) + { + const TRectype& mov = cache().get(LF_MOV, numreg); + split = is_split_payment(mov); + } + } + row->add(split ? "X" : " "); + + const bool attach = !doc_pa.get("COLL_GOLEM").is_empty(); + row->add(attach ? "X" : " "); + + sht.add(row); + } + } + } + docs.force_update(); + docs.show(); +} + +bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_DATAINI: + if (e == fe_init) + o.set(ini_get_string(CONFIG_DITTA, "pa", "LastXML", "01-01-2018")); else + if (e == fe_modify) + fill(); else + if (e == fe_close) + ini_set_string(CONFIG_DITTA, "pa", "LastXML", o.get()); + break; + case F_SHOWALL: + if (e == fe_modify) + fill(); + break; + case F_DOCS: + if (e == fe_init) + fill(); + if (e == se_query_add || e == se_query_del) + return false; + break; + case DLG_USER: + if (e == fe_button && jolly > 0) + { + TSheet_field& docs = sfield(F_DOCS); + TToken_string& row = docs.row(docs.selected()); + TRectype doc(LF_DOC); + doc.put(DOC_PROVV, 'D'); + doc.put(DOC_ANNO, row.get(1)); + doc.put(DOC_CODNUM, row.get()); + doc.put(DOC_NDOC, row.get()); + if (doc.edit()) + fill(); + } + break; + case DLG_ALL: + { + if (e == fe_button) + { + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + const int items = sht.items(); + + if (items > 0) + { + const TString4 select = *(sht.row(0).get(0)) == 'X' ? "" : "X"; + for (int i = 0; i < items; i++) + sht.row(i).add(select, 0); + docs.force_update(); + } + } + } + break; + default: break; + } + return true; +} + +///////////////////////////////////////////////////////////////////////////////////// +// TDoc2Paf +///////////////////////////////////////////////////////////////////////////////////// + +class TDoc2Paf : public TSkeleton_application +{ + TAnagrafica _ditta; + TString16 _cofi; + TFilename _dbname; + TLog_report* _log; + TString _logpaf; + +private: + int parse_line(const TString& line, TString& var, TString& val) const; + bool create_table(TScanner& paf, const TString& table); + + const TRectype* find_parent_row(const TRectype& rdoc) const; + int find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) const; + +protected: + bool parse_sconto(const TString& formula, TToken_string& sconti) const; + bool get_bnp_iban(const TString& abi, const TString& cab, int prg, TString& iban) const; + bool get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const; + const char* descrizione(const TRiga_documento& rdoc) const; + const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta + + void log(int severity, const char* msg); + bool show_log(); + const char * natura(const TString& codiva) const; + void set_IVA(const TString& codiva, TPaf_record& paf) const; + void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const; + + bool elabora(TDocumentoEsteso& doc); + bool elabora(const TRectype& rec); + bool elabora(const TDoc_key& key); + bool elabora(const TFilename& ini); + //bool genera_xml(); + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + + TDoc2Paf() : _log(NULL) {} +}; + +bool TDoc2Paf::parse_sconto(const TString& formula, TToken_string& sconti) const +{ + sconti.cut(0); + int start = 0; + for (int i = 0; ; i++) + { + const char c = formula[i]; + if (c == '+' || c == '-' || c < ' ') + { + if (i > 0) + { + TString8 tok = formula.sub(start, i); + tok.replace(',', '.'); + const real perc = tok; + if (!perc.is_zero()) + sconti.add(tok); + } + if (c < ' ') + break; + start = i; + } + } + return sconti.full(); +} + +bool TDoc2Paf::get_bnp_iban(const TString& abi, const TString& cab, int nprog, TString& iban) const +{ + TTable bnp("BNP"); + TString16 key; + key << abi << cab; + if (nprog > 0) + { + TString4 sprog; sprog.format("%02d", nprog); + key << sprog; + } + bnp.put("CODTAB", key); + int err = bnp.read(_isgteq); + if (err == NOERR && !bnp.get("CODTAB").starts_with(abi)) + err = _iskeynotfound; + if (err == NOERR) + iban = bnp.get("S3"); + + return err == NOERR; +} + +bool TDoc2Paf::get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const +{ + bool found = false; + abi = doc.get(DOC_CODABIP); + cab = doc.get(DOC_CODCABP); + int prg = doc.get_int(DOC_PROGBNP); + + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, prg, iban); + + if (!found) // Se non trovo banca sul DOC la cerco su CFBAN + { + TToken_string key; + key.add("C"); key.add(doc.codcf()); key.add("N"); key.add(1); + const TRectype& cfban = cache().get(LF_CFBAN, key); + if (!cfban.empty()) + { + abi = cfban.get(CFBAN_ABI); + cab = cfban.get(CFBAN_CAB); + prg = cfban.get_int(CFBAN_PROGPR); + found = abi.full() && cab.full(); + iban = cfban.get(CFBAN_IBAN); + if (found && iban.blank()) + get_bnp_iban(abi, cab, prg, iban); + } + } + + if (!found) // Se non trovo banca su CFBAN la cerco su CFVEN + { + const TRectype& cfven = doc.clifor().vendite(); + abi = cfven.get(CFV_CODABIPR); + cab = cfven.get(CFV_CODCABPR); + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, 0, iban); + } + + if (found) + istituto = cache().get("%BAN", abi, "S0"); + + return found; +} + +const char* TDoc2Paf::descrizione(const TRiga_documento& rdoc) const +{ + if (rdoc.get_bool(RDOC_DESCLUNGA)) + { + TString tmp; + tmp << rdoc.get(RDOC_DESCR) << rdoc.get(RDOC_DESCEST); + tmp.replace('\n', ' '); tmp.strip_double_spaces(); tmp.trim(); + TParagraph_string para(tmp, 100); + return para.get(0); + } + return rdoc.get(RDOC_DESCR); +} + +const TRectype* TDoc2Paf::find_parent_row(const TRectype& rdoc) const +{ + const long id = rdoc.get_long(RDOC_DAIDRIGA); + if (id > 0L) + { + TToken_string key; + key.add(rdoc.get(RDOC_DACODNUM)); + if (key.full()) + { + key.add(rdoc.get(RDOC_DAANNO)); + key.add(rdoc.get(RDOC_DAPROVV)); + key.add(rdoc.get(RDOC_DANDOC)); + for (int r = 0; ; r++) + { + if (r == 0) + key.add(id, 4); + else + key.add(r, 4); + const TRectype& rec = cache().get(LF_RIGHEDOC, key); + if (r > 0 && rec.empty()) + break; + if (rec.get_long(RDOC_IDRIGA) == id) + return &rec; + } + } + } + return NULL; +} + +int TDoc2Paf::find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) const +{ + if (rdoc.is_articolo()) + { + for (const TRectype* prdoc = find_parent_row(rdoc); prdoc != NULL; prdoc = find_parent_row(*prdoc)) + { + const TCodice_numerazione& cn = cached_numerazione(prdoc->get(RDOC_CODNUM)); + const int td = cn.tipo(); + if (td > 0 && ancestors.objptr(td) == NULL) + ancestors.add(new TAncestor(*prdoc), td); + } + } + return ancestors.items(); +} + +const TRectype& TDoc2Paf::cco(const TRectype& doc) const +{ + TString80 conkey; + const TString& con = doc.get(DOC_CONTRATTO); + if (con.full()) + { + char tcon = doc.get_char(DOC_MODPAG); + if (tcon < 'C') tcon = 'C'; + conkey.format("%c%6ld%s", tcon, doc.get_long(DOC_CODCF), (const char*)con); + } + return cache().get("&CON", conkey); +} + +void TDoc2Paf::log(int severity, const char* msg) +{ + if (severity < 0) + { + _logpaf = msg; + } else + if (_log == NULL) + { + _log = new TLog_report; + if (_logpaf.full()) + { + TString txt; + txt << _logpaf << ": " << msg; + _log->log(severity, txt); + } + else + _log->log(severity, msg); + } +} + +bool TDoc2Paf::show_log() +{ + bool ok = true; + if (_log) + { + _log->preview(); + delete _log; + _log = NULL; + ok = noyes_box(TR("Si desidera procedere con la generazione file xml?")); + } + return ok; +} + + +const char * TDoc2Paf::natura(const TString& codiva) const +{ + const TRectype& ai = cache().get("%IVA", codiva); + TString & natura = get_tmp_string(4); + + natura = ai.get("S12"); + if(natura.blank()) + { + const int tipo_iva11 = ai.get_int("S2"); + const bool revcharge = tipo_iva11 >= 31 && tipo_iva11 <= 38; + const TString& tipo = ai.get("S1"); + const int tipo_vendite = ai.get_int("S7"); + + // N1 escluse ex art 15 + if (tipo_vendite == 5) + natura = "N5"; // regime del margine + else + if (revcharge) + natura = "N6"; // Inversione contabile (REVERSE CHARGE) + else + if (tipo == "NS") + natura = "N2"; // Non soggetto + else + if (tipo == "NI") + natura = "N3"; // Non imponibile + else + if (tipo == "ES") + natura = "N4"; // Esente + } + return natura; +} + +void TDoc2Paf::set_IVA(const TString& codiva, TPaf_record& paf) const +{ + const TRectype& ai = cache().get("%IVA", codiva); + const real aliquota = ai.get("R0"); + paf.set("PI_ALIQUOTAIVA", aliquota); + if (codiva.full()) + { + if (aliquota.is_zero()) + paf.set("PI_NATURA", natura(codiva)); + else + paf.set("PI_NATURA", ""); + } +} + +void TDoc2Paf::set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const +{ + const TString8 codiva(rdoc.get(RDOC_CODIVA)); + const TRectype& ai = cache().get("%IVA", codiva); + const real aliquota = ai.get("R0"); + paf.set("PI_ALIQUOTAIVA", aliquota); + if (codiva.full()) + { + if (aliquota.is_zero()) + paf.set("PI_NATURA", natura(codiva)); + else + paf.set("PI_NATURA", ""); + } +} + + +bool TDoc2Paf::elabora(TDocumentoEsteso& doc) +{ + TString8 hfatt; // Codice univoco di 6 caratteri dell'ufficio P.A. o di 7 caratteri per un privato + TString20 bfatt; // Codice univoco di 20 caratteri del documento + if (!chiave_paf(doc, hfatt, bfatt)) + return false; + log(-1, bfatt); + + const TFirm& firm = prefix().firm(); + const char* const paese = "IT"; + TCausale caus = TCausale(doc.tipo().causale(), doc.anno()); + + // + TPaf_record paf0100f("PAF0100F"); + paf0100f.set("P1_KEYHEADERFATT", hfatt); + paf0100f.set("P1_KEYBODYFATT", bfatt); + paf0100f.remove(); + + paf0100f.set("P1_TRASMITTPAESE", paese); + paf0100f.set("P1_TRASMITTCOD", _cofi); + paf0100f.set("P1_PRGINVIO", ""); // Ci pensa SiAggPA + paf0100f.set("P1_FMTTRASMISS", "SDI11"); // SDI11 si usa dal 2015 per lo split payment (prima era SDI10) + + paf0100f.set("P1_CODDEST", hfatt); + TString80 tel; tel << firm.get(NDT_PTEL) << firm.get(NDT_TEL); + paf0100f.set("P1_TELEFONO", tel); + paf0100f.set("P1_MAIL", firm.get(NDT_MAIL)); + paf0100f.set("P1_GESTIONE", "D"); + paf0100f.insert(); + // + + // + TPaf_record paf0200f("PAF0200F"); + paf0200f.set("P2_KEYHEADERFATT", hfatt); + paf0200f.set("P2_KEYBODYFATT", bfatt); + paf0200f.remove(); + + if (_ditta.partita_IVA().full()) + { + paf0200f.set("P2_FISCIVAPAESE", paese); // Sempre IT + paf0200f.set("P2_FISCIVACOD", _ditta.partita_IVA()); + } + paf0200f.set("P2_CODFISCALE", _ditta.codice_fiscale()); + if (_ditta.fisica()) + { + paf0200f.set("P2_ANANOME", _ditta.nome()); + paf0200f.set("P2_ANACOGNOME", _ditta.cognome()); + } + else + { + paf0200f.set("P2_ANADENOMIN", _ditta.ragione_sociale()); + } + + const char* regime_fiscale = "RF01"; + if (doc.get_bool(DOC_IVAXCASSA)) + { + // Supponiamo volume d'affari > 200000, altrimenti sarebbe RF17 + regime_fiscale = "RF16"; + } + paf0200f.set("P2_REGFISCALE", regime_fiscale); + + // DatiSede + paf0200f.set("P2_SEDEIND", _ditta.via_residenza()); + paf0200f.set("P2_SEDENRCIVICO", _ditta.civico_residenza()); + paf0200f.set("P2_SEDECAP", _ditta.CAP_residenza()); + paf0200f.set("P2_SEDECOMUNE", _ditta.comune_residenza()); + paf0200f.set("P2_SEDEPROV", _ditta.provincia_residenza()); + paf0200f.set("P2_SEDENAZ", paese); + paf0200f.set("P2_GESTIONE", "D"); + + TAnagrafica cliente(doc.clifor()); + + TString rifamm = cco(doc).get("S4"); + if (rifamm.blank()) + rifamm = doc.clifor().vendite().get(CFV_PARIFAMM); + paf0200f.set("P2_RIFAMMINISTR", rifamm); + + TISAM_recordset unloc("USE UNLOC\nJOIN COMUNI INTO COM==COMCCIAA\nFROM CODDITTA=#DITTA\nTO CODDITTA=#DITTA"); + unloc.set_var("#DITTA", firm.get(NDT_CODDITTA)); + if (unloc.move_first()) + { + const TString& numrea = unloc.get(ULC_NUMCCIAA).as_string(); + if (numrea.full()) + { + paf0200f.set("P2_ISCRREANUM", numrea); + paf0200f.set("P2_ISCRREAUFF", unloc.get("13->" COM_PROVCOM)); + } + } + + if (_ditta.giuridica()) + { + TISAM_recordset anagiu("USE ANAGIU\nFROM CODANAGR=#CODICE\nTO CODANAGR=#CODICE"); + anagiu.set_var("#CODICE", firm.get(NDT_CODANAGR)); + if (anagiu.move_first()) + { + paf0200f.set("P2_ISCRREACAP", anagiu.get(ANG_CAPSOC)); + const int ss = anagiu.get(ANG_STATOSOC).as_int(); + paf0200f.set("P2_ISCRREASLIQUID", (ss==2 || ss==3) ? "LS" : "LN"); + } + } + else + paf0200f.set("P2_ISCRREASLIQUID", "LN"); + + paf0200f.insert(); + + // + + // + + TPaf_record paf0400f("PAF0400F"); + paf0400f.set("P4_KEYHEADERFATT", hfatt); + paf0400f.set("P4_KEYBODYFATT", bfatt); + paf0400f.remove(); + + if (cliente.partita_IVA().full()) + { + paf0400f.set("P4_FISCIVAPAESE", paese); + paf0400f.set("P4_FISCIVACOD", cliente.partita_IVA()); + } + paf0400f.set("P4_CODFISC", cliente.codice_fiscale()); + + if (cliente.fisica()) + { + paf0400f.set("P4_ANANOME", cliente.nome()); + paf0400f.set("P4_ANACOGNOME", cliente.cognome()); + } + else + { + paf0400f.set("P4_ANADENOM", cliente.ragione_sociale()); + } + + // DatiSede + paf0400f.set("P4_SEDEIND", cliente.via_residenza()); + paf0400f.set("P4_SEDENRCIVICO", cliente.civico_residenza()); + paf0400f.set("P4_SEDECAP", cliente.CAP_residenza()); + paf0400f.set("P4_SEDECOMUNE", cliente.comune_residenza()); + paf0400f.set("P4_SEDEPROV", cliente.provincia_residenza()); + paf0400f.set("P4_SEDENAZ", "IT"); + paf0400f.set("P4_GESTIONE", "D"); + paf0400f.insert(); + // + + // + TPaf_record paf0700f("PAF0700F"); + paf0700f.set("P7_KEYHEADERFATT", hfatt); + paf0700f.set("P7_KEYBODYFATT", bfatt); + paf0700f.remove(); + paf0700f.set("P7_TIPODOC", doc.is_nota_credito() ? "TD04" : "TD01"); + paf0700f.set("P7_DIVISA", "EUR"); // Aggiungere codice ISO 4217 a tabella divise (%VAL) + paf0700f.set("P7_DATA", doc.data()); + + const TCodice_numerazione& codnum = doc.codice_numerazione(); + TString20 numdoc; codnum.complete_num(doc.numero(), numdoc); + paf0700f.set("P7_NUMERO", numdoc); + paf0700f.set("P7_GESTIONE", "D"); + paf0700f.insert(); + + // + TPaf_record paf0900f("PAF0900F"); + paf0900f.set("P9_KEYHEADERFATT", hfatt); + paf0900f.set("P9_KEYBODYFATT", bfatt); + paf0900f.remove(); + + TString80 sconto_expr = doc.get(DOC_SCONTOPERC); + TToken_string sconti; + if (parse_sconto(sconto_expr, sconti)) + { + long nlin_sconto = 0; + FOR_EACH_TOKEN(sconti, str) + { + const real sconto = str; + if (!sconto.is_zero()) // Precauzione inutile + { + paf0900f.set("P9_RIFNUMLINEA", ++nlin_sconto); + if (sconto > ZERO) + { + paf0900f.set("P9_TIPOSCONTO", "SC"); + paf0900f.set("P9_PERCSCONTO", sconto); + } + else + { + paf0900f.set("P9_TIPOSCONTO", "MG"); + paf0900f.set("P9_PERCSCONTO", -sconto); + } + paf0900f.set("P9_GESTIONE", "D"); + paf0900f.insert(); + } + } + } + // + + // + TPaf_record paf2700f("PAF2700F"); + paf2700f.set("PQ_KEYHEADERFATT", hfatt); + paf2700f.set("PQ_KEYBODYFATT", bfatt); + paf2700f.remove(); + paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc()); + + const TRectype& cont_conv_off = cco(doc); + TString causale = cont_conv_off.get("S1"); + if (causale.full()) + { + causale << ' ' << cont_conv_off.get("S2"); + causale << ' ' << cont_conv_off.get("S3"); + causale.strip_double_spaces(); + causale.cut(200); + } + else + causale = doc.tipo().descrizione(); + paf2700f.set("PQ_CAUSALE", causale); + // paf2700f.set("PQ_ART73", true); + paf2700f.set("PQ_GESTIONE", "D"); + paf2700f.insert(); + // + + // Azzera contratti + TPaf_record paf1000f("PAF1000F"); + paf1000f.set("P0_KEYHEADERFATT", hfatt); + paf1000f.set("P0_KEYBODYFATT", bfatt); + paf1000f.remove(); + + // Azzera convenzioni + TPaf_record paf1100f("PAF1100F"); + paf1100f.set("PA_KEYHEADERFATT", hfatt); + paf1100f.set("PA_KEYBODYFATT", bfatt); + paf1100f.remove(); + + // Azzera ordini + TPaf_record paf1200f("PAF1200F"); + paf1200f.set("PB_KEYHEADERFATT", hfatt); + paf1200f.set("PB_KEYBODYFATT", bfatt); + paf1200f.remove(); + + // Azzera DDT + TPaf_record paf1600f("PAF1600F"); + paf1600f.set("PF_KEYHEADERFATT", hfatt); + paf1600f.set("PF_KEYBODYFATT", bfatt); + paf1600f.remove(); + + const TString16 cup = doc.get(DOC_CUP); + const TString16 cig = doc.get(DOC_CIG); + const TString80 com = doc.get(DOC_CODCMS); + + TString80 con = doc.get(DOC_CONTRATTO); + if (con.full() || cup.full() || cig.full()) + { + char tcon = doc.get_char(DOC_MODPAG); + if (tcon < 'C') tcon = 'C'; + + TDate datadoc; // Data contratto non obbligatoria + if (con.full()) + { + datadoc = cco(doc).get_date("D0"); + } + else + { + // IdDocumento obbligatorio + con = cig; + if (con.blank()) + con = cup; + } + + if (tcon == 'O') + { + paf1000f.set("P0_RIFNUMLINEA", 0L); + paf1000f.set("P0_IDDOC", con); + paf1000f.set("P0_DATADOC", datadoc); + paf1000f.set("P0_COMMCONVENZ", com); + paf1000f.set("P0_CODCUP", cup); + paf1000f.set("P0_CODCIG", cig); + paf1000f.set("P0_GESTIONE", "D"); + paf1000f.insert(); + } else + if (tcon == 'C') + { + paf1100f.set("PA_RIFNUMLINEA", 0L); + paf1100f.set("PA_IDDOC", con); + paf1100f.set("PA_DATADOCU", datadoc); + paf1100f.set("PA_COMMCONVENZ", com); + paf1100f.set("PA_CODCUP", cup); + paf1100f.set("PA_CODCIG", cig); + paf1000f.set("PA_GESTIONE", "D"); + paf1100f.insert(); + } + else + { + paf1200f.set("PB_RIFNUMLINEA", 0L); + paf1200f.set("PB_IDDOC", con); + paf1200f.set("PB_DATADOCO", datadoc); + paf1200f.set("PB_COMMCONVENZ", com); + paf1200f.set("PB_CODCUP", cup); + paf1200f.set("PB_CODCIG", cig); + paf1200f.set("PB_GESTIONE", "D"); + paf1200f.insert(); + } + } + + if (cup.blank() && cig.blank()) + log(1, "CIG e CUP assenti"); + + // + + TPaf_record paf1800f("PAF1800F"); + paf1800f.set("PI_KEYHEADERFATT", hfatt); + paf1800f.set("PI_KEYBODYFATT", bfatt); + paf1800f.remove(); // Cancella tutte le righe documento + + TPaf_record paf2000f("PAF2000F"); + paf2000f.set("PJ_KEYHEADERFATT", hfatt); + paf2000f.set("PJ_KEYBODYFATT", bfatt); + paf2000f.remove(); // Cancella tutti gli sconti di riga + + long riga = 0; + TString16 codivadefault; + { + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + codivadefault = rdoc->get(RDOC_CODIVA); + if (codivadefault.full()) + break; + } + } + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + paf1800f.reset(); + paf1800f.set("PI_KEYHEADERFATT", hfatt); + paf1800f.set("PI_KEYBODYFATT", bfatt); + paf1800f.set("PI_NUMEROLINEA", ++riga); + paf1800f.set("PI_DESCRIZIONE", descrizione(*rdoc)); +// paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione + + + set_IVA(codivadefault, paf1800f); + + if (rdoc->is_merce()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + const real qta = rdoc->get(RDOC_QTA); + if (qta.is_zero()) + { + TString msg; msg.format("La riga merce %d ha quantità nulla", riga); + log(1, msg); + } + if (qta >= ZERO) + { + paf1800f.set("PI_QUANTITA", qta); + paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); + } + else + { + paf1800f.set("PI_QUANTITA", -qta); + paf1800f.set("PI_PREZZOUNIT", -rdoc->prezzo(true, false)); + } + paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); + set_IVA(*rdoc, paf1800f); + + /* + const TDate data = doc.get(DOC_DATADOC); + paf1800f.set("PI_DTINIZIOPER", data); + paf1800f.set("PI_DTFINEPER", data); + */ + + // + + sconto_expr = rdoc->get(RDOC_SCONTO); + if (parse_sconto(sconto_expr, sconti)) + { + long nlin_sconto = 0; + FOR_EACH_TOKEN(sconti, str) + { + const real perc = str; + if (!perc.is_zero()) + { + paf2000f.set("PJ_KEYNLINEA", (long)r); + paf2000f.set("PJ_KEYNPROGR", ++nlin_sconto); + if (perc > ZERO) + { + paf2000f.set("PJ_TIPOSCONTO", "SC"); + paf2000f.set("PJ_PERCSCONTO", perc); + } + else + { + paf2000f.set("PJ_TIPOSCONTO", "MG"); + paf2000f.set("PJ_PERCSCONTO", -perc); + } + paf2000f.set("PJ_GESTIONE", "D"); + paf2000f.insert(); + } + } + } + // + + TArray ancestors; find_ancestors(*rdoc, ancestors); + for (int i = ancestors.last(); i > 0; i = ancestors.pred(i)) + { + const TAncestor& a = (const TAncestor&)ancestors[i]; + if (i == 1) + { + TPaf_record paf1600f("PAF1600F"); + paf1600f.reset(); + paf1600f.set("PF_KEYHEADERFATT", hfatt); + paf1600f.set("PF_KEYBODYFATT", bfatt); + paf1600f.set("PF_RIFNUMLINEA", (long)r); + paf1600f.set("PF_NUMDDDT", a._numdoc); + paf1600f.set("PF_DATADDT", a._datadoc); + paf1600f.set("PF_GESTIONE", "D"); + paf1600f.insert(); + } else + if (i == 3) + { + TPaf_record paf1000f("PAF1000F"); + paf1000f.set("P0_KEYHEADERFATT", hfatt); + paf1000f.set("P0_KEYBODYFATT", bfatt); + paf1000f.set("P0_RIFNUMLINEA", (long)r); + paf1000f.set("P0_IDDOC", a._numdoc); + paf1000f.set("P0_DATADOC", a._datadoc); + paf1000f.set("P0_COMMCONVENZ", com); + paf1000f.set("P0_CODCUP", cup); + paf1000f.set("P0_CODCIG", cig); + paf1000f.set("P0_GESTIONE", "D"); + paf1000f.insert(); + } + } + } else + if (rdoc->is_spese()) + { + const TSpesa_prest& sp = rdoc->spesa(); + const real imp = rdoc->importo(true, false); + real qta = UNO; + if (sp.is_tipo()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + qta = rdoc->get_real(RDOC_QTA); + if (qta.is_zero()) + { + TString msg; msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, (const char*)rdoc->field_qta()); + log(1, msg); + qta = UNO; + } + paf1800f.set("PI_QUANTITA", qta); + } + real prz = imp; + if (qta != UNO) + { + prz = rdoc->prezzo(true, false); + if (prz.is_zero() && !imp.is_zero()) + { + const TPrice price(imp / qta); + prz = price.get_value(); + } + } + paf1800f.set("PI_PREZZOUNIT", prz); + paf1800f.set("PI_PRZTOTALE", imp); + set_IVA(*rdoc, paf1800f); + } else + if (rdoc->is_prestazione()) + { + paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); + real qta = rdoc->get(RDOC_QTA); if (qta.is_zero()) qta = UNO; + paf1800f.set("PI_QUANTITA", qta); + paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); + paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); + set_IVA(*rdoc, paf1800f); + } + + paf1800f.set("PI_GESTIONE", "D"); + paf1800f.insert(); + } + // + + // + TPaf_record paf2200f("PAF2200F"); + paf2200f.set("PL_KEYHEADERFATT", hfatt); + paf2200f.set("PL_KEYBODYFATT", bfatt); + paf2200f.remove(); // Cancella tutte le righe di riepilogo IVA + + const char* eiva = "I"; // Esigibilità IVA: Immediata, Differita, Split payment + if (doc.is_split_payment()) + eiva = "S"; else + if (doc.get_bool(DOC_LIQDIFF) || doc.get_bool(DOC_IVAXCASSA)) + eiva = "D"; + + long num_riep = 0; + TAssoc_array& tiva = doc.tabella_iva(false); + FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm) + { + const TRiepilogo_iva& riva = *(const TRiepilogo_iva*)itm; + const real aliquota = riva.cod_iva().percentuale(); + paf2200f.set("PL_KEYNPROGR", ++num_riep); + paf2200f.set("PL_ALIQUOTAIVA", aliquota); + if (aliquota.is_zero()) + paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice())); + + paf2200f.set("PL_IMPONIBILE", riva.imponibile()); + paf2200f.set("PL_IMPOSTA", riva.imposta()); + paf2200f.set("PL_ESIGIVA", eiva); + if (*eiva == 'S') + paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72"); + else + paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione()); + paf2200f.set("PL_GESTIONE", "D"); + paf2200f.insert(); + } + // + + // + TPaf_record paf2400f("PAF2400F"); + paf2400f.set("PN_KEYHEADERFATT", hfatt); + paf2400f.set("PN_KEYBODYFATT", bfatt); + paf2400f.remove(); // Cancella i dati pagamento + + TPagamento& pag = doc.pagamento(); + doc.scadenze_recalc(); // Ricalcola array delle rate + TString_array& scad = doc.scadenze(); + const int nrate = scad.items(); // Conta rate generate + const char* rateazione = nrate > 1 ? "TP01" : "TP02"; // A rate (TP01) o una soluzione(TP02)? + paf2400f.set("PN_CONDPAGAMENTO", rateazione); + paf2400f.set("PN_GESTIONE", "D"); + paf2400f.insert(); + + TPaf_record paf2500f("PAF2500F"); + paf2500f.set("PO_KEYHEADERFATT", hfatt); + paf2500f.set("PO_KEYBODYFATT", bfatt); + paf2500f.remove(); // Cancella tutte le rate + + // Imposto i campi uguali per tutte le rate + paf2500f.set("PO_CONDPAGAMENTO", rateazione); // Condizione di pagamento PA + paf2500f.set("PO_CODICEPAGAM", pag.code()); // Condizione di pagamento CAMPO + + TString80 iban, istituto; + TString8 abi, cab; + if (get_bank(doc, iban, abi, cab, istituto)) + { + paf2500f.set("PO_ISTFINANZ", istituto); + paf2500f.set("PO_IBAN", iban); + paf2500f.set("PO_ABI", abi); + paf2500f.set("PO_CAB", cab); + } + + if (cab.blank()) + log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento")); else + if (iban.blank()) + log(1, TR("Non è presente il codice IBAN per il pagamento")); + + for (int nr = 0; nr < nrate; nr++) + { + paf2500f.set("PO_KEYNPROGR", long(nr+1)); // Numero rata + + const char* mod_pag = "MP01"; // Modalità di pagamento + const int n = nr < pag.n_rate() ? nr : 0; // Si assicura che il numero riga sia accettabile + switch (pag.tipo_rata(n)) + { + case _bonfico: mod_pag = "MP05"; break; // bonifico + case _rid : mod_pag = "MP09"; break; // RID + case _ric_ban: mod_pag = "MP12"; break; // RIBA + default : mod_pag = "MP01"; break; // contanti + } + paf2500f.set("PO_MODALITAPAGAM", mod_pag); + + TToken_string& riga = scad.row(nr); // Data|Importo + paf2500f.set("PO_DATASCADENZA", TDate(riga.get(0))); // Data scadenza + paf2500f.set("PO_IMPORTO", real(riga.get())); // Importo rata + + paf2500f.set("PO_GESTIONE", "D"); + paf2500f.insert(); + } + + TPaf_record paf2600f("PAF2600F"); + paf2600f.set("PP_KEYHEADERFATT", hfatt); + paf2600f.set("PP_KEYBODYFATT", bfatt); + paf2600f.remove(); // Cancella eventuali allegati + TToken_string allegati(doc.get("COLL_GOLEM"),'\n'); + if (allegati.full()) + { + long nprogr = 0; // Numero di file allegati + TFilename fname; + FOR_EACH_TOKEN(allegati, row) + { + const TToken_string entry(row); + if (entry.get(0, fname) && fname.exist()) + { + paf2600f.set("PP_KEYNPROGR", ++nprogr); + paf2600f.set("PP_NOMEATTACHMENT", fname.name()); + paf2600f.set("PP_ATTACHMENT", fname); + fname.upper(); // serve estensione maiuscola + paf2600f.set("PP_FMTATTACHMENT", fname.ext()); + paf2600f.insert(); + } + } + } + + // + + return true; +} + +bool TDoc2Paf::elabora(const TRectype& rec) +{ + TDocumentoEsteso doc; + if (doc.read(rec) == NOERR) + { + return elabora(doc) ? db().sq_commit() : db().sq_rollback(); + } + return false; +} + +bool TDoc2Paf::elabora(const TDoc_key& key) +{ + TRectype rec(LF_DOC); + rec.put(DOC_PROVV, key.provv()); + rec.put(DOC_ANNO, key.anno()); + rec.put(DOC_CODNUM, key.codnum()); + rec.put(DOC_NDOC, key.ndoc()); + return elabora(rec); +} + +bool TDoc2Paf::elabora(const TFilename& ini) +{ + TConfig cfg(ini, "33"); + const int anno = cfg.get_int(DOC_ANNO); + const long ndoc = cfg.get_long(DOC_NDOC); + const TFixed_string codnum(cfg.get(DOC_CODNUM)); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + return elabora(key); +} + +/* +bool TDoc2Paf::genera_xml() +{ + #define PABASE "SiaggPA" + + TFilename tmp; + + // Copia eventuali protezioni software + TString_array files; + if (list_files(PABASE"/*.ssa", files) == 0) + { + list_files("*.ssa", files); + FOR_EACH_ARRAY_ROW(files, i, row) + { + tmp = PABASE; tmp.add(*row); + xvt_fsys_fupdate(*row, tmp); + } + } + files.destroy(); + if (list_files(PABASE"/*.ssa", files) != 1) + warning_box(FR("Nella cartella %s deve essere presente esattamente un file .ssa"), PABASE); + + TFilename home; + xvt_sys_get_env("USERPROFILE", home.get_buffer(), home.size()); + home.add("SoftwareSirio"); home.add(PABASE); + if (!dexist(home)) + make_dir(home); + + tmp = home; tmp.add("config.properties"); + xvt_fsys_fupdate(PABASE"/config.properties", tmp); + + tmp = home; tmp.add("configGUI.properties"); + xvt_fsys_fupdate(PABASE"/configGUI.properties", tmp); + + if (tmp.exist()) + { + TJava_profile prop(tmp); + if (prop.get("percorso").blank()) + prop.set("percorso", _dbname.path()); + prop.set("nomePAF", _dbname); + } + else + cantread_box(tmp); + + tmp = PABASE"\\SiaggPACAMPO.jar"; + tmp.make_absolute_path(); + + DIRECTORY old_dir; xvt_fsys_get_dir(&old_dir); + DIRECTORY new_dir; xvt_fsys_convert_str_to_dir(tmp.path(), &new_dir); + xvt_fsys_set_dir(&new_dir); + const bool good = goto_url(tmp); + if (good) + xvt_sys_sleep(3000); + else + error_box(FR("Impossibile eseguire Java -jar %s"), (const char*)tmp); + xvt_fsys_set_dir(&old_dir); + + return good; +} +*/ +void TDoc2Paf::main_loop() +{ + int ndocs = 0; + for (int a = 1; a < argc(); a++) + { + TFilename ini = argv(a); + if (ini.starts_with("-i", true) || ini.starts_with("/i", true)) + ini.ltrim(2); + if (ini.exist() && elabora(ini)) + ndocs++; + else + { + if (ini.find('*') >= 0 || ini.find('?') >= 0) + { + TString_array f; list_files(ini, f); + FOR_EACH_ARRAY_ROW(f, r, row) + { + ini = *row; + if (ini.exist() && elabora(ini)) + ndocs++; + } + } + } + } + if (ndocs > 0) + { + show_log(); + //if (show_log()) + //genera_xml(); + return; + } + + TPA_mask mask; + mask.set(F_COFI, _cofi); + while (mask.run() == K_ENTER) + { + _cofi = mask.get(F_COFI); + + TString_array& sht = mask.sfield(F_DOCS).rows_array(); + if (!sht.empty()) + { + TProgress_monitor pi(sht.items(), NULL); + ndocs = 0; + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (riga->starts_with("X")) + { + const int anno = riga->get_int(1); + const long ndoc = riga->get_long(3); + const TFixed_string codnum(riga->get(2)); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + if (elabora(key)) + ndocs++; + } + if (!pi.add_status(1)) + break; + } + message_box(FR("Sono stati elaborati %d documenti"), ndocs); + } + + if (ndocs > 0 && show_log()) + //genera_xml(); + return; + } +} + +bool TDoc2Paf::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, + LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, + LF_DOC, LF_RIGHEDOC, 0); + + TRectype cfven(LF_CFVEN); + if (cfven.type(CFV_PARIFAMM) != _alfafld) + return error_box(TR("Database non convertito per fatturazione P.A.")); + + _ditta.init(LF_NDITTE, prefix().get_codditta()); + + _cofi = ini_get_string(CONFIG_DITTA, "pa", "TRASMITTCOD"); + if (_cofi.blank()) + _cofi = _ditta.codice_fiscale(); + + return check_tables() && TSkeleton_application::create(); +} + +bool TDoc2Paf::destroy() +{ + if (_cofi.full()) + ini_set_string(CONFIG_DITTA, "pa", "TRASMITTCOD", _cofi); + + db().sq_disconnect(); + return TSkeleton_application::destroy(); +} + +int fp0300(int argc, char* argv[]) +{ + TDoc2Paf d2p; + d2p.run(argc, argv, TR("Fatturazione P.A.")); + return 0; +} diff --git a/src/fp/fp0300a.h b/src/fp/fp0300a.h new file mode 100644 index 000000000..edf4ab1d1 --- /dev/null +++ b/src/fp/fp0300a.h @@ -0,0 +1,26 @@ +#define START_MASK 301 +#define F_DATAINI 301 +#define F_DATAEND 302 +#define F_FATTSEL 303 +#define F_COFI 304 +#define F_DATIPODOC 305 +#define F_ATIPODOC 306 +#define END_MASK 399 + +#define F_DOCS 201 + +#define S_SELECTED 101 +#define S_ANNO 102 +#define S_CODNUM 103 +#define S_TIPODOC 104 +#define S_CODSDI 105 +#define S_NDOC 106 +#define S_DATADOC 107 +#define S_CLIENTE 108 +#define S_RAGSOC 109 +#define S_UFFICIO 110 +#define S_RIFAMM 111 +#define S_COFI 112 +#define S_SPLITPAY 113 +#define S_ATTACH 114 +#define S_ONLYGEN 115 diff --git a/src/fp/fp0300a.uml b/src/fp/fp0300a.uml new file mode 100644 index 000000000..b37f449f5 --- /dev/null +++ b/src/fp/fp0300a.uml @@ -0,0 +1,223 @@ +#include "fp0300a.h" + +TOOLBAR "topbar" 0 0 0 2 + +#include +ENDPAGE + +PAGE "Fatture Pubblica Amministrazione" 0 2 0 0 + +DATE F_DATAINI +BEGIN + PROMPT 1 0 "Data iniziale" + CHECKTYPE REQUIRED +END + +DATE F_DATAEND +BEGIN + PROMPT 30 0 "Data finale" + VALIDATE DATE_CMP_FUNC >= F_DATAINI + WARNING "La data finale non può essere minore della data iniziale" + CHECKTYPE REQUIRED +END + +RADIOBUTTON F_FATTSEL 25 +BEGIN + PROMPT 1 1 "Fatture da visualizzare" + ITEM "|Da inviare" + ITEM "P|Pronte" + ITEM "X|XML Generato" + ITEM "E|In errore" + ITEM "N|Accettate" +END + +STRING F_COFI 16 +BEGIN + PROMPT 30 1 "Codice fiscale trasmittente " + CHECKTYPE REQUIRED +END + +STRING F_DATIPODOC 4 +BEGIN + PROMPT 30 2 "Da tipo doc " + FIELD TIPODOC + HELP "Codice tipo documento" + USE %TIP + SELECT S12!="" + INPUT CODTAB F_DATIPODOC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo SDI@10" S12 + OUTPUT F_DATIPODOC CODTAB + CHECKTYPE FORCED + FLAG "UP" +END + +STRING F_ATIPODOC 4 +BEGIN + PROMPT 30 3 "A tipo doc " + FIELD TIPODOC + HELP "Codice tipo documento" + USE %TIP + SELECT S12!="" + INPUT CODTAB F_ATIPODOC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo SDI@10" S12 + OUTPUT F_ATIPODOC CODTAB + CHECKTYPE FORCED + FLAG "UP" +END + +STRING DLG_PROFILE 256 +BEGIN + PROMPT 1 -1 "Profilo " + PSELECT + FLAGS "H" +END + +ENDPAGE + +PAGE "Elenco Fatture" 0 2 0 0 + +SPREADSHEET F_DOCS +BEGIN + PROMPT 0 2 "" + ITEM "@1" + ITEM "Anno" + ITEM "Cod.\nNum.@4" + ITEM "Tipo\nDoc@4" + ITEM "Tipo SDI@4" + ITEM "Num.\nDoc.@7" + ITEM "Data\nDoc.@10" + ITEM "Cliente" + ITEM "Ragione Sociale@50" + ITEM "Codice destinatario" + ITEM "Riferimento\nAmministrazione@20" + ITEM "Codice Fiscale@16" + ITEM "Scissione\nPagamenti@9" + ITEM "Allegati" + ITEM "Solo generazione" +END + +ENDPAGE + +ENDMASK + +PAGE "Documento" -1 -1 78 9 + +BOOLEAN S_SELECTED +BEGIN + PROMPT 1 1 "Da elaborare" +END + +NUMBER S_ANNO 4 +BEGIN + PROMPT 1 2 "Anno " + FLAGS "D" +END + +STRING S_CODNUM 4 +BEGIN + PROMPT 21 2 "Numerazione " + FLAGS "D" +END + +STRING S_TIPODOC 4 +BEGIN + PROMPT 21 2 "Tipo Documento " + FLAGS "D" +END + +STRING S_CODSDI 4 +BEGIN + PROMPT 41 2 "Tipo SDI " + FLAGS "D" +END + +NUMBER S_NDOC 7 +BEGIN + PROMPT 1 3 "Numero " + FLAGS "D" +END + +DATE S_DATADOC +BEGIN + PROMPT 21 3 "Data " + FLAGS "D" +END + +NUMBER S_CLIENTE 6 +BEGIN + PROMPT 1 4 "Cliente " + FLAGS "D" +END + +STRING S_RAGSOC 50 +BEGIN + PROMPT 21 4 "" + FLAGS "D" +END + +STRING S_UFFICIO 6 +BEGIN + PROMPT 1 5 "" + FLAGS "D" +END + +STRING S_RIFAMM 20 +BEGIN + PROMPT 21 5 "" + FLAGS "D" +END + +STRING S_COFI 20 +BEGIN + PROMPT 1 6 "" + FLAGS "D" +END + +BOOLEAN S_SPLITPAY +BEGIN + PROMPT 1 7 "Assogettato scissione pagamenti art.17 ter DPR 633/72" + FLAGS "D" +END + +BOOLEAN S_ATTACH +BEGIN + PROMPT 1 8 "Documenti in allegato" + FLAGS "D" +END + +BOOLEAN S_ONLYGEN +BEGIN + PROMPT 20 8 "Solo generazione" + FLAGS "D" +END + + +ENDPAGE + +TOOLBAR "Documento" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_USER 2 2 +BEGIN + PROMPT 1 1 "Collega" + PICTURE TOOL_LINK +END + + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + + +ENDPAGE + +ENDMASK diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp new file mode 100644 index 000000000..b4a171dd5 --- /dev/null +++ b/src/fp/fplib01.cpp @@ -0,0 +1,102 @@ +#include "fplib01.h" +#include +#include +#include +#include +#include +#include +#include "text.h" +#include + +void set_connection(SSimple_query& s) +{ + if (s.sq_connect( + TString() << ini_get_string(CONFIG_DITTA, "fp", "ip") << "@" << ini_get_string(CONFIG_DITTA, "fp", "db"), + ini_get_string(CONFIG_DITTA, "fp", "usr"), + decode(ini_get_string(CONFIG_DITTA, "fp", "psw")), + TSDB_MSSQL) != NOERR) + fatal_box("Impossibile connettersi al DB esterno"); + +} + +SSimple_query& db() +{ + static SSimple_query* db = nullptr; + + if (db == nullptr) + { + db = new SSimple_query(); + set_connection(*db); + // Non utilizzo l'autocommit, viene gestito manualmente + db->sq_set_autocommit(false); + } + return *db; +} + +string getline(ifstream& f); + +bool check_tables() +{ + /* + * Da questo programma in poi verrà utilizzato un sistema diverso per la creazione e aggiornamento delle tabelle + * Verranno utilizzati dei file.sql aggiornati con il numero di patch, leggermente scomodo durante la creazione ma facile per i controlli successivamente + */ + SLIST files = xvt_fsys_list_files(".sql", "sql/fp0/", false); + TLocalisamfile tabmod(LF_TABMOD); + tabmod.put("MOD", "FP"); + tabmod.put("COD", "SQL"); + tabmod.put("CODTAB", "VERSION"); + TString version; + if (tabmod.read() == NOERR) + version = tabmod.get("S0"); + for(SLIST_ELT file = xvt_slist_get_first(files); file; file = xvt_slist_get_next(files, file)) + { + TString file_version = TFilename(file->str).name_only(); + file_version = file_version.mid(2, 4); + if (file_version <= version) + continue; + ifstream f(file->str); + if(f.is_open()) + { + string s; + while(!f.eof()) + { + s += getline(f); + // Cerco un ; + const int limiter = s.find(';') + 1; + if(limiter > 0) + { + string query = s.substr(0, limiter); + s.erase(0, limiter); + if(!db().sq_set_exec(query) || !db().sq_commit()) + { + fatal_box("Impossibile eseguire/salvare la query:\n%s\n%s", query.c_str(), db().sq_get_string_error()); + } + } + } + } + else + { + cantread_box(file->str); + return false; + } + // Salvo su tabmod + tabmod.zero(); + tabmod.put("MOD", "FP"); + tabmod.put("COD", "SQL"); + tabmod.put("CODTAB", "VERSION"); + tabmod.put("S0", file_version); + if(tabmod.rewrite_write() != NOERR && !yesno_box("Attenzione! Errore di aggiornamento versione di Database in Campo, continuare? %s", file_version)) + { + return false; + } + } + return true; +} + +string getline(ifstream& f) +{ + string app; + getline(f, app); + return app; +} \ No newline at end of file diff --git a/src/fp/fplib01.h b/src/fp/fplib01.h new file mode 100644 index 000000000..15dc287c6 --- /dev/null +++ b/src/fp/fplib01.h @@ -0,0 +1,13 @@ +#ifndef __FPLIB01_H +#define __FPLIB01_H + +#include +#include +#include + +#define SQL_FLD "sql/" + +SSimple_query& db(); +bool check_tables(); + +#endif // __FPLIB01_H diff --git a/src/fp/sql/fp0100.sql b/src/fp/sql/fp0100.sql new file mode 100644 index 000000000..5fc52d8f6 --- /dev/null +++ b/src/fp/sql/fp0100.sql @@ -0,0 +1,1656 @@ +CREATE TABLE FPCDD00F ( + PV_AMBIENTE CHAR(10), + PV_DESCAMPO1 CHAR(20), + PV_DESCAMPO2 CHAR(20), + PV_DESCAMPO3 CHAR(20), + PV_DESCAMPO4 CHAR(20), + PV_DESCAMPO5 CHAR(20)) ; + +ALTER TABLE FPCDD00F + ADD CONSTRAINT FPCDD00Q + UNIQUE( PV_AMBIENTE ) ; + +CREATE TABLE FPCDE00F ( + PX_CODDEST CHAR(7), + PX_FISCIVAPAESE CHAR(2), + PX_FISCIVACOD CHAR(28), + PX_CODFISCALE CHAR(16), + PX_PEC CHAR(255), + PX_DESDEST CHAR(35), + PX_AMBIENTE CHAR(10), + PX_GESPROT CHAR(1), + PX_CLASSE CHAR(2), + PX_UTEGEST CHAR(10), + PX_SETGEST CHAR(2), + PX_PERCORSO CHAR(255), + PX_CAMPO1 CHAR(20), + PX_CAMPO2 CHAR(20), + PX_CAMPO3 CHAR(20), + PX_CAMPO4 CHAR(20), + PX_CAMPO5 CHAR(20), + PX_FILLER1 CHAR(100), + PX_FILLER2 CHAR(100)) ; + +ALTER TABLE FPCDE00F + ADD CONSTRAINT FPCDEE0Q + UNIQUE( PX_CODDEST , PX_FISCIVAPAESE , PX_FISCIVACOD , PX_CODFISCALE ) ; + +CREATE TABLE FPERR00K ( + PXFANN CHAR(1), + PXPRGI CHAR(10), + PXHFAT CHAR(20), + PXBFAT CHAR(50), + PXUHRI DATE, + PXTDOC CHAR(4), + PXNFAT CHAR(20), + PXUFAT DATE, + PXCFOR CHAR(10), + PXNFIL CHAR(20), + PXNLIN NUMERIC(4, 0), + PXNERR NUMERIC(4, 0), + PXCERR CHAR(5), + PXDERR CHAR(150), + PXCAMP CHAR(15), + PXDATO CHAR(150), + PXFINT CHAR(1), + PXCUIN CHAR(10), + PXDTIN DATE, + PXHOIN TIME, + CONSTRAINT FPERR00Q PRIMARY KEY( PXPRGI , PXHFAT , PXBFAT , PXUHRI , PXNFIL , PXNLIN , PXNERR ) ) ; + +CREATE TABLE FPPRO00F ( + PZ_STATO CHAR(1), + PZ_NRAZIONE NUMERIC(9, 0), + PZ_DTAZIONE NUMERIC(8, 0), + PZ_USAZIONE CHAR(10), + PZ_KEYPRGINVIO CHAR(10), + PZ_KEYHEADERFATT CHAR(20), + PZ_KEYBODYFATT CHAR(50), + PZ_TIPODOC CHAR(4), + PZ_DATA DATE, + PZ_NUMERO CHAR(20), + PZ_STATOELAB CHAR(1), + PZ_GESTIONE CHAR(1), + PZ_ERRINT CHAR(1), + PZ_DATAPROT DATE, + PZ_USERPROT CHAR(10), + PZ_CLASPROT CHAR(2), + PZ_TIPOPROT CHAR(2), + PZ_ANNOPROT NUMERIC(4, 0), + PZ_NUMPROT NUMERIC(10, 0), + PZ_TIPOCF CHAR(1), + PZ_CLIFOR CHAR(10), + PZ_SETGEST CHAR(2), + PZ_UTEGEST CHAR(10), + PZ_DATAACCET DATE, + PZ_UTENACCET CHAR(10), + PZ_DATACONT DATE, + PZ_UTENCONT CHAR(10), + PZ_TIPOREGCONT CHAR(6), + PZ_NUMREGCONT NUMERIC(20, 0), + PZ_DATAREGCONT DATE, + PZ_TIPOCONT CHAR(1), + PZ_DATAARCH DATE, + PZ_UTENARCH CHAR(10), + PZ_TIPOARC CHAR(1), + PZ_STATOPROT CHAR(1), + PZ_IDDOCR CHAR(20), + PZ_DATADOCR DATE, + PZ_CODCUP CHAR(15), + PZ_CODCIG CHAR(15), + PZ_IMPTOTDOC NUMERIC(15, 2), + PZ_IMPCALDOC NUMERIC(15, 2), + PZ_IMPTOTPAG NUMERIC(15, 2), + PZ_IMPCALPAG NUMERIC(15, 2), + PZ_NOMXML CHAR(255), + PZ_DATAORARIC DATE, + PZ_DATASTATO DATE, + PZ_FMTTRASMISS CHAR(5), + PZ_CODDEST CHAR(7), + PZ_NOTAFATT CHAR(255), + PZ_AMBIENTE CHAR(10), + PZ_FILLER1 CHAR(100), + PZ_FILLER2 CHAR(100)) ; + +ALTER TABLE FPPRO00F + ADD CONSTRAINT FPPRO00Q + UNIQUE( PZ_KEYPRGINVIO , PZ_KEYHEADERFATT , PZ_KEYBODYFATT , PZ_AMBIENTE ) ; + + +CREATE TABLE PAA0100F ( + P1_KEYPRGINVIO CHAR(10), + P1_KEYHEADERFATT CHAR(20), + P1_KEYBODYFATT CHAR(50), + P1_TRASMITTPAESE CHAR(2), + P1_TRASMITTCOD CHAR(28), + P1_PRGINVIO CHAR(10), + P1_FMTTRASMISS CHAR(5), + P1_CODDEST CHAR(7), + P1_TELEFONO CHAR(12), + P1_MAIL CHAR(255), + P1_GESTIONE CHAR(1), + P1_ERRINT CHAR(1), + P1_ERREST CHAR(1), + P1_NOMXML CHAR(255), + P1_DATAORARIC DATE, + P1_DATASTATO DATE, + P1_STATOELAB CHAR(1)) ; + +ALTER TABLE PAA0100F + ADD CONSTRAINT PAA0100Q + UNIQUE( P1_KEYPRGINVIO , P1_KEYHEADERFATT , P1_KEYBODYFATT , P1_DATAORARIC ) ; + +CREATE TABLE PAA0200F ( + P2_KEYPRGINVIO CHAR(10), + P2_KEYHEADERFATT CHAR(20), + P2_KEYBODYFATT CHAR(50), + P2_FISCIVAPAESE CHAR(2), + P2_FISCIVACOD CHAR(28), + P2_CODFISCALE CHAR(16), + P2_ANADENOMIN CHAR(80), + P2_ANANOME CHAR(60), + P2_ANACOGNOME CHAR(60), + P2_ANATITOLO CHAR(10), + P2_ANACODEORI CHAR(17), + P2_ALBOPROFESS CHAR(60), + P2_PROVALBO CHAR(2), + P2_NRISCRIZALBO CHAR(60), + P2_DTISCRIZEALBO DATE , + P2_REGFISCALE CHAR(4), + P2_SEDEIND CHAR(60), + P2_SEDENRCIVICO CHAR(8), + P2_SEDECAP NUMERIC(5, 0), + P2_SEDECOMUNE CHAR(60), + P2_SEDEPROV CHAR(2), + P2_SEDENAZ CHAR(2), + P2_STABORGIND CHAR(60), + P2_STABORGNRCIVICO CHAR(8), + P2_STABORGCAP NUMERIC(5, 0), + P2_STABORGCOMUNE CHAR(60), + P2_STABORGPROV CHAR(2), + P2_STABORGNAZ CHAR(2), + P2_ISCRREAUFF CHAR(2), + P2_ISCRREANUM CHAR(20), + P2_ISCRREACAP NUMERIC(15, 2), + P2_ISCRREASOCIOU CHAR(2), + P2_ISCRREASLIQUID CHAR(2), + P2_CONTATTITELEF CHAR(12), + P2_CONTATTIFAX CHAR(12), + P2_CONTATTIMAIL CHAR(255), + P2_RIFAMMINISTR CHAR(20), + P2_NOMEFILE CHAR(255), + P2_GESTIONE CHAR(1), + P2_ERRINT CHAR(1), + P2_ERREST CHAR(1)) ; + +ALTER TABLE PAA0200F + ADD CONSTRAINT PAA0200Q + UNIQUE( P2_KEYPRGINVIO , P2_KEYHEADERFATT , P2_KEYBODYFATT ) ; + +CREATE TABLE PAA0300F ( + P3_KEYPRGINVIO CHAR(10), + P3_KEYHEADERFATT CHAR(20), + P3_KEYBODYFATT CHAR(50), + P3_FISCIVAPAESE CHAR(2), + P3_FISCIVACODICE CHAR(28), + P3_CODFISC CHAR(16), + P3_ANADENOMI CHAR(80), + P3_ANANOME CHAR(60), + P3_ANACOGNOME CHAR(60), + P3_ANATITOLO CHAR(10), + P3_ANACODEORI CHAR(17), + P3_GESTIONE CHAR(1), + P3_ERRINT CHAR(1), + P3_ERREST CHAR(1)) ; + +ALTER TABLE PAA0300F + ADD CONSTRAINT PAA0300Q + UNIQUE( P3_KEYPRGINVIO , P3_KEYHEADERFATT , P3_KEYBODYFATT ) ; + +CREATE TABLE PAA0400F ( + P4_KEYPRGINVIO CHAR(10), + P4_KEYHEADERFATT CHAR(20), + P4_KEYBODYFATT CHAR(50), + P4_FISCIVAPAESE CHAR(2), + P4_FISCIVACOD CHAR(28), + P4_CODFISC CHAR(16), + P4_ANADENOM CHAR(80), + P4_ANANOME CHAR(60), + P4_ANACOGNOME CHAR(60), + P4_ANATITOLO CHAR(10), + P4_ANACODEORI CHAR(17), + P4_SEDEIND CHAR(60), + P4_SEDENRCIVICO CHAR(8), + P4_SEDECAP NUMERIC(5, 0), + P4_SEDECOMUNE CHAR(60), + P4_SEDEPROV CHAR(2), + P4_SEDENAZ CHAR(2), + P4_GESTIONE CHAR(1), + P4_ERRINT CHAR(1), + P4_ERREST CHAR(1)) ; + +ALTER TABLE PAA0400F + ADD CONSTRAINT PAA0400Q + UNIQUE( P4_KEYPRGINVIO , P4_KEYHEADERFATT , P4_KEYBODYFATT ) ; + +CREATE TABLE PAA0500F ( + P5_KEYPRGINVIO CHAR(10), + P5_KEYHEADERFATT CHAR(20), + P5_KEYBODYFATT CHAR(50), + P5_FISCIVAPAESE CHAR(2), + P5_FISCIVACOD CHAR(28), + P5_CODICEFISC CHAR(16), + P5_ANADENOMIN CHAR(80), + P5_ANANOME CHAR(60), + P5_ANACOGNOME CHAR(60), + P5_ANATITOLO CHAR(10), + P5_ANACODEORI CHAR(17), + P5_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA0500F + ADD CONSTRAINT PAA0500Q + UNIQUE( P5_KEYPRGINVIO , P5_KEYHEADERFATT , P5_KEYBODYFATT ) ; + +CREATE TABLE PAA0600F ( + P6_KEYPRGINVIO CHAR(10), + P6_KEYHEADERFATT CHAR(20), + P6_KEYBODYFATT CHAR(50), + P6_SOGGEMITT CHAR(2), + P6_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA0600F + ADD CONSTRAINT PAA0600Q + UNIQUE( P6_KEYPRGINVIO , P6_KEYHEADERFATT , P6_KEYBODYFATT ) ; + +CREATE TABLE PAA0700F ( + P7_KEYPRGINVIO CHAR(10), + P7_KEYHEADERFATT CHAR(20), + P7_KEYBODYFATT CHAR(50), + P7_TIPODOC CHAR(4), + P7_DIVISA CHAR(3), + P7_DATA DATE, + P7_NUMERO CHAR(20), + P7_TIPORITENUTA CHAR(4), + P7_IMPORTORIT NUMERIC(15, 2), + P7_ALIQUOTARIT NUMERIC(6, 2), + P7_CAUSPAGAM CHAR(1), + P7_NUMEROBOLLO CHAR(14), + P7_IMPORTOBOLLO NUMERIC(15, 2), + P7_GESTIONE CHAR(1), + P7_ERRINT CHAR(1), + P7_ERREST CHAR(1)) ; + +ALTER TABLE PAA0700F + ADD CONSTRAINT PAA0700Q + UNIQUE( P7_KEYPRGINVIO , P7_KEYHEADERFATT , P7_KEYBODYFATT ) ; + +CREATE TABLE PAA0800F ( + P8_KEYPRGINVIO CHAR(10), + P8_KEYHEADERFATT CHAR(20), + P8_KEYBODYFATT CHAR(50), + P8_RIFNUMLINEA NUMERIC(4, 0), + P8_TIPOCASSA CHAR(4), + P8_ALIQCASSA NUMERIC(6, 2), + P8_IMCONTRCASSA NUMERIC(15, 2), + P8_IMPONCASSA NUMERIC(15, 2), + P8_ALIQIVA NUMERIC(6, 2), + P8_RITENUTA CHAR(2), + P8_NATURA CHAR(2), + P8_RIFAMMINIS CHAR(20), + P8_GESTIONE CHAR(1), + P8_ERRINT CHAR(1), + P8_ERREST CHAR(1)) ; + +ALTER TABLE PAA0800F + ADD CONSTRAINT PAA0800Q + UNIQUE( P8_KEYPRGINVIO , P8_KEYHEADERFATT , P8_KEYBODYFATT , P8_RIFNUMLINEA ) ; + +CREATE TABLE PAA0900F ( + P9_KEYPRGINVIO CHAR(10), + P9_KEYHEADERFATT CHAR(20), + P9_KEYBODYFATT CHAR(50), + P9_RIFNUMLINEA NUMERIC(4, 0), + P9_TIPOSCONTO CHAR(2), + P9_PERCSCONTO NUMERIC(6, 2), + P9_IMPSCONTO NUMERIC(15, 2), + P9_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA0900F + ADD CONSTRAINT PAA0900Q + UNIQUE( P9_KEYPRGINVIO , P9_KEYHEADERFATT , P9_KEYBODYFATT , P9_RIFNUMLINEA ) ; + +CREATE TABLE PAA1000F ( + P0_KEYPRGINVIO CHAR(10), + P0_KEYHEADERFATT CHAR(20), + P0_KEYBODYFATT CHAR(50), + P0_RIFNUMLINEA NUMERIC(4, 0), + P0_IDDOC CHAR(20), + P0_DATADOC DATE, + P0_NUMITEM CHAR(20), + P0_COMMESSACONV CHAR(100), + P0_CODCUP CHAR(15), + P0_CODCIG CHAR(15), + P0_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA1000F + ADD CONSTRAINT PAA1000Q + UNIQUE( P0_KEYPRGINVIO , P0_KEYHEADERFATT , P0_KEYBODYFATT , P0_RIFNUMLINEA ) ; + +CREATE TABLE PAA1100F ( + PA_KEYPRGINVIO CHAR(10), + PA_KEYHEADERFATT CHAR(20), + PA_KEYBODYFATT CHAR(50), + PA_RIFNUMLINEA NUMERIC(4, 0), + PA_IDDOC CHAR(20), + PA_DATADOCU DATE, + PA_NUMITEM CHAR(20), + PA_COMMCONVENZ CHAR(100), + PA_CODCUP CHAR(15), + PA_CODCIG CHAR(15), + PA_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA1100F + ADD CONSTRAINT PAA1100Q + UNIQUE( PA_KEYPRGINVIO , PA_KEYHEADERFATT , PA_KEYBODYFATT , PA_RIFNUMLINEA ) ; + +CREATE TABLE PAA1200F ( + PB_KEYPRGINVIO CHAR(10), + PB_KEYHEADERFATT CHAR(20), + PB_KEYBODYFATT CHAR(50), + PB_RIFNUMLINEA NUMERIC(4, 0), + PB_IDDOC CHAR(20), + PB_DATADOCO DATE, + PB_NUMITEM CHAR(20), + PB_COMMCONVENZ CHAR(100), + PB_CODCUP CHAR(15), + PB_CODCIG CHAR(15), + PB_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA1200F + ADD CONSTRAINT PAA1200Q + UNIQUE( PB_KEYPRGINVIO , PB_KEYHEADERFATT , PB_KEYBODYFATT , PB_RIFNUMLINEA ) ; + +CREATE TABLE PAA1300F ( + PC_KEYPRGINVIO CHAR(10), + PC_KEYHEADERFATT CHAR(20), + PC_KEYBODYFATT CHAR(50), + PC_RIFNUMLINEA NUMERIC(4, 0), + PC_IDDOC CHAR(20), + PC_DATADOC DATE, + PC_NUMITEM CHAR(20), + PC_COMMCONVENZ CHAR(100), + PC_CODCUP CHAR(15), + PC_CODCIG CHAR(15), + PC_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA1300F + ADD CONSTRAINT PAA1300Q + UNIQUE( PC_KEYPRGINVIO , PC_KEYHEADERFATT , PC_KEYBODYFATT , PC_RIFNUMLINEA ) ; + +CREATE TABLE PAA1400F ( + PD_KEYPRGINVIO CHAR(10), + PD_KEYHEADERFATT CHAR(20), + PD_KEYBODYFATT CHAR(50), + PD_RIFNUMLINEA NUMERIC(4, 0), + PD_IDDOC CHAR(20), + PD_DATADOC DATE, + PD_NUMITEM CHAR(20), + PD_COMMCONVENZ CHAR(100), + PD_CODCUP CHAR(15), + PD_CODCIG CHAR(15), + PD_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA1400F + ADD CONSTRAINT PAA1400Q + UNIQUE( PD_KEYPRGINVIO , PD_KEYHEADERFATT , PD_KEYBODYFATT , PD_RIFNUMLINEA ) ; + +CREATE TABLE PAA1500F ( + PE_KEYPRGINVIO CHAR(10), + PE_KEYHEADERFATT CHAR(20), + PE_KEYBODYFATT CHAR(50), + PE_RIFFASE NUMERIC(3, 0), + PE_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA1500F + ADD CONSTRAINT PAA1500Q + UNIQUE( PE_KEYPRGINVIO , PE_KEYHEADERFATT , PE_KEYBODYFATT , PE_RIFFASE ) ; + +CREATE TABLE PAA1600F ( + PF_KEYPRGINVIO CHAR(10), + PF_KEYHEADERFATT CHAR(20), + PF_KEYBODYFATT CHAR(50), + PF_NUMDDDT CHAR(20), + PF_DATADDT DATE, + PF_RIFNUMLINEA NUMERIC(4, 0), + PF_GESTIONE CHAR(1), + PF_ERRINT CHAR(1), + PF_ERREST CHAR(1)) ; + +ALTER TABLE PAA1600F + ADD CONSTRAINT PAA1600Q + UNIQUE( PF_KEYPRGINVIO , PF_KEYHEADERFATT , PF_KEYBODYFATT , PF_NUMDDDT , PF_RIFNUMLINEA ) ; + +CREATE TABLE PAA1700F ( + PG_KEYPRGINVIO CHAR(10), + PG_KEYHEADERFATT CHAR(20), + PG_KEYBODYFATT CHAR(50), + PG_FISCIVAPAESE CHAR(2), + PG_FISCIVACODICE CHAR(28), + PG_CODICEFISCALE CHAR(16), + PG_ANADENOMINAZ CHAR(80), + PG_ANANOME CHAR(60), + PG_ANACOGNOME CHAR(60), + PG_ANATITOLO CHAR(10), + PG_ANACODEORI CHAR(17), + PG_NUMLICGUIDA CHAR(20), + PG_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA1700F + ADD CONSTRAINT PAA1700Q + UNIQUE( PG_KEYPRGINVIO , PG_KEYHEADERFATT , PG_KEYBODYFATT ) ; + +CREATE TABLE PAA1800F ( + PI_KEYPRGINVIO CHAR(10), + PI_KEYHEADERFATT CHAR(20), + PI_KEYBODYFATT CHAR(50), + PI_NUMEROLINEA NUMERIC(4, 0), + PI_TIPOCESSPREST CHAR(2), + PI_DESCRIZIONE CHAR(100), + PI_QUANTITA NUMERIC(21, 8), + PI_UNITAMISURA CHAR(10), + PI_DTINIZIOPER DATE, + PI_DTFINEPER DATE, + PI_PREZZOUNIT NUMERIC(21, 8), + PI_PRZTOTALE NUMERIC(21, 8), + PI_ALIQUOTAIVA NUMERIC(6, 2), + PI_RITENUTA CHAR(2), + PI_NATURA CHAR(2), + PI_RIFAMMINISTR CHAR(20), + PI_GESTIONE CHAR(1), + PI_ERRINT CHAR(1), + PI_ERREST CHAR(1)) ; + +ALTER TABLE PAA1800F + ADD CONSTRAINT PAA1800Q + UNIQUE( PI_KEYPRGINVIO , PI_KEYHEADERFATT , PI_KEYBODYFATT , PI_NUMEROLINEA ) ; + +CREATE TABLE PAA1900F ( + PY_KEYPRGINVIO CHAR(10), + PY_KEYHEADERFATT CHAR(20), + PY_KEYBODYFATT CHAR(50), + PY_KEYNLINEA NUMERIC(4, 0), + PY_KEYNLINAR NUMERIC(4, 0), + PY_TIPOARTICOLO CHAR(35), + PY_VALOREARTICOLO CHAR(35), + PY_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA1900F + ADD CONSTRAINT PAA1900Q + UNIQUE( PY_KEYPRGINVIO , PY_KEYHEADERFATT , PY_KEYBODYFATT , PY_KEYNLINEA , PY_KEYNLINAR ) ; + +CREATE TABLE PAA2000F ( + PJ_KEYPRGINVIO CHAR(10), + PJ_KEYHEADERFATT CHAR(20), + PJ_KEYBODYFATT CHAR(50), + PJ_KEYNLINEA NUMERIC(4, 0), + PJ_KEYNLINAR NUMERIC(4, 0), + PJ_TIPOSCONTO CHAR(2), + PJ_PERCSCONTO NUMERIC(6, 2), + PJ_IMPORTOSCONTO NUMERIC(15, 2), + PJ_GESTIONE CHAR(1)) ; + +CREATE TABLE PAA2100F ( + PK_KEYPRGINVIO CHAR(10), + PK_KEYHEADERFATT CHAR(20), + PK_KEYBODYFATT CHAR(50), + PK_KEYNLINEA NUMERIC(4, 0), + PK_KEYNLINAR NUMERIC(4, 0), + PK_TIPODATO CHAR(10), + PK_RIFDATO CHAR(60), + PK_RIFNUMERO NUMERIC(21, 5), + PK_RIFDATA DATE, + PK_GESTIONE CHAR(1)) ; + +CREATE TABLE PAA2200F ( + PL_KEYPRGINVIO CHAR(10), + PL_KEYHEADERFATT CHAR(20), + PL_KEYBODYFATT CHAR(50), + PL_ALIQUOTAIVA NUMERIC(6, 2), + PL_NATURA CHAR(2), + PL_SPESEACCESS NUMERIC(15, 2), + PL_ARROTONDAM NUMERIC(21, 5), + PL_IMPONIBILE NUMERIC(15, 2), + PL_IMPOSTA NUMERIC(15, 2), + PL_ESIGIVA CHAR(1), + PL_RIFNORMATIVO CHAR(100), + PL_GESTIONE CHAR(1), + PL_ERRINT CHAR(1), + PL_ERREST CHAR(1), + PL_DETRAIBILE NUMERIC(6, 2), + PL_DEDUCIBILE CHAR(2)) ; + +CREATE TABLE PAA2300F ( + PM_KEYPRGINVIO CHAR(10), + PM_KEYHEADERFATT CHAR(20), + PM_KEYBODYFATT CHAR(50), + PM_DATA DATE, + PM_TOTALEPERCORSO CHAR(15), + PM_GESTIONE CHAR(1), + PM_ERRINT CHAR(1), + PM_ERREST CHAR(1)) ; + +ALTER TABLE PAA2300F + ADD CONSTRAINT PAA2300Q + UNIQUE( PM_KEYPRGINVIO , PM_KEYHEADERFATT , PM_KEYBODYFATT ) ; + +CREATE TABLE PAA2400F ( + PN_KEYPRGINVIO CHAR(10), + PN_KEYHEADERFATT CHAR(20), + PN_KEYBODYFATT CHAR(50), + PN_RIGA NUMERIC(4, 0), + PN_CONDPAGAMENTO CHAR(4), + PN_GESTIONE CHAR(1), + PN_ERRINT CHAR(1), + PN_ERREST CHAR(1)) ; + +ALTER TABLE PAA2400F + ADD CONSTRAINT PAA2400Q + UNIQUE( PN_KEYPRGINVIO , PN_KEYHEADERFATT , PN_KEYBODYFATT , PN_RIGA ) ; + +CREATE TABLE PAA2500F ( + PO_KEYPRGINVIO CHAR(10), + PO_KEYHEADERFATT CHAR(20), + PO_KEYBODYFATT CHAR(50), + PO_RIGA NUMERIC(4, 0), + PO_CONDPAGAMENTO CHAR(4), + PO_BENEFICIARIO CHAR(200), + PO_MODALITAPAGAM CHAR(4), + PO_DATARIFTERM DATE, + PO_GGTERMINIPAG NUMERIC(3, 0), + PO_DATASCADENZA DATE, + PO_IMPORTO NUMERIC(15, 2), + PO_CODUFFPOST CHAR(20), + PO_COGNOMEQUIET CHAR(60), + PO_NOMEQUIET CHAR(60), + PO_CFQUIETANZA CHAR(16), + PO_TITOLOQUIET CHAR(10), + PO_ISTFINANZ CHAR(80), + PO_IBAN CHAR(34), + PO_ABI NUMERIC(5, 0), + PO_CAB NUMERIC(5, 0), + PO_BIC CHAR(11), + PO_SCPAGANTIC NUMERIC(15, 2), + PO_DTLIMANTIC DATE, + PO_PENALITAPAGAM NUMERIC(15, 2), + PO_DATADECORRP DATE, + PO_CODICEPAGAM CHAR(15), + PO_GESTIONE CHAR(1), + PO_ERRINT CHAR(1), + PO_ERREST CHAR(1)) ; + +CREATE TABLE PAA2600F ( + PP_KEYPRGINVIO CHAR(10), + PP_KEYHEADERFATT CHAR(20), + PP_KEYBODYFATT CHAR(50), + PP_NUMEROLINEA NUMERIC(4, 0), + PP_NOMEATTACHMENT CHAR(60), + PP_COMPRESSIONE CHAR(10), + PP_FMTATTACHMENT CHAR(10), + PP_DESCATTACHMENT CHAR(100), + PP_ATTACHMENT CHAR(255), + PP_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA2600F + ADD CONSTRAINT PAA2600Q + UNIQUE( PP_KEYPRGINVIO , PP_KEYHEADERFATT , PP_KEYBODYFATT , PP_NUMEROLINEA ) ; + +CREATE TABLE PAA2700F ( + PQ_KEYPRGINVIO CHAR(10), + PQ_KEYHEADERFATT CHAR(20), + PQ_KEYBODYFATT CHAR(50), + PQ_IMPTOTDOC NUMERIC(15, 2), + PQ_ARROTOND NUMERIC(15, 2), + PQ_CAUSALE CHAR(200), + PQ_ART73 CHAR(2), + PQ_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA2700F + ADD CONSTRAINT PAA2700Q + UNIQUE( PQ_KEYPRGINVIO , PQ_KEYHEADERFATT , PQ_KEYBODYFATT ) ; + +CREATE TABLE PAA2800F ( + PR_KEYPRGINVIO CHAR(10), + PR_KEYHEADERFATT CHAR(20), + PR_KEYBODYFATT CHAR(50), + PR_MEZZOTRASP CHAR(80), + PR_CAUSALETRASP CHAR(100), + PR_NUMCOLLI NUMERIC(4, 0), + PR_DESCRIZIONE CHAR(100), + PR_UMPESO CHAR(10), + PR_PESOLORDO NUMERIC(7, 2), + PR_PESONETTO NUMERIC(7, 2), + PR_DATAORARIT DATE, + PR_DATAUNIZIO DATE, + PR_TIPORESA CHAR(3), + PR_INDIRIZZORESA CHAR(60), + PR_NRCIVICORESA CHAR(8), + PR_CAPRESA NUMERIC(5, 0), + PR_COMUNERESA CHAR(60), + PR_PROVINCIARESA CHAR(2), + PR_NAZIONERESA CHAR(2), + PR_DATAORACON DATE, + PR_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA2800F + ADD CONSTRAINT PAA2800Q + UNIQUE( PR_KEYPRGINVIO , PR_KEYHEADERFATT , PR_KEYBODYFATT ) ; + +CREATE TABLE PAA2900F ( + PS_KEYPRGINVIO CHAR(10), + PS_KEYHEADERFATT CHAR(20), + PS_KEYBODYFATT CHAR(50), + PS_NORMARIFER CHAR(100), + PS_NUMFATTPRINC CHAR(20), + PS_DATAFATTPRINC DATE, + PS_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA2900F + ADD CONSTRAINT PAA2900Q + UNIQUE( PS_KEYPRGINVIO , PS_KEYHEADERFATT , PS_KEYBODYFATT ) ; + +CREATE TABLE PAA3000F ( + PT_KEYPRGINVIO CHAR(10), + PT_KEYHEADERFATT CHAR(20), + PT_KEYBODYFATT CHAR(50), + PT_RIFNUMLINEA NUMERIC(4, 0), + PT_COMMENTO VARCHAR, + PT_GESTIONE CHAR(1)) ; + +ALTER TABLE PAA3000F + ADD CONSTRAINT PAA3000Q + UNIQUE( PT_KEYPRGINVIO , PT_KEYHEADERFATT , PT_KEYBODYFATT , PT_RIFNUMLINEA ) ; + +CREATE TABLE PAA3100F ( + PH_KEYPRGINVIO CHAR(10), + PH_KEYHEADERFATT CHAR(20), + PH_KEYBODYFATT CHAR(50), + PH_STABORGIND CHAR(60), + PH_STABORGNRCIVICO CHAR(8), + PH_STABORGCAP NUMERIC(5, 0), + PH_STABORGCOMUNE CHAR(60), + PH_STABORGPROV CHAR(2), + PH_STABORGNAZ CHAR(2), + PH_FISCIVAPAESE CHAR(2), + PH_FISCIVACODICE CHAR(28), + PH_ANADENOMI CHAR(80), + PH_ANANOME CHAR(60), + PH_ANACOGNOME CHAR(60), + PH_GESTIONE CHAR(1), + PH_ERRINT CHAR(1), + PH_ERREST CHAR(1)) ; + +ALTER TABLE PAA3100F + ADD CONSTRAINT PAA3100Q + UNIQUE( PH_KEYPRGINVIO , PH_KEYHEADERFATT , PH_KEYBODYFATT ) ; + +CREATE TABLE PAA3200F ( + PU_KEYPRGINVIO CHAR(10), + PU_KEYHEADERFATT CHAR(20), + PU_KEYBODYFATT CHAR(50), + PU_PEC CHAR(255), + PU_GESTIONE CHAR(1), + PU_ERRINT CHAR(1), + PU_ERREST CHAR(1)) ; + +ALTER TABLE PAA3200F + ADD CONSTRAINT PAA3200Q + UNIQUE( PU_KEYPRGINVIO , PU_KEYHEADERFATT , PU_KEYBODYFATT ) ; + +CREATE TABLE PAERR00K ( + PXFANN CHAR(1), + PXHFAT CHAR(20), + PXBFAT CHAR(50), + PXPRGI CHAR(10), + PXTDOC CHAR(4), + PXCNFA CHAR(4), + PXNFAT CHAR(20), + PXUFAT DATE, + PXCCLI CHAR(10), + PXNFIL CHAR(20), + PXNLIN NUMERIC(4, 0), + PXNERR NUMERIC(4, 0), + PXCERR CHAR(5), + PXDERR CHAR(150), + PXCAMP CHAR(15), + PXDATO CHAR(150), + PXFINT CHAR(1), + PXCUIN CHAR(10), + PXDTIN DATE, + PXHOIN TIME) ; + +CREATE TABLE PAF0100F ( + P1_KEYPRGINVIO CHAR(10), + P1_KEYHEADERFATT CHAR(20), + P1_KEYBODYFATT CHAR(50), + P1_TRASMITTPAESE CHAR(2), + P1_TRASMITTCOD CHAR(28), + P1_PRGINVIO CHAR(10), + P1_FMTTRASMISS CHAR(5), + P1_CODDEST CHAR(7), + P1_TELEFONO CHAR(12), + P1_MAIL CHAR(255), + P1_GESTIONE CHAR(1), + P1_ERRINT CHAR(1), + P1_ERREST CHAR(1)) ; + +ALTER TABLE PAF0100F + ADD CONSTRAINT PAF0100Q + UNIQUE( P1_KEYPRGINVIO , P1_KEYHEADERFATT , P1_KEYBODYFATT ) ; + +CREATE TABLE PAF0200F ( + P2_KEYPRGINVIO CHAR(10), + P2_KEYHEADERFATT CHAR(20), + P2_KEYBODYFATT CHAR(50), + P2_FISCIVAPAESE CHAR(2), + P2_FISCIVACOD CHAR(28), + P2_CODFISCALE CHAR(16), + P2_ANADENOMIN CHAR(80), + P2_ANANOME CHAR(60), + P2_ANACOGNOME CHAR(60), + P2_ANATITOLO CHAR(10), + P2_ANACODEORI CHAR(17), + P2_ALBOPROFESS CHAR(60), + P2_PROVALBO CHAR(2), + P2_NRISCRIZALBO CHAR(60), + P2_DTISCRIZEALBO DATE , + P2_REGFISCALE CHAR(4), + P2_SEDEIND CHAR(60), + P2_SEDENRCIVICO CHAR(8), + P2_SEDECAP NUMERIC(5, 0), + P2_SEDECOMUNE CHAR(60), + P2_SEDEPROV CHAR(2), + P2_SEDENAZ CHAR(2), + P2_STABORGIND CHAR(60), + P2_STABORGNRCIVICO CHAR(8), + P2_STABORGCAP NUMERIC(5, 0), + P2_STABORGCOMUNE CHAR(60), + P2_STABORGPROV CHAR(2), + P2_STABORGNAZ CHAR(2), + P2_ISCRREAUFF CHAR(2), + P2_ISCRREANUM CHAR(20), + P2_ISCRREACAP NUMERIC(15, 2), + P2_ISCRREASOCIOU CHAR(2), + P2_ISCRREASLIQUID CHAR(2), + P2_CONTATTITELEF CHAR(12), + P2_CONTATTIFAX CHAR(12), + P2_CONTATTIMAIL CHAR(255), + P2_RIFAMMINISTR CHAR(20), + P2_GESTIONE CHAR(1), + P2_ERRINT CHAR(1), + P2_ERREST CHAR(1)) ; + +ALTER TABLE PAF0200F + ADD CONSTRAINT PAF0200Q + UNIQUE( P2_KEYPRGINVIO , P2_KEYHEADERFATT , P2_KEYBODYFATT ) ; + +CREATE TABLE PAF0300F ( + P3_KEYPRGINVIO CHAR(10), + P3_KEYHEADERFATT CHAR(20), + P3_KEYBODYFATT CHAR(50), + P3_FISCIVAPAESE CHAR(2), + P3_FISCIVACODICE CHAR(28), + P3_CODFISC CHAR(16), + P3_ANADENOMI CHAR(80), + P3_ANANOME CHAR(60), + P3_ANACOGNOME CHAR(60), + P3_ANATITOLO CHAR(10), + P3_ANACODEORI CHAR(17), + P3_GESTIONE CHAR(1), + P3_ERRINT CHAR(1), + P3_ERREST CHAR(1)) ; + +ALTER TABLE PAF0300F + ADD CONSTRAINT PAF0300Q + UNIQUE( P3_KEYPRGINVIO , P3_KEYHEADERFATT , P3_KEYBODYFATT ) ; + +CREATE TABLE PAF0400F ( + P4_KEYPRGINVIO CHAR(10), + P4_KEYHEADERFATT CHAR(20), + P4_KEYBODYFATT CHAR(50), + P4_FISCIVAPAESE CHAR(2), + P4_FISCIVACOD CHAR(28), + P4_CODFISC CHAR(16), + P4_ANADENOM CHAR(80), + P4_ANANOME CHAR(60), + P4_ANACOGNOME CHAR(60), + P4_ANATITOLO CHAR(10), + P4_ANACODEORI CHAR(17), + P4_SEDEIND CHAR(60), + P4_SEDENRCIVICO CHAR(8), + P4_SEDECAP NUMERIC(5, 0), + P4_SEDECOMUNE CHAR(60), + P4_SEDEPROV CHAR(2), + P4_SEDENAZ CHAR(2), + P4_GESTIONE CHAR(1), + P4_ERRINT CHAR(1), + P4_ERREST CHAR(1)) ; + +ALTER TABLE PAF0400F + ADD CONSTRAINT PAF0400Q + UNIQUE( P4_KEYPRGINVIO , P4_KEYHEADERFATT , P4_KEYBODYFATT ) ; + +CREATE TABLE PAF0500F ( + P5_KEYPRGINVIO CHAR(10), + P5_KEYHEADERFATT CHAR(20), + P5_KEYBODYFATT CHAR(50), + P5_FISCIVAPAESE CHAR(2), + P5_FISCIVACOD CHAR(28), + P5_CODICEFISC CHAR(16), + P5_ANADENOMIN CHAR(80), + P5_ANANOME CHAR(60), + P5_ANACOGNOME CHAR(60), + P5_ANATITOLO CHAR(10), + P5_ANACODEORI CHAR(17), + P5_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF0500F + ADD CONSTRAINT PAF0500Q + UNIQUE( P5_KEYPRGINVIO , P5_KEYHEADERFATT , P5_KEYBODYFATT ) ; + +CREATE TABLE PAF0600F ( + P6_KEYPRGINVIO CHAR(10), + P6_KEYHEADERFATT CHAR(20), + P6_KEYBODYFATT CHAR(50), + P6_SOGGEMITT CHAR(2), + P6_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF0600F + ADD CONSTRAINT PAF0600Q + UNIQUE( P6_KEYPRGINVIO , P6_KEYHEADERFATT , P6_KEYBODYFATT ) ; + +CREATE TABLE PAF0700F ( + P7_KEYPRGINVIO CHAR(10), + P7_KEYHEADERFATT CHAR(20), + P7_KEYBODYFATT CHAR(50), + P7_TIPODOC CHAR(4), + P7_DIVISA CHAR(3), + P7_DATA DATE, + P7_NUMERO CHAR(20), + P7_TIPORITENUTA CHAR(4), + P7_IMPORTORIT NUMERIC(15, 2), + P7_ALIQUOTARIT NUMERIC(6, 2), + P7_CAUSPAGAM CHAR(1), + P7_NUMEROBOLLO CHAR(14), + P7_IMPORTOBOLLO NUMERIC(15, 2), + P7_GESTIONE CHAR(1), + P7_ERRINT CHAR(1), + P7_ERREST CHAR(1)) ; + +ALTER TABLE PAF0700F + ADD CONSTRAINT PAF0700Q + UNIQUE( P7_KEYPRGINVIO , P7_KEYHEADERFATT , P7_KEYBODYFATT ) ; + +CREATE TABLE PAF0800F ( + P8_KEYPRGINVIO CHAR(10), + P8_KEYHEADERFATT CHAR(20), + P8_KEYBODYFATT CHAR(50), + P8_RIFNUMLINEA NUMERIC(4, 0), + P8_TIPOCASSA CHAR(4), + P8_ALIQCASSA NUMERIC(6, 2), + P8_IMCONTRCASSA NUMERIC(15, 2), + P8_IMPONCASSA NUMERIC(15, 2), + P8_ALIQIVA NUMERIC(6, 2), + P8_RITENUTA CHAR(2), + P8_NATURA CHAR(2), + P8_RIFAMMINIS CHAR(20), + P8_GESTIONE CHAR(1), + P8_ERRINT CHAR(1), + P8_ERREST CHAR(1)) ; + +ALTER TABLE PAF0800F + ADD CONSTRAINT PAF0800Q + UNIQUE( P8_KEYPRGINVIO , P8_KEYHEADERFATT , P8_KEYBODYFATT , P8_RIFNUMLINEA ) ; + +CREATE TABLE PAF0900F ( + P9_KEYPRGINVIO CHAR(10), + P9_KEYHEADERFATT CHAR(20), + P9_KEYBODYFATT CHAR(50), + P9_RIFNUMLINEA NUMERIC(4, 0), + P9_TIPOSCONTO CHAR(2), + P9_PERCSCONTO NUMERIC(6, 2), + P9_IMPSCONTO NUMERIC(15, 2), + P9_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF0900F + ADD CONSTRAINT PAF0900Q + UNIQUE( P9_KEYPRGINVIO , P9_KEYHEADERFATT , P9_KEYBODYFATT , P9_RIFNUMLINEA ) ; + +CREATE TABLE PAF1000F ( + P0_KEYPRGINVIO CHAR(10), + P0_KEYHEADERFATT CHAR(20), + P0_KEYBODYFATT CHAR(50), + P0_RIFNUMLINEA NUMERIC(4, 0), + P0_IDDOC CHAR(20), + P0_DATADOC DATE, + P0_NUMITEM CHAR(20), + P0_COMMESSACONV CHAR(100), + P0_CODCUP CHAR(15), + P0_CODCIG CHAR(15), + P0_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF1000F + ADD CONSTRAINT PAF1000Q + UNIQUE( P0_KEYPRGINVIO , P0_KEYHEADERFATT , P0_KEYBODYFATT , P0_RIFNUMLINEA ) ; + +CREATE TABLE PAF1100F ( + PA_KEYPRGINVIO CHAR(10), + PA_KEYHEADERFATT CHAR(20), + PA_KEYBODYFATT CHAR(50), + PA_RIFNUMLINEA NUMERIC(4, 0), + PA_IDDOC CHAR(20), + PA_DATADOCU DATE, + PA_NUMITEM CHAR(20), + PA_COMMCONVENZ CHAR(100), + PA_CODCUP CHAR(15), + PA_CODCIG CHAR(15), + PA_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF1100F + ADD CONSTRAINT PAF1100Q + UNIQUE( PA_KEYPRGINVIO , PA_KEYHEADERFATT , PA_KEYBODYFATT , PA_RIFNUMLINEA ) ; + +CREATE TABLE PAF1200F ( + PB_KEYPRGINVIO CHAR(10), + PB_KEYHEADERFATT CHAR(20), + PB_KEYBODYFATT CHAR(50), + PB_RIFNUMLINEA NUMERIC(4, 0), + PB_IDDOC CHAR(20), + PB_DATADOCO DATE, + PB_NUMITEM CHAR(20), + PB_COMMCONVENZ CHAR(100), + PB_CODCUP CHAR(15), + PB_CODCIG CHAR(15), + PB_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF1200F + ADD CONSTRAINT PAF1200Q + UNIQUE( PB_KEYPRGINVIO , PB_KEYHEADERFATT , PB_KEYBODYFATT , PB_RIFNUMLINEA ) ; + +CREATE TABLE PAF1300F ( + PC_KEYPRGINVIO CHAR(10), + PC_KEYHEADERFATT CHAR(20), + PC_KEYBODYFATT CHAR(50), + PC_RIFNUMLINEA NUMERIC(4, 0), + PC_IDDOC CHAR(20), + PC_DATADOC DATE, + PC_NUMITEM CHAR(20), + PC_COMMCONVENZ CHAR(100), + PC_CODCUP CHAR(15), + PC_CODCIG CHAR(15), + PC_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF1300F + ADD CONSTRAINT PAF1300Q + UNIQUE( PC_KEYPRGINVIO , PC_KEYHEADERFATT , PC_KEYBODYFATT , PC_RIFNUMLINEA ) ; + +CREATE TABLE PAF1400F ( + PD_KEYPRGINVIO CHAR(10), + PD_KEYHEADERFATT CHAR(20), + PD_KEYBODYFATT CHAR(50), + PD_RIFNUMLINEA NUMERIC(4, 0), + PD_IDDOC CHAR(20), + PD_DATADOC DATE, + PD_NUMITEM CHAR(20), + PD_COMMCONVENZ CHAR(100), + PD_CODCUP CHAR(15), + PD_CODCIG CHAR(15), + PD_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF1400F + ADD CONSTRAINT PAF1400Q + UNIQUE( PD_KEYPRGINVIO , PD_KEYHEADERFATT , PD_KEYBODYFATT , PD_RIFNUMLINEA ) ; + +CREATE TABLE PAF1500F ( + PE_KEYPRGINVIO CHAR(10), + PE_KEYHEADERFATT CHAR(20), + PE_KEYBODYFATT CHAR(50), + PE_RIFFASE NUMERIC(3, 0), + PE_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF1500F + ADD CONSTRAINT PAF1500Q + UNIQUE( PE_KEYPRGINVIO , PE_KEYHEADERFATT , PE_KEYBODYFATT , PE_RIFFASE ) ; + +CREATE TABLE PAF1600F ( + PF_KEYPRGINVIO CHAR(10), + PF_KEYHEADERFATT CHAR(20), + PF_KEYBODYFATT CHAR(50), + PF_NUMDDDT CHAR(20), + PF_DATADDT DATE, + PF_RIFNUMLINEA NUMERIC(4, 0), + PF_GESTIONE CHAR(1), + PF_ERRINT CHAR(1), + PF_ERREST CHAR(1)) ; + +ALTER TABLE PAF1600F + ADD CONSTRAINT PAF1600Q + UNIQUE( PF_KEYPRGINVIO , PF_KEYHEADERFATT , PF_KEYBODYFATT , PF_RIFNUMLINEA ) ; + +CREATE TABLE PAF1700F ( + PG_KEYPRGINVIO CHAR(10), + PG_KEYHEADERFATT CHAR(20), + PG_KEYBODYFATT CHAR(50), + PG_FISCIVAPAESE CHAR(2), + PG_FISCIVACODICE CHAR(28), + PG_CODICEFISCALE CHAR(16), + PG_ANADENOMINAZ CHAR(80), + PG_ANANOME CHAR(60), + PG_ANACOGNOME CHAR(60), + PG_ANATITOLO CHAR(10), + PG_ANACODEORI CHAR(17), + PG_NUMLICGUIDA CHAR(20), + PG_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF1700F + ADD CONSTRAINT PAF1700Q + UNIQUE( PG_KEYPRGINVIO , PG_KEYHEADERFATT , PG_KEYBODYFATT ) ; + +CREATE TABLE PAF1800F ( + PI_KEYPRGINVIO CHAR(10), + PI_KEYHEADERFATT CHAR(20), + PI_KEYBODYFATT CHAR(50), + PI_NUMEROLINEA NUMERIC(4, 0), + PI_TIPOCESSPREST CHAR(2), + PI_DESCRIZIONE CHAR(100), + PI_QUANTITA NUMERIC(21, 8), + PI_UNITAMISURA CHAR(10), + PI_DTINIZIOPER DATE, + PI_DTFINEPER DATE, + PI_PREZZOUNIT NUMERIC(21, 8), + PI_PRZTOTALE NUMERIC(21, 8), + PI_ALIQUOTAIVA NUMERIC(6, 2), + PI_RITENUTA CHAR(2), + PI_NATURA CHAR(2), + PI_RIFAMMINISTR CHAR(20), + PI_GESTIONE CHAR(1), + PI_ERRINT CHAR(1), + PI_ERREST CHAR(1)) ; + +ALTER TABLE PAF1800F + ADD CONSTRAINT PAF1800Q + UNIQUE( PI_KEYPRGINVIO , PI_KEYHEADERFATT , PI_KEYBODYFATT , PI_NUMEROLINEA ) ; + +CREATE TABLE PAF1900F ( + PY_KEYPRGINVIO CHAR(10), + PY_KEYHEADERFATT CHAR(20), + PY_KEYBODYFATT CHAR(50), + PY_KEYNLINEA NUMERIC(4, 0), + PY_KEYNLINAR NUMERIC(4, 0), + PY_TIPOARTICOLO CHAR(35), + PY_VALOREARTICOLO CHAR(35), + PY_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF1900F + ADD CONSTRAINT PAF1900Q + UNIQUE( PY_KEYPRGINVIO , PY_KEYHEADERFATT , PY_KEYBODYFATT , PY_KEYNLINEA , PY_KEYNLINAR ) ; + +CREATE TABLE PAF2000F ( + PJ_KEYPRGINVIO CHAR(10), + PJ_KEYHEADERFATT CHAR(20), + PJ_KEYBODYFATT CHAR(50), + PJ_KEYNLINEA NUMERIC(4, 0), + PJ_KEYNLINAR NUMERIC(4, 0), + PJ_TIPOSCONTO CHAR(2), + PJ_PERCSCONTO NUMERIC(6, 2), + PJ_IMPORTOSCONTO NUMERIC(15, 2), + PJ_GESTIONE CHAR(1)) ; + + ALTER TABLE PAF2000F + ADD CONSTRAINT PAF2000Q + UNIQUE( PJ_KEYPRGINVIO , PJ_KEYHEADERFATT , PJ_KEYBODYFATT ) ; + +CREATE TABLE PAF2100F ( + PK_KEYPRGINVIO CHAR(10), + PK_KEYHEADERFATT CHAR(20), + PK_KEYBODYFATT CHAR(50), + PK_KEYNLINEA NUMERIC(4, 0), + PK_KEYNLINAR NUMERIC(4, 0), + PK_TIPODATO CHAR(10), + PK_RIFDATO CHAR(60), + PK_RIFNUMERO NUMERIC(21, 5), + PK_RIFDATA DATE, + PK_GESTIONE CHAR(1)) ; + + ALTER TABLE PAF2100F + ADD CONSTRAINT PAF2100Q + UNIQUE( PK_KEYPRGINVIO , PK_KEYHEADERFATT , PK_KEYBODYFATT ) ; + +CREATE TABLE PAF2200F ( + PL_KEYPRGINVIO CHAR(10), + PL_KEYHEADERFATT CHAR(20), + PL_KEYBODYFATT CHAR(50), + PL_ALIQUOTAIVA NUMERIC(6, 2), + PL_NATURA CHAR(2), + PL_SPESEACCESS NUMERIC(15, 2), + PL_ARROTONDAM NUMERIC(21, 5), + PL_IMPONIBILE NUMERIC(15, 2), + PL_IMPOSTA NUMERIC(15, 2), + PL_ESIGIVA CHAR(1), + PL_RIFNORMATIVO CHAR(100), + PL_GESTIONE CHAR(1), + PL_ERRINT CHAR(1), + PL_ERREST CHAR(1), + PL_DETRAIBILE NUMERIC(6, 2), + PL_DEDUCIBILE CHAR(2)) ; + + ALTER TABLE PAF2200F + ADD CONSTRAINT PAF2200Q + UNIQUE( PL_KEYPRGINVIO , PL_KEYHEADERFATT , PL_KEYBODYFATT ) ; + +CREATE TABLE PAF2300F ( + PM_KEYPRGINVIO CHAR(10), + PM_KEYHEADERFATT CHAR(20), + PM_KEYBODYFATT CHAR(50), + PM_DATA DATE, + PM_TOTALEPERCORSO CHAR(15), + PM_GESTIONE CHAR(1), + PM_ERRINT CHAR(1), + PM_ERREST CHAR(1)) ; + +ALTER TABLE PAF2300F + ADD CONSTRAINT PAF2300Q + UNIQUE( PM_KEYPRGINVIO , PM_KEYHEADERFATT , PM_KEYBODYFATT ) ; + +CREATE TABLE PAF2400F ( + PN_KEYPRGINVIO CHAR(10), + PN_KEYHEADERFATT CHAR(20), + PN_KEYBODYFATT CHAR(50), + PN_RIGA NUMERIC(4, 0), + PN_CONDPAGAMENTO CHAR(4), + PN_GESTIONE CHAR(1), + PN_ERRINT CHAR(1), + PN_ERREST CHAR(1)) ; + +ALTER TABLE PAF2400F + ADD CONSTRAINT PAF2400Q + UNIQUE( PN_KEYPRGINVIO , PN_KEYHEADERFATT , PN_KEYBODYFATT , PN_RIGA ) ; + +CREATE TABLE PAF2500F ( + PO_KEYPRGINVIO CHAR(10), + PO_KEYHEADERFATT CHAR(20), + PO_KEYBODYFATT CHAR(50), + PO_RIGA NUMERIC(4, 0), + PO_CONDPAGAMENTO CHAR(4), + PO_BENEFICIARIO CHAR(200), + PO_MODALITAPAGAM CHAR(4), + PO_DATARIFTERM DATE, + PO_GGTERMINIPAG NUMERIC(3, 0), + PO_DATASCADENZA DATE, + PO_IMPORTO NUMERIC(15, 2), + PO_CODUFFPOST CHAR(20), + PO_COGNOMEQUIET CHAR(60), + PO_NOMEQUIET CHAR(60), + PO_CFQUIETANZA CHAR(16), + PO_TITOLOQUIET CHAR(10), + PO_ISTFINANZ CHAR(80), + PO_IBAN CHAR(34), + PO_ABI NUMERIC(5, 0), + PO_CAB NUMERIC(5, 0), + PO_BIC CHAR(11), + PO_SCPAGANTIC NUMERIC(15, 2), + PO_DTLIMANTIC DATE, + PO_PENALITAPAGAM NUMERIC(15, 2), + PO_DATADECORRP DATE, + PO_CODICEPAGAM CHAR(15), + PO_GESTIONE CHAR(1), + PO_ERRINT CHAR(1), + PO_ERREST CHAR(1)) ; + + ALTER TABLE PAF2500F + ADD CONSTRAINT PAF2500Q + UNIQUE( PO_KEYPRGINVIO , PO_KEYHEADERFATT , PO_KEYBODYFATT ) ; + +CREATE TABLE PAF2600F ( + PP_KEYPRGINVIO CHAR(10), + PP_KEYHEADERFATT CHAR(20), + PP_KEYBODYFATT CHAR(50), + PP_NUMEROLINEA NUMERIC(4, 0), + PP_NOMEATTACHMENT CHAR(60), + PP_COMPRESSIONE CHAR(10), + PP_FMTATTACHMENT CHAR(10), + PP_DESCATTACHMENT CHAR(100), + PP_ATTACHMENT CHAR(255), + PP_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF2600F + ADD CONSTRAINT PAF2600Q + UNIQUE( PP_KEYPRGINVIO , PP_KEYHEADERFATT , PP_KEYBODYFATT , PP_NUMEROLINEA ) ; + +CREATE TABLE PAF2700F ( + PQ_KEYPRGINVIO CHAR(10), + PQ_KEYHEADERFATT CHAR(20), + PQ_KEYBODYFATT CHAR(50), + PQ_IMPTOTDOC NUMERIC(15, 2), + PQ_ARROTOND NUMERIC(15, 2), + PQ_CAUSALE CHAR(200), + PQ_ART73 CHAR(2), + PQ_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF2700F + ADD CONSTRAINT PAF2700Q + UNIQUE( PQ_KEYPRGINVIO , PQ_KEYHEADERFATT , PQ_KEYBODYFATT ) ; + +CREATE TABLE PAF2800F ( + PR_KEYPRGINVIO CHAR(10), + PR_KEYHEADERFATT CHAR(20), + PR_KEYBODYFATT CHAR(50), + PR_MEZZOTRASP CHAR(80), + PR_CAUSALETRASP CHAR(100), + PR_NUMCOLLI NUMERIC(4, 0), + PR_DESCRIZIONE CHAR(100), + PR_UMPESO CHAR(10), + PR_PESOLORDO NUMERIC(7, 2), + PR_PESONETTO NUMERIC(7, 2), + PR_DATAORARIT DATE, + PR_DATAUNIZIO DATE, + PR_TIPORESA CHAR(3), + PR_INDIRIZZORESA CHAR(60), + PR_NRCIVICORESA CHAR(8), + PR_CAPRESA NUMERIC(5, 0), + PR_COMUNERESA CHAR(60), + PR_PROVINCIARESA CHAR(2), + PR_NAZIONERESA CHAR(2), + PR_DATAORACON DATE, + PR_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF2800F + ADD CONSTRAINT PAF2800Q + UNIQUE( PR_KEYPRGINVIO , PR_KEYHEADERFATT , PR_KEYBODYFATT ) ; + +CREATE TABLE PAF2900F ( + PS_KEYPRGINVIO CHAR(10), + PS_KEYHEADERFATT CHAR(20), + PS_KEYBODYFATT CHAR(50), + PS_NORMARIFER CHAR(100), + PS_NUMFATTPRINC CHAR(20), + PS_DATAFATTPRINC DATE, + PS_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF2900F + ADD CONSTRAINT PAF2900Q + UNIQUE( PS_KEYPRGINVIO , PS_KEYHEADERFATT , PS_KEYBODYFATT ) ; + +CREATE TABLE PAF3000F ( + PT_KEYPRGINVIO CHAR(10), + PT_KEYHEADERFATT CHAR(20), + PT_KEYBODYFATT CHAR(50), + PT_RIFNUMLINEA NUMERIC(4, 0), + PT_COMMENTO VARCHAR, + PT_GESTIONE CHAR(1)) ; + +ALTER TABLE PAF3000F + ADD CONSTRAINT PAF3000Q + UNIQUE( PT_KEYPRGINVIO , PT_KEYHEADERFATT , PT_KEYBODYFATT , PT_RIFNUMLINEA ) ; + +CREATE TABLE PAF3100F ( + PH_KEYPRGINVIO CHAR(10), + PH_KEYHEADERFATT CHAR(20), + PH_KEYBODYFATT CHAR(50), + PH_STABORGIND CHAR(60), + PH_STABORGNRCIVICO CHAR(8), + PH_STABORGCAP NUMERIC(5, 0), + PH_STABORGCOMUNE CHAR(60), + PH_STABORGPROV CHAR(2), + PH_STABORGNAZ CHAR(2), + PH_FISCIVAPAESE CHAR(2), + PH_FISCIVACODICE CHAR(28), + PH_ANADENOMI CHAR(80), + PH_ANANOME CHAR(60), + PH_ANACOGNOME CHAR(60), + PH_GESTIONE CHAR(1), + PH_ERRINT CHAR(1), + PH_ERREST CHAR(1)) ; + +ALTER TABLE PAF3100F + ADD CONSTRAINT PAF3100Q + UNIQUE( PH_KEYPRGINVIO , PH_KEYHEADERFATT , PH_KEYBODYFATT ) ; + +CREATE TABLE PAF3200F ( + PU_KEYPRGINVIO CHAR(10), + PU_KEYHEADERFATT CHAR(20), + PU_KEYBODYFATT CHAR(50), + PU_PEC CHAR(255), + PU_GESTIONE CHAR(1), + PU_ERRINT CHAR(1), + PU_ERREST CHAR(1)) ; + +ALTER TABLE PAF3200F + ADD CONSTRAINT PAF3200Q + UNIQUE( PU_KEYPRGINVIO , PU_KEYHEADERFATT , PU_KEYBODYFATT ) ; + +CREATE TABLE PAFLD00K ( + PZNFIL CHAR(10), + PZNFLD CHAR(10), + PZDFLD CHAR(35), + PZNPOS NUMERIC(3, 0), + PZTDAT CHAR(8), + PZNLEN NUMERIC(5, 0), + PZNDEC NUMERIC(5, 0), + PZDFIL CHAR(50), + PZFGES CHAR(1), + PZFILL CHAR(255)) ; + +CREATE TABLE PAFW300F ( + PW_KEYPRGINVIO CHAR(10), + PW_KEYHEADERFATT CHAR(20), + PW_KEYBODYFATT CHAR(50), + PW_TIPODOC CHAR(4), + PW_TIPONUM CHAR(4), + PW_NUMERO CHAR(20), + PW_DATA DATE, + PW_CODSDI CHAR(10), + PW_CLIENTE CHAR(10), + PW_RAGSOC CHAR(35), + PW_PAESE CHAR(2), + PW_CODICE CHAR(28), + PW_CFISCA CHAR(16), + PW_DENOM CHAR(80), + PW_NOME CHAR(60), + PW_COGN CHAR(60), + PW_CDEST CHAR(7), + PW_IMPO NUMERIC(15, 2), + PW_FNOT CHAR(1), + PW_CXML CHAR(255), + PW_CXMLP CHAR(255), + PW_UPAG DATE, + CONSTRAINT PAFW300Q PRIMARY KEY( PW_KEYHEADERFATT , PW_KEYBODYFATT , PW_TIPODOC , PW_TIPONUM , PW_NUMERO , PW_DATA ) ) ; + +CREATE TABLE PANUM00F ( + PJNKEY CHAR(5), + PJNINV CHAR(10), + PJCPER CHAR(255), + PJFILL CHAR(255)) ; + + + +/* INDICI */ + +CREATE INDEX FPCDD01I + ON FPCDD00F ( PV_AMBIENTE ASC ) + ; + +CREATE INDEX FPCDE01I + ON FPCDE00F ( PX_CODDEST ASC , PX_FISCIVAPAESE ASC , PX_FISCIVACOD ASC , PX_CODFISCALE ASC ) + ; + +CREATE INDEX FPPRO01I + ON FPPRO00F ( PZ_KEYPRGINVIO ASC , PZ_KEYHEADERFATT ASC , PZ_KEYBODYFATT ASC ) + ; + +CREATE INDEX FPPRO02I + ON FPPRO00F ( PZ_KEYPRGINVIO ASC , PZ_KEYHEADERFATT ASC , PZ_TIPODOC ASC , PZ_NUMERO ASC , PZ_DATA ASC ) + ; + +CREATE INDEX PAA0101I + ON PAA0100F ( P1_KEYPRGINVIO ASC , P1_KEYHEADERFATT ASC , P1_KEYBODYFATT ASC , P1_DATAORARIC ASC ) + ; + +CREATE INDEX PAA0201I + ON PAA0200F ( P2_KEYPRGINVIO ASC , P2_KEYHEADERFATT ASC , P2_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA0301I + ON PAA0300F ( P3_KEYPRGINVIO ASC , P3_KEYHEADERFATT ASC , P3_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA0401I + ON PAA0400F ( P4_KEYPRGINVIO ASC , P4_KEYHEADERFATT ASC , P4_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA0501I + ON PAA0500F ( P5_KEYPRGINVIO ASC , P5_KEYHEADERFATT ASC , P5_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA0601I + ON PAA0600F ( P6_KEYPRGINVIO ASC , P6_KEYHEADERFATT ASC , P6_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA0701I + ON PAA0700F ( P7_KEYPRGINVIO ASC , P7_KEYHEADERFATT ASC , P7_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA0801I + ON PAA0800F ( P8_KEYPRGINVIO ASC , P8_KEYHEADERFATT ASC , P8_KEYBODYFATT ASC , P8_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA0901I + ON PAA0900F ( P9_KEYPRGINVIO ASC , P9_KEYHEADERFATT ASC , P9_KEYBODYFATT ASC , P9_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA1001I + ON PAA1000F ( P0_KEYPRGINVIO ASC , P0_KEYHEADERFATT ASC , P0_KEYBODYFATT ASC , P0_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA1101I + ON PAA1100F ( PA_KEYPRGINVIO ASC , PA_KEYHEADERFATT ASC , PA_KEYBODYFATT ASC , PA_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA1201I + ON PAA1200F ( PB_KEYPRGINVIO ASC , PB_KEYHEADERFATT ASC , PB_KEYBODYFATT ASC , PB_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA1301I + ON PAA1300F ( PC_KEYPRGINVIO ASC , PC_KEYHEADERFATT ASC , PC_KEYBODYFATT ASC , PC_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA1401I + ON PAA1400F ( PD_KEYPRGINVIO ASC , PD_KEYHEADERFATT ASC , PD_KEYBODYFATT ASC , PD_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA1501I + ON PAA1500F ( PE_KEYPRGINVIO ASC , PE_KEYHEADERFATT ASC , PE_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA1601I + ON PAA1600F ( PF_KEYPRGINVIO ASC , PF_KEYHEADERFATT ASC , PF_KEYBODYFATT ASC , PF_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA1701I + ON PAA1700F ( PG_KEYPRGINVIO ASC , PG_KEYHEADERFATT ASC , PG_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA1801I + ON PAA1800F ( PI_KEYPRGINVIO ASC , PI_KEYHEADERFATT ASC , PI_KEYBODYFATT ASC , PI_NUMEROLINEA ASC ) + ; + +CREATE INDEX PAA1901I + ON PAA1900F ( PY_KEYPRGINVIO ASC , PY_KEYHEADERFATT ASC , PY_KEYBODYFATT ASC , PY_KEYNLINEA ASC ) + ; + +CREATE INDEX PAA2001I + ON PAA2000F ( PJ_KEYPRGINVIO ASC , PJ_KEYHEADERFATT ASC , PJ_KEYBODYFATT ASC , PJ_KEYNLINEA ASC , PJ_KEYNLINAR ASC ) + ; + +CREATE INDEX PAA2101I + ON PAA2100F ( PK_KEYPRGINVIO ASC , PK_KEYHEADERFATT ASC , PK_KEYBODYFATT ASC , PK_KEYNLINEA ASC ) + ; + +CREATE INDEX PAA2201I + ON PAA2200F ( PL_KEYPRGINVIO ASC , PL_KEYHEADERFATT ASC , PL_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA2301I + ON PAA2300F ( PM_KEYPRGINVIO ASC , PM_KEYHEADERFATT ASC , PM_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA2401I + ON PAA2400F ( PN_KEYPRGINVIO ASC , PN_KEYHEADERFATT ASC , PN_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA2501I + ON PAA2500F ( PO_KEYPRGINVIO ASC , PO_KEYHEADERFATT ASC , PO_KEYBODYFATT ASC , PO_RIGA ASC ) + ; + +CREATE INDEX PAA2601I + ON PAA2600F ( PP_KEYPRGINVIO ASC , PP_KEYHEADERFATT ASC , PP_KEYBODYFATT ASC , PP_NUMEROLINEA ASC ) + ; + +CREATE INDEX PAA2701I + ON PAA2700F ( PQ_KEYPRGINVIO ASC , PQ_KEYHEADERFATT ASC , PQ_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA2801I + ON PAA2800F ( PR_KEYPRGINVIO ASC , PR_KEYHEADERFATT ASC , PR_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA2901I + ON PAA2900F ( PS_KEYPRGINVIO ASC , PS_KEYHEADERFATT ASC , PS_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA3001I + ON PAA3000F ( PT_KEYPRGINVIO ASC , PT_KEYHEADERFATT ASC , PT_KEYBODYFATT ASC , PT_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAA3101I + ON PAA3100F ( PH_KEYPRGINVIO ASC , PH_KEYHEADERFATT ASC , PH_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAA3201I + ON PAA3200F ( PU_KEYPRGINVIO ASC , PU_KEYHEADERFATT ASC , PU_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0101I + ON PAF0100F ( P1_KEYHEADERFATT ASC , P1_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0102I + ON PAF0100F ( P1_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0103I + ON PAF0100F ( P1_KEYPRGINVIO ASC , P1_KEYHEADERFATT ASC , P1_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0201I + ON PAF0200F ( P2_KEYHEADERFATT ASC , P2_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0301I + ON PAF0300F ( P3_KEYHEADERFATT ASC , P3_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0401I + ON PAF0400F ( P4_KEYHEADERFATT ASC , P4_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0501I + ON PAF0500F ( P5_KEYHEADERFATT ASC , P5_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0601I + ON PAF0600F ( P6_KEYHEADERFATT ASC , P6_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0701I + ON PAF0700F ( P7_KEYHEADERFATT ASC , P7_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF0801I + ON PAF0800F ( P8_KEYHEADERFATT ASC , P8_KEYBODYFATT ASC , P8_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAF0901I + ON PAF0900F ( P9_KEYHEADERFATT ASC , P9_KEYBODYFATT ASC , P9_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAF1001I + ON PAF1000F ( P0_KEYHEADERFATT ASC , P0_KEYBODYFATT ASC , P0_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAF1101I + ON PAF1100F ( PA_KEYHEADERFATT ASC , PA_KEYBODYFATT ASC , PA_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAF1201I + ON PAF1200F ( PB_KEYHEADERFATT ASC , PB_KEYBODYFATT ASC , PB_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAF1301I + ON PAF1300F ( PC_KEYHEADERFATT ASC , PC_KEYBODYFATT ASC , PC_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAF1401I + ON PAF1400F ( PD_KEYHEADERFATT ASC , PD_KEYBODYFATT ASC , PD_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAF1501I + ON PAF1500F ( PE_KEYHEADERFATT ASC , PE_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF1601I + ON PAF1600F ( PF_KEYHEADERFATT ASC , PF_KEYBODYFATT ASC , PF_RIFNUMLINEA ASC ) + ; + +CREATE INDEX PAF1701I + ON PAF1700F ( PG_KEYHEADERFATT ASC , PG_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF1801I + ON PAF1800F ( PI_KEYHEADERFATT ASC , PI_KEYBODYFATT ASC , PI_NUMEROLINEA ASC ) + ; + +CREATE INDEX PAF1901I + ON PAF1900F ( PY_KEYHEADERFATT ASC , PY_KEYBODYFATT ASC , PY_KEYNLINEA ASC ) + ; + +CREATE INDEX PAF2001I + ON PAF2000F ( PJ_KEYHEADERFATT ASC , PJ_KEYBODYFATT ASC , PJ_KEYNLINEA ASC , PJ_KEYNLINAR ASC ) + ; + +CREATE INDEX PAF2101I + ON PAF2100F ( PK_KEYHEADERFATT ASC , PK_KEYBODYFATT ASC , PK_KEYNLINEA ASC ) + ; + +CREATE INDEX PAF2201I + ON PAF2200F ( PL_KEYHEADERFATT ASC , PL_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF2301I + ON PAF2300F ( PM_KEYHEADERFATT ASC , PM_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF2401I + ON PAF2400F ( PN_KEYHEADERFATT ASC , PN_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF2501I + ON PAF2500F ( PO_KEYHEADERFATT ASC , PO_KEYBODYFATT ASC , PO_RIGA ASC ) + ; + +CREATE INDEX PAF2601I + ON PAF2600F ( PP_KEYHEADERFATT ASC , PP_KEYBODYFATT ASC , PP_NUMEROLINEA ASC ) + ; + +CREATE INDEX PAF2701I + ON PAF2700F ( PQ_KEYHEADERFATT ASC , PQ_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF2801I + ON PAF2800F ( PR_KEYHEADERFATT ASC , PR_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF2901I + ON PAF2900F ( PS_KEYHEADERFATT ASC , PS_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF3101I + ON PAF3100F ( PH_KEYHEADERFATT ASC , PH_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAF3201I + ON PAF3200F ( PU_KEYHEADERFATT ASC , PU_KEYBODYFATT ASC ) + ; + +CREATE INDEX PAFW301L + ON PAFW300F ( PW_KEYHEADERFATT ASC , PW_KEYBODYFATT ASC , PW_TIPODOC ASC , PW_TIPONUM ASC , PW_NUMERO ASC , PW_DATA ASC ) + ; \ No newline at end of file diff --git a/src/include/applicat.cpp b/src/include/applicat.cpp index 9a6db80f7..f420d7fbc 100755 --- a/src/include/applicat.cpp +++ b/src/include/applicat.cpp @@ -406,8 +406,15 @@ const char* TApplication::get_module_name() const } if (!ok) { - cantaccess_box(module); - module.cut(0); + if(is_power_station()) + { + warning_box("Attenzione! Non sei abilitato per l'utilizzo del modulo %s", static_cast(module)); + } + else + { + cantaccess_box(module); + module.cut(0); + } } } } diff --git a/src/include/campo.aut b/src/include/campo.aut index 464a50487..3c468827e 100755 --- a/src/include/campo.aut +++ b/src/include/campo.aut @@ -19,7 +19,7 @@ at AVIS Provinciale in Elenchi Intracomunitari po Penna Ottica ab Analisi di bilancio -pa Fatturazione elettronica pubblica amministrazione +pa Fattura PA ca Contabilità Analitica sl Stato Avanzamento Lavori ic IVA per cassa @@ -35,7 +35,7 @@ or Ordini ef Effetti db Distinta Base pr Provvigioni Agenti -?? Modulo vario ex-cu Codice Unico Progetto +fp Fatturazione tra Privati + PA sv Statistiche di Vendita mr Manufacturing Resource Planning ?? Modulo vario ex-ec Collegamento E-commerce @@ -46,6 +46,5 @@ l2 Lavanderie 02 bs Bee Store ha Hardy Caffè ri Riclassificazioni -vd Vendita al dettaglio -gv Gestione versamenti F24 -tf Trasferimento fatture \ No newline at end of file +gv Gestione versamenti +tf Trasferimento Fatture \ No newline at end of file diff --git a/src/include/modaut.h b/src/include/modaut.h index 1a7b3d78b..8968daa39 100755 --- a/src/include/modaut.h +++ b/src/include/modaut.h @@ -37,7 +37,7 @@ #define EFAUT 34 #define DBAUT 35 #define PRAUT 36 -//#define CUAUT 37 Obsoleta CUP implicita in CT (1) +#define FPAUT 37 #define SVAUT 38 #define MRAUT 39 #define ECAUT 40 diff --git a/src/include/msksheet.cpp b/src/include/msksheet.cpp index 128dcc74f..c02199282 100755 --- a/src/include/msksheet.cpp +++ b/src/include/msksheet.cpp @@ -278,7 +278,7 @@ protected: // @cmember Ritorna la posizione della colonna con identificatore

int cid2col(short cid) const; // @cmember Ritorna la colonna logica con identificatore

- int cid2index(short cid) const; + static int cid2index(short cid); // @cmember Ritorna la colonna corrispondente al campo

della maschera int field2col(const TOperable_field* f) const; @@ -804,10 +804,9 @@ int TSpreadsheet::cid2col(short cid) const return 0; } -int TSpreadsheet::cid2index(short cid) const +int TSpreadsheet::cid2index(short cid) { - CHECKD(cid >= FIRST_FIELD, "Bad column id ", cid); - return (cid % 100) - 1; + return xvtil_cid2index(cid); } int TSpreadsheet::field2col(const TOperable_field* f) const diff --git a/src/include/tsdb.cpp b/src/include/tsdb.cpp index 45fa207d1..806994eee 100644 --- a/src/include/tsdb.cpp +++ b/src/include/tsdb.cpp @@ -6,7 +6,7 @@ * Classe per esecuzioni di query temporanee (wrapper semplice per SACommand) * ******************************************************************************/ -const TDate SSimpleQuery::sqGetDate(const char * field) +const TDate SSimple_query::sq_get_date(const char * field) { const TDate app(_rec.get_date(field)); return app; diff --git a/src/include/tsdb.h b/src/include/tsdb.h index 9852f46e9..6d1d8eba4 100644 --- a/src/include/tsdb.h +++ b/src/include/tsdb.h @@ -63,7 +63,7 @@ * Preferisco scrivere un po' di codice ridondante adesso che andare a fare * * salti mortali dopo * ********************************************************************************/ -class SSimpleQuery +class SSimple_query { protected: TXvt_recordset _rec; @@ -72,114 +72,115 @@ protected: public: /**< Costruttore, non inizializza nulla, da caricare successivamente */ - SSimpleQuery() {} + SSimple_query() = default; /**< Costruttore, Accetta in ingresso dei parametri per la connessione, volendo è anche possibile impostare una query ed eseguirla. Attenzione! Non risponde se la query ha avuto un esito positivo o negativo! */ - SSimpleQuery(const char* db, const char* user, const char* pass, TT_driver tipoDb, const char * query = "", const bool ex = false, const bool freezed = false) : _rec(db, user, pass, tipoDb, query, ex, freezed) {} + SSimple_query(const char* db, const char* user, const char* pass, TT_driver tipoDb, const char * query = "", const bool ex = false, const bool freezed = false) : _rec(db, user, pass, tipoDb, query, ex, freezed) {} + //SSimpleQuery(const TString& db, const TString& user, const TString& pass, TT_driver tipoDb, const char * query = "", const bool ex = false, const bool freezed = false) : _rec(db, user, pass, tipoDb, query, ex, freezed) {} /**< Distruttore */ - virtual ~SSimpleQuery() {} + virtual ~SSimple_query() = default; // Connection functions /**< Eseguo la connessione */ - int sqConnect(const char* db, const char* user, const char* pass, TT_driver tipoDb) { return _rec.connect(db, user, pass, tipoDb); } + int sq_connect(const char* db, const char* user, const char* pass, TT_driver tipoDb) { return _rec.connect(db, user, pass, tipoDb); } /* Mi scollego */ - void sqDisconnect() { _rec.disconnect(); } + void sq_disconnect() { _rec.disconnect(); } /**< Esegue la commit, di default in caso di errore viene chiamato il metodo rollback() */ - const bool sqCommit(bool autoRoll = true) { return _rec.commit(); } + const bool sq_commit(bool autoRoll = true) { return _rec.commit(); } /**< Esegue il rollback all'ultimo commit */ - const bool sqRollback() { _rec.rollback(); } + const bool sq_rollback() { return _rec.rollback(); } /**< Imposto il tipo di client che utilizzo */ - void sqSetClient(int client) { _rec.setClient((TT_driver)client); } - void sqSetClient(TT_driver client) { _rec.setClient(client); } + void sq_set_client(int client) { _rec.setClient((TT_driver)client); } + void sq_set_client(TT_driver client) { _rec.setClient(client); } // Imposto una opzione generica dellla connessione - void sqSetConOption(const char* opt) { _rec.setConOption(opt); } + void sq_set_con_option(const char* opt) { _rec.setConOption(opt); } /**< Abilito/Disabilito l'autocommit, (disabilitato di default) */ - void sqSetAutocommit(bool ac) { _rec.setAutocommit(ac); } + void sq_set_autocommit(bool ac) { _rec.setAutocommit(ac); } /** Imposta la visibilità delle transazioni (vedi Funzione) */ - void sqSetVisibility(isoLvl vis = committed) { _rec.setVisibility(vis); } + void sq_set_visibility(isoLvl vis = committed) { _rec.setVisibility(vis); } // Getters /** Ritorna se la conessione è connessa */ - const bool sqIsConnect() const { return _rec.isConnect(); } + const bool sq_is_connect() const { return _rec.isConnect(); } /**< Ritorna se la connessione è attiva */ - const bool sqIsAlive() const { return _rec.isAlive(); } + const bool sq_is_alive() const { return _rec.isAlive(); } /** Ritorna la visibilità impostata */ - const int sqGetVisibility() { return _rec.getVisibility(); } + const int sq_get_visibility() { return _rec.getVisibility(); } /**< Ritorna se è attivo l'autocommit, true -> attivo, false -> disattivo o sconosciuto */ - const bool sqGetAutocommit() { return _rec.getAutocommit(); } + const bool sq_get_autocommit() { return _rec.getAutocommit(); } /**< Ritorna il valore dell'opzione specificata */ - const char* sqGetOption(const char* opt) { return _rec.getOption(opt); } + const char* sq_get_option(const char* opt) { return _rec.getOption(opt); } /**< Ritorno la versione del Client che sto utilizzando */ - const long sqGetClientV() { return _rec.getClientV(); } + const long sq_get_client_v() { return _rec.getClientV(); } /**< Ritorno la versione del Server che sto utilizzando */ - const char* sqGetServerV() { return _rec.getServerV(); } + const char* sq_get_server_v() { return _rec.getServerV(); } /**< Ritorno la versione del Server che sto utilizzando in formato numerico */ - const long sqGetServerVN() { return _rec.getServerVN(); } + const long sq_get_server_vn() { return _rec.getServerVN(); } /**< Ritorno se il recordset è carico */ - const bool sqIsLoaded() const { return _rec.isLoaded(); } + const bool sq_is_loaded() const { return _rec.isLoaded(); } /** Ritorno il numero di elementi nella query */ - const long sqItems() { _rec.items(); } + const long sq_items() { return _rec.items(); } // Conguration /**< Imposta la query ricevuta come (const char *) nel recordset */ - const bool sqSet(const char* query) { return _rec.set(query); } + const bool sq_set(const char* query) { return _rec.set(query); } /**< Imposta la query ricevuta come (string) nel recordset */ - const bool sqSet(string query) { return _rec.set(query.c_str()); } + const bool sq_set(string query) { return _rec.set(query.c_str()); } /**< Imposta la query ricevuta come (TString) nel recordset */ - const bool sqSet(TString& query) { return _rec.set(static_cast(query)); } + const bool sq_set(TString& query) { return _rec.set(static_cast(query)); } /**< Esegue la query impostata nel recordset, se viene passato autoF == true esegue anche un comando sqNext() */ - const bool sqExec(bool autoF = true) { return _rec.exec(autoF); } + const bool sq_exec(bool autoF = true) { return _rec.exec(autoF); } /**< Unisce le funzioni sqSet e sqExec, riceve la query come (const char *) */ - const bool sqSetExec(const char* query, bool autoF = true) { _rec.set(query); return _rec.exec(autoF); } + const bool sq_set_exec(const char* query, bool autoF = true) { _rec.set(query); return _rec.exec(autoF); } /**< Unisce le funzioni sqSet e sqExec, riceve la query come (string) */ - const bool sqSetExec(string query, bool autoF = true) { _rec.set(query.c_str()); return _rec.exec(autoF); } + const bool sq_set_exec(string query, bool autoF = true) { _rec.set(query.c_str()); return _rec.exec(autoF); } /**< Unisce le funzioni sqSet e sqExec, riceve la query come (TString) */ - const bool sqSetExec(TString& query, bool autoF = true); + const bool sq_set_exec(TString& query, bool autoF = true) { return sq_set_exec(static_cast(query), autoF); } /**< Si sposta avanti di un record, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sqNext() { return _rec.next(); } + const bool sq_next() { return _rec.next(); } /**< Si sposta indietro di un record, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sqPrev() { return _rec.prev(); } + const bool sq_prev() { return _rec.prev(); } /**< Si sposta avanti di un record, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sqFirst() { return _rec.first(); } + const bool sq_first() { return _rec.first(); } /**< Si sposta al primo record, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sqLast() { return _rec.last(); } + const bool sq_last() { return _rec.last(); } /**< Si sposta alla posizione n, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sqGo(int newPos) { return _rec.go(newPos); } + const bool sq_go(int newPos) { return _rec.go(newPos); } /**< Ritorna il numero di righe affette dall'ultima query */ - const int sqRowsAffected() { return _rec.rowsAffected(); } + const int sq_rows_affected() { return _rec.rowsAffected(); } // Getters /**< Ritorna il valore nel campo (field) in formato (int) */ - const int sqGetInt(const char* field) { return _rec.get_int(field); } + const int sq_get_int(const char* field) { return _rec.get_int(field); } /**< Ritorna il valore nel campo (field) in formato (short) */ - const short sqGetShort(const char* field) { return _rec.get_short(field); } + const short sq_get_short(const char* field) { return _rec.get_short(field); } /**< Ritorna il valore nel campo (field) in formato (long) */ - const long sqGetLong(const char* field) { return _rec.get_long(field); } + const long sq_get_long(const char* field) { return _rec.get_long(field); } /**< Ritorna il valore nel campo (field) in formato (double) */ - const double sqGetDouble(const char* field) { return _rec.get_double(field); } + const double sq_get_double(const char* field) { return _rec.get_double(field); } /**< Ritorna il valore nel campo (field) in formato (bool) */ - const bool sqGetBool(const char* field) { return _rec.get_bool(field); } + const bool sq_get_bool(const char* field) { return _rec.get_bool(field); } /**< Ritorna il valore nel campo (field) in formato (TDate) */ - const TDate sqGetDate(const char* field); + const TDate sq_get_date(const char* field); /**< Ritorna il valore nel campo (field) in formato (real) */ - const real sqGetReal(const char* field); + const real sq_get_real(const char* field); /**< Ritorna il valore nel campo (field) in formato (SADateTime), Campo non gestisce le ore */ //SADateTime sqGetDateTime(const char* field) { get_short(field); } /**< Ritorna il valore nel campo (field) passato come (const char *) in formato (const char *) */ - const char* sqGet(const char* field) { return _rec.get(field); } + const char* sq_get(const char* field) { return _rec.get(field); } /**< Ritorna il valore nel campo (field) passato come (string) in formato (const char *) */ - const char* sqGet(string field) { return _rec.get(field.c_str()); } + const char* sq_get(string field) { return _rec.get(field.c_str()); } /**< Ritorna il valore nel campo (field) passato come (TString) in formato (const char *) */ - const char* sqGet(TString& field) { return _rec.get(static_cast(field)); } + const char* sq_get(TString& field) { return _rec.get(static_cast(field)); } /**< Ritorna il valore nel campo (field) in formato (char) */ - const char sqGetChar(const char* field) { return _rec.get_char(field); } + const char sq_get_char(const char* field) { return _rec.get_char(field); } /**< Ritorna la posizione attuale */ - const long sqPos() const { return _rec.pos(); } + const long sq_pos() const { return _rec.pos(); } // Error Getters /**< Ritorno l'ultimo codice errore segnalato in formato /int) */ - const long sqGetCodeError(bool erase = true) { return _rec.get_code_error(erase); } + const long sq_get_code_error(bool erase = true) { return _rec.get_code_error(erase); } /**< Ritorno l'ultima stringa di errore segnalato in formato (const char *) */ - const char* sqGetStringError(bool erase = true) { return _rec.get_string_error(erase); } + const char* sq_get_string_error(bool erase = true) { return _rec.get_string_error(erase); } //char * getCharPointer(const char * field) { return const_cast(static_cast(recset.Field(field).asString())); } }; diff --git a/src/include/utility.cpp b/src/include/utility.cpp index 710d73ca6..43f9a9c4b 100755 --- a/src/include/utility.cpp +++ b/src/include/utility.cpp @@ -707,3 +707,13 @@ void quoted_string(TString& query, const char* val) } query << '\''; } + +TString& to_tstring(long n) +{ + return get_tmp_string().cut(0) << n; +} + +TString& to_tstring(int n) +{ + return to_tstring(static_cast(n)); +} diff --git a/src/include/utility.h b/src/include/utility.h index fcb3f581e..947523a19 100755 --- a/src/include/utility.h +++ b/src/include/utility.h @@ -73,4 +73,7 @@ void quoted_string(TString& query, const char* val); inline const char* get_iva_sirio() // Ritorna la partita IVA della Sirio { return "04879210963"; } +TString& to_tstring(long n); +TString& to_tstring(int n); + #endif /* __UTILITY_H */ diff --git a/src/include/xvtility.cpp b/src/include/xvtility.cpp index 68656c66c..5ea294f25 100755 --- a/src/include/xvtility.cpp +++ b/src/include/xvtility.cpp @@ -9,7 +9,8 @@ #include #include -#include +#include +#include short CHARX = 8; short CHARY = 14; @@ -842,3 +843,8 @@ PEN_STYLE trans_pen( return ps; } +int xvtil_cid2index(const int cid) +{ + CHECKD(cid >= FIRST_FIELD, "Bad column id ", cid); + return (cid % 100) - 1; +} diff --git a/src/include/xvtility.h b/src/include/xvtility.h index 6cd1e60f1..f559879ed 100755 --- a/src/include/xvtility.h +++ b/src/include/xvtility.h @@ -45,6 +45,8 @@ bool xvtil_popup_warning(const char* msg); bool xvtil_popup_error(const char* msg); bool xvtil_system_error(unsigned long lasterror, ...); +int xvtil_cid2index(const int cid); + void beep(int severity = 0); void do_events(); diff --git a/src/ve/velib.h b/src/ve/velib.h index 71ec1e5a2..a6114f8c3 100755 --- a/src/ve/velib.h +++ b/src/ve/velib.h @@ -319,7 +319,9 @@ public: const TString & caus_anticipo() const {return get("S10"); } const TString & tipi_iva_validi() const {return get("S11"); } // Ritorna il ripo documento in formato SDI (TD01, TD02 ..) - const TString & tipo_doc_sdi() const { return get("S12"); } + const TString & tipo_doc_sdi() const { return get("S3").mid(37,4); } + // Ritorna il regime fiscale + const TString & reg_fisc() const { return get("S3").mid(41, 4); } const char stato_finale_inserimento() const {return get("S2")[0]; } const char stato_finale_stampa() const {return get("S2")[1]; } const char stato_bloccato() const {return get("S2")[2]; } @@ -351,7 +353,7 @@ public: bool fattura_commerciale() const { return get_bool("B9"); } bool allega_documenti() const { return get_bool("B10"); } bool auto_add() const { return get_bool("B11"); } - bool invio_xml() const { return get_bool("B12"); } + bool invio_xml() const { return get_bool("B13"); } const TString& stringa_descrizione_documento() const { return _str_desc_doc; } const TString& stringa_descrizione_riga() const { return _str_desc_rdoc; } diff --git a/src/ve/vetbtip.h b/src/ve/vetbtip.h index 5d568aef5..b62fe7508 100755 --- a/src/ve/vetbtip.h +++ b/src/ve/vetbtip.h @@ -26,7 +26,8 @@ #define F_NATURA 124 #define F_NOTACREDDEB 125 #define F_LORDO 126 -#define F_FATCOM 127 +#define F_REG_FISC 127 +#define F_FATCOM 128 #define F_PMAIL 129 #define F_PSTAMPA2 130 #define F_NCOPIE2 131 diff --git a/src/ve/vetbtip.uml b/src/ve/vetbtip.uml index c8bb1affc..5e6e49c9b 100755 --- a/src/ve/vetbtip.uml +++ b/src/ve/vetbtip.uml @@ -85,7 +85,7 @@ END LIST F_TIPO_SDI 35 BEGIN PROMPT 2 5 "Tipo documento SDI " - FIELD S12 + FIELD S3[37,40] ITEM "|" ITEM "TD01|TD01 Fattura" MESSAGE ENABLE,F_NOTACREDDEB|"" ITEM "TD02|TD02 Acconto/Anticipo su fattura" MESSAGE ENABLE,F_NOTACREDDEB|"" @@ -98,7 +98,7 @@ END BOOLEAN F_ESPORTA_FP BEGIN PROMPT 65 5 "Invio XML" - FIELD B12 + FIELD B13 END GROUPBOX DLG_NULL 78 5 @@ -202,30 +202,55 @@ END BOOLEAN F_NOTACREDDEB BEGIN - PROMPT 2 13 "Nota di credito/debito" + PROMPT 2 13 "Nota di cred/deb" FIELD B7 END -BOOLEAN F_LORDO +LIST F_REG_FISC 40 BEGIN - PROMPT 40 13 "Calcolo importi al lordo" - FIELD B8 - MESSAGE TRUE CLEAR,F_FATCOM - MESSAGE FALSE ENABLE,F_FATCOM + PROMPT 23 13 "Regime Fisc. " + FIELD S3[41,44] + ITEM "|" + ITEM "RF01|RF01 Ordinario" + ITEM "RF02|RF02 Contribuenti minimi" + ITEM "RF04|RF04 Agricoltura, connesse e pesca" + ITEM "RF05|RF05 Vendita sali e tabacchi" + ITEM "RF06|RF06 Commercio fiammiferi" + ITEM "RF07|RF07 Editoria" + ITEM "RF08|RF08 Gestione servizi tel. pubblica" + ITEM "RF09|RF09 Rivendita DdT pubblico e di sosta" + ITEM "RF10|RF10 Intr., giochi e altre attività" + ITEM "RF11|RF11 Agenzie viaggi e turismo" + ITEM "RF12|RF12 Agriturismo" + ITEM "RF13|RF13 Vendite a domicilio" + ITEM "RF14|RF14 Rivendita usato, arte, ant. o col." + ITEM "RF15|RF15 Asta d’arte, ant. o da col." + ITEM "RF16|RF16 IVA per cassa P.A." + ITEM "RF17|RF17 IVA per cassa" + ITEM "RF18|RF18 Altro" + ITEM "RF19|RF19 Regime forfettario" END BOOLEAN F_SPESEAUT BEGIN - PROMPT 2 14 "Addebito automatico spese cliente" + PROMPT 2 14 "Addebito auto spese cliente" FIELD B0 END BOOLEAN F_FATCOM BEGIN - PROMPT 40 14 "Calcolo fattura commerciale" + PROMPT 30 14 "Calcolo fattura commerciale" FIELD B9 END +BOOLEAN F_LORDO +BEGIN + PROMPT 55 14 "Calcolo importi al lordo" + FIELD B8 + MESSAGE TRUE CLEAR,F_FATCOM + MESSAGE FALSE ENABLE,F_FATCOM +END + BOOLEAN F_MOVMAG BEGIN PROMPT 2 15 "Mov. magazzino" diff --git a/src/xvtdb/xvtdb.cpp b/src/xvtdb/xvtdb.cpp index d64b9fdc2..50a19adc1 100644 --- a/src/xvtdb/xvtdb.cpp +++ b/src/xvtdb/xvtdb.cpp @@ -11,7 +11,7 @@ * Classe per esecuzioni di query temporanee (wrapper semplice per SACommand) * ******************************************************************************/ -TXvt_recordset::TXvt_recordset() +TXvt_recordset::TXvt_recordset() : _freezed(false) { _con = new SAConnection; _recset = new SACommand; @@ -28,7 +28,7 @@ TXvt_recordset::TXvt_recordset() TXvt_recordset::TXvt_recordset(const char* db, const char* user, const char* pass, TT_driver tipoDb, const char * query, const bool ex, const bool freezed) - : _db(db), _usr(user), _psw(pass), _drv(tipoDb) + : _db(db), _usr(user), _psw(pass), _drv(tipoDb), _freezed(false) { _con = new SAConnection; if(connect(db, user, pass, tipoDb) == NOERR) @@ -62,14 +62,14 @@ TXvt_recordset::~TXvt_recordset() { try { + // Se non è connesso viene lanciata l'eccezione if(_CON(_con)->isConnected()) _CON(_con)->Disconnect(); - if(_con != NULL) - delete _con; - if(_recset != NULL) - delete _recset; } catch (...) {} + // Prima cancellare il recordset POI la connessione + delete _recset; + delete _con; } /* PRIVATE FUNCTIONS **************************************************************************************************/ @@ -301,22 +301,22 @@ bool TXvt_recordset::set(const char* query) bool TXvt_recordset::exec(bool autoF) { CHECK_FREEZED + bool ok = false; try { _RCS(_recset)->Execute(); _recno = -1; - if (autoF) - { - next(); - } + // Se trovo almeno un "select" faccio l'autofetch + SAString s = _RCS(_recset)->CommandText(); s.MakeUpper(); + ok = s.Find("SELECT") != SIZE_MAX && autoF ? next() : true; } catch (SAException &x) { _codeError = x.ErrNativeCode(); _stringError = x.ErrMessage(); - return false; + ok = false; } - return true; + return ok; } bool TXvt_recordset::setExec(const char* query, bool autoF)