00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00016 #ifndef __DRIZZLE_CONSTANTS_H
00017 #define __DRIZZLE_CONSTANTS_H
00018
00019 #ifdef __cplusplus
00020 extern "C" {
00021 #endif
00022
00033 #define DRIZZLE_RETURN_SERVER_GONE DRIZZLE_RETURN_LOST_CONNECTION
00034 #define DRIZZLE_RETURN_EOF DRIZZLE_RETURN_LOST_CONNECTION
00035 #define DRIZZLE_COLUMN_TYPE_VIRTUAL 17
00036
00037
00038 #define DRIZZLE_DEFAULT_TCP_HOST "127.0.0.1"
00039 #define DRIZZLE_DEFAULT_TCP_PORT 4427
00040 #define DRIZZLE_DEFAULT_TCP_PORT_MYSQL 3306
00041 #define DRIZZLE_DEFAULT_UDS "/tmp/drizzle.sock"
00042 #define DRIZZLE_DEFAULT_UDS_MYSQL "/tmp/mysql.sock"
00043 #define DRIZZLE_DEFAULT_BACKLOG 64
00044 #define DRIZZLE_MAX_ERROR_SIZE 2048
00045 #define DRIZZLE_MAX_USER_SIZE 64
00046 #define DRIZZLE_MAX_PASSWORD_SIZE 32
00047 #define DRIZZLE_MAX_DB_SIZE 64
00048 #define DRIZZLE_MAX_INFO_SIZE 2048
00049 #define DRIZZLE_MAX_SQLSTATE_SIZE 5
00050 #define DRIZZLE_MAX_CATALOG_SIZE 128
00051 #define DRIZZLE_MAX_TABLE_SIZE 128
00052 #define DRIZZLE_MAX_COLUMN_NAME_SIZE 2048
00053 #define DRIZZLE_MAX_DEFAULT_VALUE_SIZE 2048
00054 #define DRIZZLE_MAX_PACKET_SIZE UINT32_MAX
00055 #define DRIZZLE_MAX_BUFFER_SIZE 32768
00056 #define DRIZZLE_BUFFER_COPY_THRESHOLD 8192
00057 #define DRIZZLE_MAX_SERVER_VERSION_SIZE 32
00058 #define DRIZZLE_MAX_SCRAMBLE_SIZE 20
00059 #define DRIZZLE_STATE_STACK_SIZE 8
00060 #define DRIZZLE_ROW_GROW_SIZE 8192
00061 #define DRIZZLE_DEFAULT_SOCKET_TIMEOUT 10
00062 #define DRIZZLE_DEFAULT_SOCKET_SEND_SIZE 32768
00063 #define DRIZZLE_DEFAULT_SOCKET_RECV_SIZE 32768
00064
00068 typedef enum
00069 {
00070 DRIZZLE_RETURN_OK,
00071 DRIZZLE_RETURN_IO_WAIT,
00072 DRIZZLE_RETURN_PAUSE,
00073 DRIZZLE_RETURN_ROW_BREAK,
00074 DRIZZLE_RETURN_MEMORY,
00075 DRIZZLE_RETURN_ERRNO,
00076 DRIZZLE_RETURN_INTERNAL_ERROR,
00077 DRIZZLE_RETURN_GETADDRINFO,
00078 DRIZZLE_RETURN_NOT_READY,
00079 DRIZZLE_RETURN_BAD_PACKET_NUMBER,
00080 DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET,
00081 DRIZZLE_RETURN_BAD_PACKET,
00082 DRIZZLE_RETURN_PROTOCOL_NOT_SUPPORTED,
00083 DRIZZLE_RETURN_UNEXPECTED_DATA,
00084 DRIZZLE_RETURN_NO_SCRAMBLE,
00085 DRIZZLE_RETURN_AUTH_FAILED,
00086 DRIZZLE_RETURN_NULL_SIZE,
00087 DRIZZLE_RETURN_ERROR_CODE,
00088 DRIZZLE_RETURN_TOO_MANY_COLUMNS,
00089 DRIZZLE_RETURN_ROW_END,
00090 DRIZZLE_RETURN_LOST_CONNECTION,
00091 DRIZZLE_RETURN_COULD_NOT_CONNECT,
00092 DRIZZLE_RETURN_NO_ACTIVE_CONNECTIONS,
00093 DRIZZLE_RETURN_HANDSHAKE_FAILED,
00094 DRIZZLE_RETURN_TIMEOUT,
00095 DRIZZLE_RETURN_MAX
00096 } drizzle_return_t;
00097
00101 typedef enum
00102 {
00103 DRIZZLE_VERBOSE_NEVER,
00104 DRIZZLE_VERBOSE_FATAL,
00105 DRIZZLE_VERBOSE_ERROR,
00106 DRIZZLE_VERBOSE_INFO,
00107 DRIZZLE_VERBOSE_DEBUG,
00108 DRIZZLE_VERBOSE_CRAZY,
00109 DRIZZLE_VERBOSE_MAX
00110 } drizzle_verbose_t;
00111
00118 typedef enum
00119 {
00120 DRIZZLE_NONE= 0,
00121 DRIZZLE_ALLOCATED= (1 << 0),
00122 DRIZZLE_NON_BLOCKING= (1 << 1),
00123 DRIZZLE_FREE_OBJECTS= (1 << 2),
00124 DRIZZLE_ASSERT_DANGLING= (1 << 3)
00125 } drizzle_options_t;
00126
00131 typedef enum
00132 {
00133 DRIZZLE_CON_NONE= 0,
00134 DRIZZLE_CON_ALLOCATED= (1 << 0),
00135 DRIZZLE_CON_MYSQL= (1 << 1),
00136 DRIZZLE_CON_RAW_PACKET= (1 << 2),
00137 DRIZZLE_CON_RAW_SCRAMBLE= (1 << 3),
00138 DRIZZLE_CON_READY= (1 << 4),
00139 DRIZZLE_CON_NO_RESULT_READ= (1 << 5),
00140 DRIZZLE_CON_IO_READY= (1 << 6),
00141 DRIZZLE_CON_LISTEN= (1 << 7),
00142 DRIZZLE_CON_EXPERIMENTAL= (1 << 8)
00143 } drizzle_con_options_t;
00144
00149 typedef enum
00150 {
00151 DRIZZLE_CON_SOCKET_TCP= 0,
00152 DRIZZLE_CON_SOCKET_UDS= (1 << 0)
00153 } drizzle_con_socket_t;
00154
00159 typedef enum
00160 {
00161 DRIZZLE_CON_STATUS_NONE= 0,
00162 DRIZZLE_CON_STATUS_IN_TRANS= (1 << 0),
00163 DRIZZLE_CON_STATUS_AUTOCOMMIT= (1 << 1),
00164 DRIZZLE_CON_STATUS_MORE_RESULTS_EXISTS= (1 << 3),
00165 DRIZZLE_CON_STATUS_QUERY_NO_GOOD_INDEX_USED= (1 << 4),
00166 DRIZZLE_CON_STATUS_QUERY_NO_INDEX_USED= (1 << 5),
00167 DRIZZLE_CON_STATUS_CURSOR_EXISTS= (1 << 6),
00168 DRIZZLE_CON_STATUS_LAST_ROW_SENT= (1 << 7),
00169 DRIZZLE_CON_STATUS_DB_DROPPED= (1 << 8),
00170 DRIZZLE_CON_STATUS_NO_BACKSLASH_ESCAPES= (1 << 9),
00171 DRIZZLE_CON_STATUS_QUERY_WAS_SLOW= (1 << 10)
00172 } drizzle_con_status_t;
00173
00178 typedef enum
00179 {
00180 DRIZZLE_CAPABILITIES_NONE= 0,
00181 DRIZZLE_CAPABILITIES_LONG_PASSWORD= (1 << 0),
00182 DRIZZLE_CAPABILITIES_FOUND_ROWS= (1 << 1),
00183 DRIZZLE_CAPABILITIES_LONG_FLAG= (1 << 2),
00184 DRIZZLE_CAPABILITIES_CONNECT_WITH_DB= (1 << 3),
00185 DRIZZLE_CAPABILITIES_NO_SCHEMA= (1 << 4),
00186 DRIZZLE_CAPABILITIES_COMPRESS= (1 << 5),
00187 DRIZZLE_CAPABILITIES_ODBC= (1 << 6),
00188 DRIZZLE_CAPABILITIES_LOCAL_FILES= (1 << 7),
00189 DRIZZLE_CAPABILITIES_IGNORE_SPACE= (1 << 8),
00190 DRIZZLE_CAPABILITIES_PROTOCOL_41= (1 << 9),
00191 DRIZZLE_CAPABILITIES_INTERACTIVE= (1 << 10),
00192 DRIZZLE_CAPABILITIES_SSL= (1 << 11),
00193 DRIZZLE_CAPABILITIES_IGNORE_SIGPIPE= (1 << 12),
00194 DRIZZLE_CAPABILITIES_TRANSACTIONS= (1 << 13),
00195 DRIZZLE_CAPABILITIES_RESERVED= (1 << 14),
00196 DRIZZLE_CAPABILITIES_SECURE_CONNECTION= (1 << 15),
00197 DRIZZLE_CAPABILITIES_MULTI_STATEMENTS= (1 << 16),
00198 DRIZZLE_CAPABILITIES_MULTI_RESULTS= (1 << 17),
00199 DRIZZLE_CAPABILITIES_SSL_VERIFY_SERVER_CERT= (1 << 30),
00200 DRIZZLE_CAPABILITIES_REMEMBER_OPTIONS= (1 << 31),
00201 DRIZZLE_CAPABILITIES_CLIENT= (DRIZZLE_CAPABILITIES_LONG_PASSWORD |
00202 DRIZZLE_CAPABILITIES_LONG_FLAG |
00203 DRIZZLE_CAPABILITIES_CONNECT_WITH_DB |
00204 DRIZZLE_CAPABILITIES_TRANSACTIONS |
00205 DRIZZLE_CAPABILITIES_PROTOCOL_41 |
00206 DRIZZLE_CAPABILITIES_SECURE_CONNECTION)
00207 } drizzle_capabilities_t;
00208
00213 typedef enum
00214 {
00215 DRIZZLE_COMMAND_SLEEP,
00216 DRIZZLE_COMMAND_QUIT,
00217 DRIZZLE_COMMAND_INIT_DB,
00218 DRIZZLE_COMMAND_QUERY,
00219 DRIZZLE_COMMAND_FIELD_LIST,
00220 DRIZZLE_COMMAND_CREATE_DB,
00221 DRIZZLE_COMMAND_DROP_DB,
00222 DRIZZLE_COMMAND_REFRESH,
00223 DRIZZLE_COMMAND_SHUTDOWN,
00224 DRIZZLE_COMMAND_STATISTICS,
00225 DRIZZLE_COMMAND_PROCESS_INFO,
00226 DRIZZLE_COMMAND_CONNECT,
00227 DRIZZLE_COMMAND_PROCESS_KILL,
00228 DRIZZLE_COMMAND_DEBUG,
00229 DRIZZLE_COMMAND_PING,
00230 DRIZZLE_COMMAND_TIME,
00231 DRIZZLE_COMMAND_DELAYED_INSERT,
00232 DRIZZLE_COMMAND_CHANGE_USER,
00233 DRIZZLE_COMMAND_BINLOG_DUMP,
00234 DRIZZLE_COMMAND_TABLE_DUMP,
00235 DRIZZLE_COMMAND_CONNECT_OUT,
00236 DRIZZLE_COMMAND_REGISTER_SLAVE,
00237 DRIZZLE_COMMAND_STMT_PREPARE,
00238 DRIZZLE_COMMAND_STMT_EXECUTE,
00239 DRIZZLE_COMMAND_STMT_SEND_LONG_DATA,
00240 DRIZZLE_COMMAND_STMT_CLOSE,
00241 DRIZZLE_COMMAND_STMT_RESET,
00242 DRIZZLE_COMMAND_SET_OPTION,
00243 DRIZZLE_COMMAND_STMT_FETCH,
00244 DRIZZLE_COMMAND_DAEMON,
00245 DRIZZLE_COMMAND_END
00246 } drizzle_command_t;
00247
00252 typedef enum
00253 {
00254 DRIZZLE_COMMAND_DRIZZLE_SLEEP,
00255 DRIZZLE_COMMAND_DRIZZLE_QUIT,
00256 DRIZZLE_COMMAND_DRIZZLE_INIT_DB,
00257 DRIZZLE_COMMAND_DRIZZLE_QUERY,
00258 DRIZZLE_COMMAND_DRIZZLE_SHUTDOWN,
00259 DRIZZLE_COMMAND_DRIZZLE_CONNECT,
00260 DRIZZLE_COMMAND_DRIZZLE_PING,
00261 DRIZZLE_COMMAND_DRIZZLE_END
00262 } drizzle_command_drizzle_t;
00263
00268 typedef enum
00269 {
00270 DRIZZLE_QUERY_ALLOCATED= (1 << 0)
00271 } drizzle_query_options_t;
00272
00277 typedef enum
00278 {
00279 DRIZZLE_QUERY_STATE_INIT,
00280 DRIZZLE_QUERY_STATE_QUERY,
00281 DRIZZLE_QUERY_STATE_RESULT,
00282 DRIZZLE_QUERY_STATE_DONE
00283 } drizzle_query_state_t;
00284
00289 typedef enum
00290 {
00291 DRIZZLE_RESULT_NONE= 0,
00292 DRIZZLE_RESULT_ALLOCATED= (1 << 0),
00293 DRIZZLE_RESULT_SKIP_COLUMN= (1 << 1),
00294 DRIZZLE_RESULT_BUFFER_COLUMN= (1 << 2),
00295 DRIZZLE_RESULT_BUFFER_ROW= (1 << 3),
00296 DRIZZLE_RESULT_EOF_PACKET= (1 << 4),
00297 DRIZZLE_RESULT_ROW_BREAK= (1 << 5)
00298 } drizzle_result_options_t;
00299
00304 typedef enum
00305 {
00306 DRIZZLE_COLUMN_ALLOCATED= (1 << 0)
00307 } drizzle_column_options_t;
00308
00313 typedef enum
00314 {
00315 DRIZZLE_COLUMN_TYPE_DECIMAL,
00316 DRIZZLE_COLUMN_TYPE_TINY,
00317 DRIZZLE_COLUMN_TYPE_SHORT,
00318 DRIZZLE_COLUMN_TYPE_LONG,
00319 DRIZZLE_COLUMN_TYPE_FLOAT,
00320 DRIZZLE_COLUMN_TYPE_DOUBLE,
00321 DRIZZLE_COLUMN_TYPE_NULL,
00322 DRIZZLE_COLUMN_TYPE_TIMESTAMP,
00323 DRIZZLE_COLUMN_TYPE_LONGLONG,
00324 DRIZZLE_COLUMN_TYPE_INT24,
00325 DRIZZLE_COLUMN_TYPE_DATE,
00326 DRIZZLE_COLUMN_TYPE_TIME,
00327 DRIZZLE_COLUMN_TYPE_DATETIME,
00328 DRIZZLE_COLUMN_TYPE_YEAR,
00329 DRIZZLE_COLUMN_TYPE_NEWDATE,
00330 DRIZZLE_COLUMN_TYPE_VARCHAR,
00331 DRIZZLE_COLUMN_TYPE_BIT,
00332 DRIZZLE_COLUMN_TYPE_NEWDECIMAL= 246,
00333 DRIZZLE_COLUMN_TYPE_ENUM= 247,
00334 DRIZZLE_COLUMN_TYPE_SET= 248,
00335 DRIZZLE_COLUMN_TYPE_TINY_BLOB= 249,
00336 DRIZZLE_COLUMN_TYPE_MEDIUM_BLOB= 250,
00337 DRIZZLE_COLUMN_TYPE_LONG_BLOB= 251,
00338 DRIZZLE_COLUMN_TYPE_BLOB= 252,
00339 DRIZZLE_COLUMN_TYPE_VAR_STRING= 253,
00340 DRIZZLE_COLUMN_TYPE_STRING= 254,
00341 DRIZZLE_COLUMN_TYPE_GEOMETRY= 255
00342 } drizzle_column_type_t;
00343
00348 typedef enum
00349 {
00350 DRIZZLE_COLUMN_TYPE_DRIZZLE_TINY,
00351 DRIZZLE_COLUMN_TYPE_DRIZZLE_LONG,
00352 DRIZZLE_COLUMN_TYPE_DRIZZLE_DOUBLE,
00353 DRIZZLE_COLUMN_TYPE_DRIZZLE_NULL,
00354 DRIZZLE_COLUMN_TYPE_DRIZZLE_TIMESTAMP,
00355 DRIZZLE_COLUMN_TYPE_DRIZZLE_LONGLONG,
00356 DRIZZLE_COLUMN_TYPE_DRIZZLE_DATETIME,
00357 DRIZZLE_COLUMN_TYPE_DRIZZLE_DATE,
00358 DRIZZLE_COLUMN_TYPE_DRIZZLE_VARCHAR,
00359 DRIZZLE_COLUMN_TYPE_DRIZZLE_NEWDECIMAL,
00360 DRIZZLE_COLUMN_TYPE_DRIZZLE_ENUM,
00361 DRIZZLE_COLUMN_TYPE_DRIZZLE_BLOB,
00362 DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX=DRIZZLE_COLUMN_TYPE_DRIZZLE_BLOB
00363 } drizzle_column_type_drizzle_t;
00364
00369 typedef enum
00370 {
00371 DRIZZLE_COLUMN_FLAGS_NONE= 0,
00372 DRIZZLE_COLUMN_FLAGS_NOT_NULL= (1 << 0),
00373 DRIZZLE_COLUMN_FLAGS_PRI_KEY= (1 << 1),
00374 DRIZZLE_COLUMN_FLAGS_UNIQUE_KEY= (1 << 2),
00375 DRIZZLE_COLUMN_FLAGS_MULTIPLE_KEY= (1 << 3),
00376 DRIZZLE_COLUMN_FLAGS_BLOB= (1 << 4),
00377 DRIZZLE_COLUMN_FLAGS_UNSIGNED= (1 << 5),
00378 DRIZZLE_COLUMN_FLAGS_ZEROFILL= (1 << 6),
00379 DRIZZLE_COLUMN_FLAGS_BINARY= (1 << 7),
00380 DRIZZLE_COLUMN_FLAGS_ENUM= (1 << 8),
00381 DRIZZLE_COLUMN_FLAGS_AUTO_INCREMENT= (1 << 9),
00382 DRIZZLE_COLUMN_FLAGS_TIMESTAMP= (1 << 10),
00383 DRIZZLE_COLUMN_FLAGS_SET= (1 << 11),
00384 DRIZZLE_COLUMN_FLAGS_NO_DEFAULT_VALUE= (1 << 12),
00385 DRIZZLE_COLUMN_FLAGS_ON_UPDATE_NOW= (1 << 13),
00386 DRIZZLE_COLUMN_FLAGS_PART_KEY= (1 << 14),
00387 DRIZZLE_COLUMN_FLAGS_NUM= (1 << 15),
00388 DRIZZLE_COLUMN_FLAGS_GROUP= (1 << 15),
00389 DRIZZLE_COLUMN_FLAGS_UNIQUE= (1 << 16),
00390 DRIZZLE_COLUMN_FLAGS_BINCMP= (1 << 17),
00391 DRIZZLE_COLUMN_FLAGS_GET_FIXED_FIELDS= (1 << 18),
00392 DRIZZLE_COLUMN_FLAGS_IN_PART_FUNC= (1 << 19),
00393 DRIZZLE_COLUMN_FLAGS_IN_ADD_INDEX= (1 << 20),
00394 DRIZZLE_COLUMN_FLAGS_RENAMED= (1 << 21)
00395 } drizzle_column_flags_t;
00396
00404
00405 typedef struct drizzle_st drizzle_st;
00406 typedef struct drizzle_con_tcp_st drizzle_con_tcp_st;
00407 typedef struct drizzle_con_uds_st drizzle_con_uds_st;
00408 typedef struct drizzle_con_st drizzle_con_st;
00409 typedef struct drizzle_query_st drizzle_query_st;
00410 typedef struct drizzle_result_st drizzle_result_st;
00411 typedef struct drizzle_column_st drizzle_column_st;
00412 typedef char *drizzle_field_t;
00413 typedef drizzle_field_t *drizzle_row_t;
00414 typedef uint8_t drizzle_charset_t;
00415
00416
00417 typedef void (drizzle_context_free_fn)(drizzle_st *drizzle,
00418 void *context);
00419 typedef void (drizzle_log_fn)(const char *line, drizzle_verbose_t verbose,
00420 void *context);
00421 typedef drizzle_return_t (drizzle_state_fn)(drizzle_con_st *con);
00422 typedef void (drizzle_con_context_free_fn)(drizzle_con_st *con,
00423 void *context);
00424 typedef void (drizzle_query_context_free_fn)(drizzle_query_st *query,
00425 void *context);
00438 typedef drizzle_return_t (drizzle_event_watch_fn)(drizzle_con_st *con,
00439 short events,
00440 void *context);
00441
00451
00452 #define drizzle_get_byte2(__buffer) \
00453 (uint16_t)((__buffer)[0] | \
00454 ((__buffer)[1] << 8))
00455 #define drizzle_get_byte3(__buffer) \
00456 (uint32_t)((__buffer)[0] | \
00457 ((__buffer)[1] << 8) | \
00458 ((__buffer)[2] << 16))
00459 #define drizzle_get_byte4(__buffer) \
00460 (uint32_t)((__buffer)[0] | \
00461 ((__buffer)[1] << 8) | \
00462 ((__buffer)[2] << 16) | \
00463 ((__buffer)[3] << 24))
00464 #define drizzle_get_byte8(__buffer) \
00465 ((uint64_t)(__buffer)[0] | \
00466 ((uint64_t)(__buffer)[1] << 8) | \
00467 ((uint64_t)(__buffer)[2] << 16) | \
00468 ((uint64_t)(__buffer)[3] << 24) | \
00469 ((uint64_t)(__buffer)[4] << 32) | \
00470 ((uint64_t)(__buffer)[5] << 40) | \
00471 ((uint64_t)(__buffer)[6] << 48) | \
00472 ((uint64_t)(__buffer)[7] << 56))
00473
00474
00475 #define drizzle_set_byte2(__buffer, __int) do { \
00476 (__buffer)[0]= (uint8_t)((__int) & 0xFF); \
00477 (__buffer)[1]= (uint8_t)(((__int) >> 8) & 0xFF); } while (0)
00478 #define drizzle_set_byte3(__buffer, __int) do { \
00479 (__buffer)[0]= (uint8_t)((__int) & 0xFF); \
00480 (__buffer)[1]= (uint8_t)(((__int) >> 8) & 0xFF); \
00481 (__buffer)[2]= (uint8_t)(((__int) >> 16) & 0xFF); } while (0)
00482 #define drizzle_set_byte4(__buffer, __int) do { \
00483 (__buffer)[0]= (uint8_t)((__int) & 0xFF); \
00484 (__buffer)[1]= (uint8_t)(((__int) >> 8) & 0xFF); \
00485 (__buffer)[2]= (uint8_t)(((__int) >> 16) & 0xFF); \
00486 (__buffer)[3]= (uint8_t)(((__int) >> 24) & 0xFF); } while (0)
00487 #define drizzle_set_byte8(__buffer, __int) do { \
00488 (__buffer)[0]= (uint8_t)((__int) & 0xFF); \
00489 (__buffer)[1]= (uint8_t)(((__int) >> 8) & 0xFF); \
00490 (__buffer)[2]= (uint8_t)(((__int) >> 16) & 0xFF); \
00491 (__buffer)[3]= (uint8_t)(((__int) >> 24) & 0xFF); \
00492 (__buffer)[4]= (uint8_t)(((__int) >> 32) & 0xFF); \
00493 (__buffer)[5]= (uint8_t)(((__int) >> 40) & 0xFF); \
00494 (__buffer)[6]= (uint8_t)(((__int) >> 48) & 0xFF); \
00495 (__buffer)[7]= (uint8_t)(((__int) >> 56) & 0xFF); } while (0)
00496
00497
00498 #define drizzle_mb_char(__c) (((__c) & 0x80) != 0)
00499 #define drizzle_mb_length(__c) \
00500 ((uint32_t)(__c) <= 0x7f ? 1 : \
00501 ((uint32_t)(__c) <= 0x7ff ? 2 : \
00502 ((uint32_t)(__c) <= 0xd7ff ? 3 : \
00503 ((uint32_t)(__c) <= 0xdfff || (uint32_t)(__c) > 0x10ffff ? 0 : \
00504 ((uint32_t)(__c) <= 0xffff ? 3 : 4)))))
00505
00508 #ifdef __cplusplus
00509 }
00510 #endif
00511
00512 #endif