00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <CSql.h>
00017 #include <DatabaseManagerImpl.h>
00018 #include <Database.h>
00019 #include <TableImpl.h>
00020 #include <SqlFactory.h>
00021 #include <SqlStatement.h>
00022 void printUsage()
00023 {
00024 printf("Usage: csqldump [-u username] [-p passwd] [-n noOfStmtsPerCommit] [-T tableName]\n");
00025 printf(" n -> number of statements per commit\n");
00026 printf(" Default value is 100. If system db size is big, then it shall be increased.\n");
00027 printf(" T -> Will dump only the table specified with this option.\n");
00028 return;
00029
00030 }
00031
00032 bool isCached(char *tblName)
00033 {
00034 FILE *fp = fopen(Conf::config.getTableConfigFile(),"r");
00035 if( fp == NULL ) {
00036 printError(ErrSysInit, "csqltable.conf file does not exist");
00037 return ErrSysInit;
00038 }
00039 char ctablename[IDENTIFIER_LENGTH];
00040 int mode;
00041 bool isCached=false;
00042 while(!feof(fp))
00043 {
00044 fscanf(fp, "%d:%s\n", &mode, ctablename);
00045 if (strcmp (ctablename, tblName) == 0) { isCached=true; break; }
00046 }
00047 fclose(fp);
00048 return isCached;
00049 }
00050 int main(int argc, char **argv)
00051 {
00052 char username[IDENTIFIER_LENGTH];
00053 username [0] = '\0';
00054 char password[IDENTIFIER_LENGTH];
00055 password [0] = '\0';
00056 char tblName[IDENTIFIER_LENGTH];
00057 int c = 0, opt = 0;
00058 int noOfStmts =100;
00059 char name[IDENTIFIER_LENGTH];
00060 while ((c = getopt(argc, argv, "u:p:n:T:?")) != EOF)
00061 {
00062 switch (c)
00063 {
00064 case 'u' : { strcpy(username, argv[optind - 1]); opt=1; break; }
00065 case 'p' : { strcpy(password, argv[optind - 1]); opt=1; break; }
00066 case 'n' : { noOfStmts = atoi(argv[optind - 1]); opt = 5; break; }
00067 case 'T' : { strcpy(tblName, argv[optind - 1]); opt = 15; break; }
00068 case '?' : { opt = 10; break; }
00069 default: opt=1;
00070
00071 }
00072 }
00073 if (opt == 10) {
00074 printUsage();
00075 return 0;
00076 }
00077
00078
00079 if (username[0] == '\0' )
00080 {
00081 strcpy(username, "root");
00082 strcpy(password, "manager");
00083 }
00084 SqlConnection *sqlconn = (SqlConnection*) SqlFactory::createConnection(CSql);
00085 sqlconn->connect("root", "manager");
00086 SqlStatement *stmt = (SqlStatement*) SqlFactory::createStatement(CSql);
00087 stmt->setConnection(sqlconn);
00088
00089 Connection conn;
00090 DbRetVal rv = conn.open(username, password);
00091 if (rv != OK) return 1;
00092 DatabaseManagerImpl *dbMgr = (DatabaseManagerImpl*) conn.getDatabaseManager();
00093
00094 if (dbMgr == NULL) { printf("Auth failed\n"); return 2;}
00095 if (opt == 0 || opt == 1) opt = 5;
00096 if (opt == 5) {
00097 List tableList = dbMgr->getAllTableNames();
00098 ListIterator iter = tableList.getIterator();
00099 Identifier *elem = NULL;
00100 int count =0;
00101 while (iter.hasElement())
00102 {
00103 elem = (Identifier*) iter.nextElement();
00104 if (isCached(elem->name)) continue;
00105 printf("CREATE TABLE %s (", elem->name);
00106 Table *table = dbMgr->openTable(elem->name);
00107 FieldInfo *info = new FieldInfo();
00108 List fNameList = table->getFieldNameList();
00109 ListIterator fNameIter = fNameList.getIterator();
00110 count++;
00111 bool firstField=true;
00112 while (fNameIter.hasElement()) {
00113 elem = (Identifier*) fNameIter.nextElement();
00114 table->getFieldInfo((const char*)elem->name, info);
00115 if (firstField) {
00116 printf("%s %s ", elem->name, AllDataType::getSQLString(info->type));
00117 firstField = false;
00118 }
00119 else
00120 printf(", %s %s ", elem->name, AllDataType::getSQLString(info->type));
00121 if (info->type == typeString) printf("(%d)",info->length -1);
00122 if (info->isNull) printf(" NOT NULL ");
00123 if (info->isDefault) printf(" DEFAULT '%s' ", info->defaultValueBuf);
00124 }
00125 printf(");\n");
00126 table->printSQLIndexString();
00127 delete info;
00128 dbMgr->closeTable(table);
00129 }
00130 iter.reset();
00131 char sqlstring[1024];
00132 bool flag=false;
00133 while (iter.hasElement()) {
00134 elem = (Identifier*) iter.nextElement();
00135 if (isCached(elem->name)) continue;
00136 if (!flag) { printf("SET AUTOCOMMIT OFF;\n"); flag=true; }
00137 sprintf(sqlstring, "SELECT * FROM %s;", elem->name);
00138 sqlconn->beginTrans();
00139 DbRetVal rv = stmt->prepare(sqlstring);
00140 int rows = 0;
00141 rv = stmt->execute(rows);
00142 void *tuple = NULL;
00143 rows = 0;
00144 while(true) {
00145 tuple = stmt->fetchAndPrint(true);
00146 if (tuple == NULL) break;
00147 rows++;
00148 if (rows % noOfStmts ==0) {
00149 sqlconn->commit();
00150 sqlconn->beginTrans();
00151 printf("COMMIT;\n");
00152 }
00153 }
00154 if (rows % noOfStmts !=0) { sqlconn->commit(); printf("COMMIT;\n"); }
00155 stmt->close();
00156 stmt->free();
00157 }
00158 conn.close();
00159 sqlconn->disconnect();
00160 delete sqlconn;
00161 delete stmt;
00162 return 0;
00163 }
00164 if (opt == 15) {
00165 Table *table = dbMgr->openTable(tblName);
00166 if (table == NULL) {
00167 printf("csqldump: Table \'%s\' does not exist\n", tblName);
00168 conn.close();
00169 sqlconn->disconnect();
00170 delete sqlconn;
00171 delete stmt;
00172 return 3;
00173 }
00174 printf("CREATE TABLE %s (", tblName);
00175 FieldInfo *info = new FieldInfo();
00176 List fNameList = table->getFieldNameList();
00177 ListIterator fNameIter = fNameList.getIterator();
00178 bool firstField=true;
00179 Identifier *elem = NULL;
00180 while (fNameIter.hasElement()) {
00181 elem = (Identifier*) fNameIter.nextElement();
00182 table->getFieldInfo((const char*)elem->name, info);
00183 if (firstField) {
00184 printf("%s %s ", elem->name, AllDataType::getSQLString(info->type));
00185 firstField = false;
00186 }
00187 else
00188 printf(", %s %s ", elem->name, AllDataType::getSQLString(info->type));
00189 if (info->type == typeString) printf("(%d)",info->length -1);
00190 if (info->isNull) printf(" NOT NULL ");
00191 if (info->isDefault) printf(" DEFAULT '%s' ", info->defaultValueBuf);
00192 }
00193 printf(");\n");
00194 table->printSQLIndexString();
00195 delete info;
00196 char sqlstring[1024];
00197 bool flag=false;
00198 if (!flag) { printf("SET AUTOCOMMIT OFF;\n"); flag=true; }
00199 sprintf(sqlstring, "SELECT * FROM %s;", tblName);
00200 sqlconn->beginTrans();
00201 DbRetVal rv = stmt->prepare(sqlstring);
00202 int rows = 0;
00203 rv = stmt->execute(rows);
00204 void *tuple = NULL;
00205 rows = 0;
00206 while(true) {
00207 tuple = stmt->fetchAndPrint(true);
00208 if (tuple == NULL) break;
00209 rows++;
00210 if (rows % noOfStmts ==0) {
00211 sqlconn->commit();
00212 sqlconn->beginTrans();
00213 printf("COMMIT;\n");
00214 }
00215 }
00216 if (rows % noOfStmts !=0) { sqlconn->commit(); printf("COMMIT;\n"); }
00217 stmt->close();
00218 stmt->free();
00219 }
00220 conn.close();
00221 sqlconn->disconnect();
00222 delete sqlconn;
00223 delete stmt;
00224
00225 return 0;
00226 }