1 /* Copyright (c) 2003, 2005 MySQL AB
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; version 2 of the License.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 GNU General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with this program; if not, write to the Free Software
14 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
16 /***************************************************************
17 * I N C L U D E D F I L E S *
18 ***************************************************************/
20 #include <ndb_global.h>
25 #include "ndb_error.hpp"
26 #include "userInterface.h"
27 #include <NdbThread.h>
31 #include "ndb_schema.hpp"
33 #include <NdbSchemaCon.hpp>
35 /***************************************************************
36 * L O C A L C O N S T A N T S *
37 ***************************************************************/
39 /***************************************************************
40 * L O C A L D A T A S T R U C T U R E S *
41 ***************************************************************/
43 /***************************************************************
44 * L O C A L F U N C T I O N S *
45 ***************************************************************/
47 extern int localDbPrepare(UserHandle
*uh
);
49 static int dbCreate(UserHandle
*uh
);
51 /***************************************************************
53 ***************************************************************/
55 /***************************************************************
56 * P U B L I C D A T A *
57 ***************************************************************/
60 /***************************************************************
61 ****************************************************************
62 * L O C A L F U N C T I O N S C O D E S E C T I O N *
63 ****************************************************************
64 ***************************************************************/
66 /***************************************************************
67 ****************************************************************
68 * P U B L I C F U N C T I O N S C O D E S E C T I O N *
69 ****************************************************************
70 ***************************************************************/
72 /*-----------------------------------*/
73 /* Time related Functions */
75 /* Returns a double value in seconds */
76 /*-----------------------------------*/
77 double userGetTimeSync(void)
79 static int initialized
= 0;
80 static NDB_TICKS initSecs
= 0;
81 static Uint32 initMicros
= 0;
86 NdbTick_CurrentMicrosecond(&initSecs
, &initMicros
);
92 NdbTick_CurrentMicrosecond(&secs
, µs
);
94 double s
= (double)secs
- (double)initSecs
;
95 double us
= (double)secs
- (double)initMicros
;
97 timeValue
= s
+ (us
/ 1000000.0);
104 // 1 - Retry transaction
107 userDbCommit(UserHandle
*uh
){
108 if(uh
->pCurrTrans
!= 0){
109 int check
= uh
->pCurrTrans
->execute( Commit
);
110 NdbError err
= uh
->pCurrTrans
->getNdbError();
111 uh
->pNDB
->closeTransaction(uh
->pCurrTrans
);
114 if(err
.status
!= NdbError::Success
)
115 ndbout
<< err
<< endl
;
117 if(err
.status
== NdbError::TemporaryError
&&
118 err
.classification
== NdbError::OverloadError
){
119 NdbSleep_SecSleep(3);
128 * TRUE - Normal table
129 * FALSE - Table w.o. checkpoing and logging
135 extern int useTableLogging
;
142 create_table_server(Ndb
* pNdb
){
144 NdbSchemaCon
* MySchemaTransaction
= NdbSchemaCon::startSchemaTrans(pNdb
);
145 if( MySchemaTransaction
== NULL
)
146 error_handler("startSchemaTransaction", pNdb
->getNdbError(), 0);
148 NdbSchemaOp
* MySchemaOp
= MySchemaTransaction
->getNdbSchemaOp();
149 if( MySchemaOp
== NULL
)
150 error_handler("getNdbSchemaOp", MySchemaTransaction
->getNdbError(), 0);
153 check
= MySchemaOp
->createTable( SERVER_TABLE
,
155 TupleKey
, // Key Type
165 error_handler("createTable", MySchemaTransaction
->getNdbError(), 0);
167 check
= MySchemaOp
->createAttribute
168 ( SERVER_SUBSCRIBER_SUFFIX
,
171 SUBSCRIBER_NUMBER_SUFFIX_LENGTH
,
180 error_handler("createAttribute (subscriber suffix)",
181 MySchemaTransaction
->getNdbError(), 0);
183 // Create first column, primary key
184 check
= MySchemaOp
->createAttribute( SERVER_ID
,
186 sizeof(ServerId
) << 3,
192 error_handler("createAttribute (serverid)",
193 MySchemaTransaction
->getNdbError(), 0);
196 check
= MySchemaOp
->createAttribute( SERVER_NAME
,
204 error_handler("createAttribute (server name)",
205 MySchemaTransaction
->getNdbError(), 0);
208 check
= MySchemaOp
->createAttribute( SERVER_READS
,
210 sizeof(Counter
) << 3,
216 error_handler("createAttribute (server reads)",
217 MySchemaTransaction
->getNdbError(), 0);
219 check
= MySchemaOp
->createAttribute( SERVER_INSERTS
,
221 sizeof(Counter
) << 3,
227 error_handler("createAttribute (server inserts)",
228 MySchemaTransaction
->getNdbError(), 0);
230 check
= MySchemaOp
->createAttribute( SERVER_DELETES
,
232 sizeof(Counter
) << 3,
238 error_handler("createAttribute (server deletes)",
239 MySchemaTransaction
->getNdbError(), 0);
241 if( MySchemaTransaction
->execute() == -1 ) {
242 error_handler("schemaTransaction->execute()",
243 MySchemaTransaction
->getNdbError(), 0);
245 NdbSchemaCon::closeSchemaTrans(MySchemaTransaction
);
250 create_table_group(Ndb
* pNdb
){
253 NdbSchemaCon
* MySchemaTransaction
= NdbSchemaCon::startSchemaTrans(pNdb
);
254 if( MySchemaTransaction
== NULL
)
255 error_handler("startSchemaTransaction", pNdb
->getNdbError(), 0);
257 NdbSchemaOp
* MySchemaOp
= MySchemaTransaction
->getNdbSchemaOp();
258 if( MySchemaOp
== NULL
)
259 error_handler("getNdbSchemaOp", MySchemaTransaction
->getNdbError(), 0);
262 check
= MySchemaOp
->createTable( GROUP_TABLE
,
264 TupleKey
, // Key Type
275 error_handler("createTable", MySchemaTransaction
->getNdbError(), 0);
277 // Create first column, primary key
278 check
= MySchemaOp
->createAttribute( GROUP_ID
,
280 sizeof(GroupId
) << 3,
286 error_handler("createAttribute (group id)",
287 MySchemaTransaction
->getNdbError(), 0);
289 check
= MySchemaOp
->createAttribute( GROUP_NAME
,
297 error_handler("createAttribute (group name)",
298 MySchemaTransaction
->getNdbError(), 0);
301 check
= MySchemaOp
->createAttribute( GROUP_ALLOW_READ
,
303 sizeof(Permission
) << 3,
309 error_handler("createAttribute (group read)",
310 MySchemaTransaction
->getNdbError(), 0);
313 check
= MySchemaOp
->createAttribute( GROUP_ALLOW_INSERT
,
315 sizeof(Permission
) << 3,
321 error_handler("createAttribute (group insert)",
322 MySchemaTransaction
->getNdbError(), 0);
324 check
= MySchemaOp
->createAttribute( GROUP_ALLOW_DELETE
,
326 sizeof(Permission
) << 3,
332 error_handler("createAttribute (group delete)",
333 MySchemaTransaction
->getNdbError(), 0);
335 if( MySchemaTransaction
->execute() == -1 ) {
336 error_handler("schemaTransaction->execute()",
337 MySchemaTransaction
->getNdbError(), 0);
339 NdbSchemaCon::closeSchemaTrans(MySchemaTransaction
);
344 create_table_subscriber(Ndb
* pNdb
){
346 NdbSchemaCon
* MySchemaTransaction
= NdbSchemaCon::startSchemaTrans(pNdb
);
347 if( MySchemaTransaction
== NULL
)
348 error_handler("startSchemaTransaction", pNdb
->getNdbError(), 0);
350 NdbSchemaOp
* MySchemaOp
= MySchemaTransaction
->getNdbSchemaOp();
351 if( MySchemaOp
== NULL
)
352 error_handler("getNdbSchemaOp", MySchemaTransaction
->getNdbError(), 0);
355 check
= MySchemaOp
->createTable( SUBSCRIBER_TABLE
,
357 TupleKey
, // Key Type
367 error_handler("createTable", MySchemaTransaction
->getNdbError(), 0);
369 // Create first column, primary key
370 check
= MySchemaOp
->createAttribute
374 SUBSCRIBER_NUMBER_LENGTH
,
383 error_handler("createAttribute (subscriber number)",
384 MySchemaTransaction
->getNdbError(), 0);
386 check
= MySchemaOp
->createAttribute( SUBSCRIBER_NAME
,
389 SUBSCRIBER_NAME_LENGTH
,
394 error_handler("createAttribute (subscriber name)",
395 MySchemaTransaction
->getNdbError(), 0);
398 check
= MySchemaOp
->createAttribute( SUBSCRIBER_GROUP
,
400 sizeof(GroupId
) << 3,
406 error_handler("createAttribute (subscriber_group)",
407 MySchemaTransaction
->getNdbError(), 0);
410 check
= MySchemaOp
->createAttribute( SUBSCRIBER_LOCATION
,
412 sizeof(Location
) << 3,
418 error_handler("createAttribute (server reads)",
419 MySchemaTransaction
->getNdbError(), 0);
421 check
= MySchemaOp
->createAttribute( SUBSCRIBER_SESSIONS
,
423 sizeof(ActiveSessions
) << 3,
429 error_handler("createAttribute (subscriber_sessions)",
430 MySchemaTransaction
->getNdbError(), 0);
432 check
= MySchemaOp
->createAttribute( SUBSCRIBER_CHANGED_BY
,
440 error_handler("createAttribute (subscriber_changed_by)",
441 MySchemaTransaction
->getNdbError(), 0);
443 check
= MySchemaOp
->createAttribute( SUBSCRIBER_CHANGED_TIME
,
451 error_handler("createAttribute (subscriber_changed_time)",
452 MySchemaTransaction
->getNdbError(), 0);
454 if( MySchemaTransaction
->execute() == -1 ) {
455 error_handler("schemaTransaction->execute()",
456 MySchemaTransaction
->getNdbError(), 0);
458 NdbSchemaCon::closeSchemaTrans(MySchemaTransaction
);
463 create_table_session(Ndb
* pNdb
){
465 NdbSchemaCon
* MySchemaTransaction
= NdbSchemaCon::startSchemaTrans(pNdb
);
466 if( MySchemaTransaction
== NULL
)
467 error_handler("startSchemaTransaction", pNdb
->getNdbError(), 0);
469 NdbSchemaOp
* MySchemaOp
= MySchemaTransaction
->getNdbSchemaOp();
470 if( MySchemaOp
== NULL
)
471 error_handler("getNdbSchemaOp",
472 MySchemaTransaction
->getNdbError(), 0);
475 check
= MySchemaOp
->createTable( SESSION_TABLE
,
477 TupleKey
, // Key Type
487 error_handler("createTable", MySchemaTransaction
->getNdbError(), 0);
489 check
= MySchemaOp
->createAttribute( SESSION_SUBSCRIBER
,
492 SUBSCRIBER_NUMBER_LENGTH
,
501 error_handler("createAttribute (session_subscriber)",
502 MySchemaTransaction
->getNdbError(), 0);
504 // Create first column, primary key
505 check
= MySchemaOp
->createAttribute( SESSION_SERVER
,
507 sizeof(ServerId
) << 3,
513 error_handler("createAttribute (session_server)",
514 MySchemaTransaction
->getNdbError(), 0);
517 check
= MySchemaOp
->createAttribute( SESSION_DATA
,
520 SESSION_DETAILS_LENGTH
,
525 error_handler("createAttribute (session_data)",
526 MySchemaTransaction
->getNdbError(), 0);
528 if( MySchemaTransaction
->execute() == -1 ) {
529 error_handler("schemaTransaction->execute()",
530 MySchemaTransaction
->getNdbError(), 0);
532 NdbSchemaCon::closeSchemaTrans(MySchemaTransaction
);
537 create_table(const char * name
, int (* function
)(Ndb
* pNdb
), Ndb
* pNdb
){
538 printf("creating table %s...", name
);
539 if(pNdb
->getDictionary()->getTable(name
) != 0){
540 printf(" it already exists\n");
546 printf("creating table %s... done\n", name
);
549 static int dbCreate(Ndb
* pNdb
)
551 create_table(SUBSCRIBER_TABLE
, create_table_subscriber
, pNdb
);
552 create_table(GROUP_TABLE
, create_table_group
, pNdb
);
553 create_table(SESSION_TABLE
, create_table_session
, pNdb
);
554 create_table(SERVER_TABLE
, create_table_server
, pNdb
);
563 userDbConnect(uint32 createDb
, char *dbName
)
565 Ndb_cluster_connection
*con
= new Ndb_cluster_connection();
566 if(con
->connect(12, 5, 1) != 0)
568 ndbout
<< "Unable to connect to management server." << endl
;
571 if (con
->wait_until_ready(30,0) < 0)
573 ndbout
<< "Cluster nodes not ready in 30 seconds." << endl
;
577 Ndb
* pNdb
= new Ndb(con
, dbName
);
579 //printf("Initializing...\n");
582 //printf("Waiting...");
583 while(pNdb
->waitUntilReady() != 0){
592 UserHandle
* uh
= new UserHandle
;
600 void userDbDisconnect(UserHandle
*uh
)
605 int userDbInsertServer(UserHandle
*uh
,
607 SubscriberSuffix suffix
,
613 uint32 noOfInsert
= 0;
614 uint32 noOfDelete
= 0;
616 NdbConnection
* MyTransaction
= 0;
617 if(uh
->pCurrTrans
!= 0){
618 MyTransaction
= uh
->pCurrTrans
;
620 uh
->pCurrTrans
= MyTransaction
= uh
->pNDB
->startTransaction();
622 if (MyTransaction
== NULL
)
623 error_handler("startTranscation", uh
->pNDB
->getNdbError(), 0);
625 NdbOperation
*MyOperation
= MyTransaction
->getNdbOperation(SERVER_TABLE
);
626 CHECK_NULL(MyOperation
, "getNdbOperation", MyTransaction
);
628 check
= MyOperation
->insertTuple();
629 CHECK_MINUS_ONE(check
, "insert tuple", MyTransaction
);
631 check
= MyOperation
->equal(SERVER_ID
, (char*)&serverId
);
632 CHECK_MINUS_ONE(check
, "setValue id", MyTransaction
);
634 check
= MyOperation
->setValue(SERVER_SUBSCRIBER_SUFFIX
, suffix
);
635 CHECK_MINUS_ONE(check
, "setValue suffix", MyTransaction
);
637 check
= MyOperation
->setValue(SERVER_NAME
, name
);
638 CHECK_MINUS_ONE(check
, "setValue name", MyTransaction
);
640 check
= MyOperation
->setValue(SERVER_READS
, (char*)&noOfRead
);
641 CHECK_MINUS_ONE(check
, "setValue reads", MyTransaction
);
643 check
= MyOperation
->setValue(SERVER_INSERTS
, (char*)&noOfInsert
);
644 CHECK_MINUS_ONE(check
, "setValue inserts", MyTransaction
);
646 check
= MyOperation
->setValue(SERVER_DELETES
, (char*)&noOfDelete
);
647 CHECK_MINUS_ONE(check
, "setValue deletes", MyTransaction
);
652 int userDbInsertSubscriber(UserHandle
*uh
,
653 SubscriberNumber number
,
658 uint32 activeSessions
= 0;
660 ChangedBy changedBy
; snprintf(changedBy
, sizeof(changedBy
), "ChangedBy");
661 ChangedTime changedTime
; snprintf(changedTime
, sizeof(changedTime
), "ChangedTime");
663 NdbConnection
* MyTransaction
= 0;
664 if(uh
->pCurrTrans
!= 0){
665 MyTransaction
= uh
->pCurrTrans
;
667 uh
->pCurrTrans
= MyTransaction
= uh
->pNDB
->startTransaction();
669 if (MyTransaction
== NULL
)
670 error_handler("startTranscation", uh
->pNDB
->getNdbError(), 0);
672 NdbOperation
*MyOperation
= MyTransaction
->getNdbOperation(SUBSCRIBER_TABLE
);
673 CHECK_NULL(MyOperation
, "getNdbOperation", MyTransaction
);
675 check
= MyOperation
->insertTuple();
676 CHECK_MINUS_ONE(check
, "insertTuple", MyTransaction
);
678 check
= MyOperation
->equal(SUBSCRIBER_NUMBER
, number
);
679 CHECK_MINUS_ONE(check
, "equal", MyTransaction
);
681 check
= MyOperation
->setValue(SUBSCRIBER_NAME
, name
);
682 CHECK_MINUS_ONE(check
, "setValue name", MyTransaction
);
684 check
= MyOperation
->setValue(SUBSCRIBER_GROUP
, (char*)&groupId
);
685 CHECK_MINUS_ONE(check
, "setValue group", MyTransaction
);
687 check
= MyOperation
->setValue(SUBSCRIBER_LOCATION
, (char*)&l
);
688 CHECK_MINUS_ONE(check
, "setValue location", MyTransaction
);
690 check
= MyOperation
->setValue(SUBSCRIBER_SESSIONS
, (char*)&activeSessions
);
691 CHECK_MINUS_ONE(check
, "setValue sessions", MyTransaction
);
693 check
= MyOperation
->setValue(SUBSCRIBER_CHANGED_BY
, changedBy
);
694 CHECK_MINUS_ONE(check
, "setValue changedBy", MyTransaction
);
696 check
= MyOperation
->setValue(SUBSCRIBER_CHANGED_TIME
, changedTime
);
697 CHECK_MINUS_ONE(check
, "setValue changedTime", MyTransaction
);
702 int userDbInsertGroup(UserHandle
*uh
,
705 Permission allowRead
,
706 Permission allowInsert
,
707 Permission allowDelete
)
711 NdbConnection
* MyTransaction
= 0;
712 if(uh
->pCurrTrans
!= 0){
713 MyTransaction
= uh
->pCurrTrans
;
715 uh
->pCurrTrans
= MyTransaction
= uh
->pNDB
->startTransaction();
717 if (MyTransaction
== NULL
)
718 error_handler("startTranscation", uh
->pNDB
->getNdbError(), 0);
720 NdbOperation
*MyOperation
= MyTransaction
->getNdbOperation(GROUP_TABLE
);
721 CHECK_NULL(MyOperation
, "getNdbOperation", MyTransaction
);
723 check
= MyOperation
->insertTuple();
724 CHECK_MINUS_ONE(check
, "insertTuple", MyTransaction
);
726 check
= MyOperation
->equal(GROUP_ID
, (char*)&groupId
);
727 CHECK_MINUS_ONE(check
, "equal", MyTransaction
);
729 check
= MyOperation
->setValue(GROUP_NAME
, name
);
730 CHECK_MINUS_ONE(check
, "setValue name", MyTransaction
);
732 check
= MyOperation
->setValue(GROUP_ALLOW_READ
, (char*)&allowRead
);
733 CHECK_MINUS_ONE(check
, "setValue allowRead", MyTransaction
);
735 check
= MyOperation
->setValue(GROUP_ALLOW_INSERT
, (char*)&allowInsert
);
736 CHECK_MINUS_ONE(check
, "setValue allowInsert", MyTransaction
);
738 check
= MyOperation
->setValue(GROUP_ALLOW_DELETE
, (char*)&allowDelete
);
739 CHECK_MINUS_ONE(check
, "setValue allowDelete", MyTransaction
);