Example #1
0
 internal static HandleRef getCPtr(LightweightDatabaseClient obj)
 {
     return((obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr);
 }
 internal static HandleRef getCPtr(LightweightDatabaseClient obj)
 {
     return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
 }
        static void Main(string[] args)
        {
            char ch;
            bool isServer;
            LightweightDatabaseServer databaseServer = new LightweightDatabaseServer();
            LightweightDatabaseClient databaseClient = new LightweightDatabaseClient();
            RakPeerInterface rakPeer = RakNetworkFactory.GetRakPeerInterface();
            string str;
            string columnName;
            string tableName = "", tablePassword = "";
            Console.Write("(S)erver or (C)lient?\n");
            ch = Console.ReadKey(true).KeyChar;
            if (ch == 's')
            {
                isServer = true;
                rakPeer.SetMaximumIncomingConnections(32);
                SocketDescriptor socketDescriptor = new SocketDescriptor(12345, string.Empty);
                rakPeer.Startup(32, 0, new SocketDescriptor[] { socketDescriptor }, 1);
                rakPeer.AttachPlugin(databaseServer);
                Console.Write("Server started\n");
                Console.Write("(C)reate table\n");
                Console.Write("(R)emove table\n");
            }
            else
            {
                isServer = false;
                SocketDescriptor socketDescriptor = new SocketDescriptor();
                rakPeer.Startup(1, 0, new SocketDescriptor[] { socketDescriptor }, 1);
                rakPeer.AttachPlugin(databaseClient);
                Console.Write("Client started\n");

                Console.Write("Enter server IP: ");
                str = Console.ReadLine();
                if (str.Equals(string.Empty))
                    str = "127.0.0.1";
                Console.Write("Connecting to server.\n");
                rakPeer.Connect(str, 12345, string.Empty, 0);
                Console.Write("(Q)uery table\n");
                Console.Write("(U)pdate row\n");
                Console.Write("(R)emove row\n");
            }
            Console.Write("(E)xit\n");

            Packet p;
            while (true)
            {
                p = rakPeer.Receive();
                while (p != null)
                {
                    byte[] data = p.data;
                    if (data[0] == RakNetBindings.ID_DISCONNECTION_NOTIFICATION)
                        Console.Write("ID_DISCONNECTION_NOTIFICATION\n");
                    else if (data[0] == RakNetBindings.ID_CONNECTION_LOST)
                        Console.Write("ID_CONNECTION_LOST\n");
                    else if (data[0] == RakNetBindings.ID_NO_FREE_INCOMING_CONNECTIONS)
                        Console.Write("ID_NO_FREE_INCOMING_CONNECTIONS\n");
                    else if (data[0] == RakNetBindings.ID_NEW_INCOMING_CONNECTION)
                        Console.Write("ID_NEW_INCOMING_CONNECTION\n");
                    else if (data[0] == RakNetBindings.ID_CONNECTION_REQUEST_ACCEPTED)
                        Console.Write("ID_CONNECTION_REQUEST_ACCEPTED\n");
                    else if (data[0] == RakNetBindings.ID_CONNECTION_ATTEMPT_FAILED)
                        Console.Write("ID_CONNECTION_ATTEMPT_FAILED\n");
                    else if (data[0] == RakNetBindings.ID_DATABASE_UNKNOWN_TABLE)
                        Console.Write("ID_DATABASE_UNKNOWN_TABLE\n");
                    else if (data[0] == RakNetBindings.ID_DATABASE_INCORRECT_PASSWORD)
                        Console.Write("ID_DATABASE_INCORRECT_PASSWORD\n");
                    else if (data[0] == RakNetBindings.ID_DATABASE_QUERY_REPLY)
                    {
                        Console.Write("Incoming table:\n");
                        Table table = new Table();
                        byte[] serializedTable = new byte[data.Length - sizeof(byte)];
                        Array.Copy(data, sizeof(byte), serializedTable, 0, data.Length - sizeof(byte));  // ugly copy
                        if (TableSerializer.DeserializeTable(serializedTable, (uint)serializedTable.Length, table))
                        {
                            TableRowPage cur = table.GetListHead();
                            int i;

                            Console.Write("Columns:\n");
                            for (i = 0; i < table.GetColumns().Size(); i++)
                            {
                                Console.Write("{0}. {1} : ", i + 1, table.GetColumns()[i].columnName);
                                if (table.GetColumns()[i].columnType == Table.ColumnType.BINARY)
                                    Console.Write("BINARY");
                                else if (table.GetColumns()[i].columnType == Table.ColumnType.NUMERIC)
                                    Console.Write("NUMERIC");
                                else
                                    Console.Write("STRING");
                                Console.Write("\n");
                            }
                            if (cur != null)
                                Console.Write("Rows:\n");
                            else
                                Console.Write("Table has no rows.\n");
                            while (cur != null)
                            {
                                for (i = 0; i < cur.size; i++)
                                {
                                    StringBuilder sb = new StringBuilder(256);
                                    table.PrintRow(sb, sb.Capacity, ',', true, cur.GetData(i));
                                    Console.Write("RowID {0}: {1}\n", cur.GetKey(i), sb.ToString());
                                }
                                cur = cur.next;
                            }
                        }
                        else
                            Console.Write("Deserialization of table failed.\n");
                    }

                    rakPeer.DeallocatePacket(p);
                    p = rakPeer.Receive();
                }

                if (_kbhit() != 0)
                {
                    char _ch = Console.ReadKey(true).KeyChar;
                    if (isServer)
                    {
                        if (_ch == 'c')
                        {
                            bool allowRemoteUpdate;
                            bool allowRemoteQuery;
                            bool allowRemoteRemove;
                            string queryPassword = string.Empty;
                            string updatePassword = string.Empty;
                            string removePassword = string.Empty;
                            bool oneRowPerSystemAddress = false;
                            bool onlyUpdateOwnRows = false;
                            bool removeRowOnPingFailure = false;
                            bool removeRowOnDisconnect = false;
                            bool autogenerateRowIDs;

                            Console.Write("Enter name of table to create: ");
                            tableName = Console.ReadLine();
                            if (tableName.Equals(string.Empty))
                                tableName = "Default Table";

                            Console.Write("Allow remote row updates? (y (Default) / n)\n");
                            if (Console.ReadKey(false).KeyChar == 'n')
                            {
                                Console.Write("\n");
                                allowRemoteUpdate = false;
                            }
                            else
                            {
                                Console.Write("\n");
                                allowRemoteUpdate = true;
                                Console.Write("Enter remote update password (Enter for none): ");
                                updatePassword = Console.ReadLine();

                                Console.Write("Only allow one row per uploading IP? (y (Default) / n)\n");
                                oneRowPerSystemAddress = (Console.ReadKey(false).KeyChar == 'n') == false;

                                Console.Write("Only allow updates on rows created by that system? (y (Default) / n)\n");
                                onlyUpdateOwnRows = (Console.ReadKey(false).KeyChar == 'n') == false;

                                Console.Write("Remove row if can't ping system? (y (Default) / n)\n");
                                removeRowOnPingFailure = (Console.ReadKey(false).KeyChar == 'n') == false;

                                Console.Write("Remove row on system disconnect? (y / n (Default))\n");
                                removeRowOnDisconnect = (Console.ReadKey(false).KeyChar == 'y') == true;
                            }

                            Console.Write("Allow remote table queries? (y (Default) / n)\n");
                            if (Console.ReadKey(false).KeyChar == 'n')
                            {
                                Console.Write("\n");
                                allowRemoteQuery = false;
                            }
                            else
                            {
                                Console.Write("\n");
                                allowRemoteQuery = true;
                                Console.Write("Enter remote table query password (Enter for none): ");
                                queryPassword = Console.ReadLine();
                            }

                            Console.Write("Allow remote row removal? (y (Default) / n)\n");
                            if (Console.ReadKey(false).KeyChar == 'n')
                            {
                                Console.Write("\n");
                                allowRemoteRemove = false;
                            }
                            else
                            {
                                Console.Write("\n");
                                allowRemoteRemove = true;
                                Console.Write("Enter remote row removal password (Enter for none): ");
                                removePassword = Console.ReadLine();
                            }

                            Console.Write("Autogenerate row ids? (y (Default) / n)\n");
                            autogenerateRowIDs = (Console.ReadKey(false).KeyChar == 'n') == false;

                            Table table;
                            table = databaseServer.AddTable(tableName, allowRemoteUpdate, allowRemoteQuery, allowRemoteRemove, queryPassword, updatePassword, removePassword, oneRowPerSystemAddress, onlyUpdateOwnRows, removeRowOnPingFailure, removeRowOnDisconnect, autogenerateRowIDs);
                            if (table != null)
                            {
                                Console.Write("Table {0} created.\n", tableName);
                                while (true)
                                {
                                    Console.Write("Enter name of new column\n");
                                    Console.Write("Hit enter when done\n");
                                    columnName = Console.ReadLine();
                                    if (columnName.Equals(string.Empty))
                                        break;
                                    Table.ColumnType columnType;
                                    Console.Write("Enter column type\n1=STRING\n2=NUMERIC\n3=BINARY\n");
                                    str = Console.ReadLine();
                                    if (str[0] == '1')
                                        columnType = Table.ColumnType.STRING;
                                    else if (str[0] == '2')
                                        columnType = Table.ColumnType.NUMERIC;
                                    else if (str[0] == '3')
                                        columnType = Table.ColumnType.BINARY;
                                    else
                                    {
                                        Console.Write("Defaulting to string\n");
                                        columnType = Table.ColumnType.STRING;
                                    }
                                    table.AddColumn(columnName, columnType);
                                    Console.Write("{0} added.\n", columnName);
                                }
                                Console.Write("Done.\n");
                            }
                            else
                                Console.Write("Table {0} creation failed.  Possibly already exists.\n", tableName);

                        }
                        else if (_ch == 'r')
                        {
                            Console.Write("Enter name of table to remove: ");
                            str = Console.ReadLine();
                            if (str.Equals(string.Empty))
                                str = "Default Table";
                            if (databaseServer.RemoveTable(str))
                                Console.Write("Success\n");
                            else
                                Console.Write("Table {0} not found\n", str);
                        }
                    }
                    else
                    {
                        if (_ch == 'q' || _ch == 'u' || _ch == 'r')
                        {
                            Console.Write("Enter table name: ");
                            tableName = Console.ReadLine();
                            if (tableName.Equals(string.Empty))
                                tableName = "Default Table";
                            Console.Write("Enter password (if any): ");
                            tablePassword = Console.ReadLine();
                        }

                        if (_ch == 'q')
                        {
                            // TODO - let the user enter filters, columns, and rows to return.
                            databaseClient.QueryTable(tableName, tablePassword, null, 0, null, 0, null, 0, RakNetBindings.UNASSIGNED_SYSTEM_ADDRESS, true);
                        }
                        else if (_ch == 'u')
                        {
                            RowUpdateMode updateMode;
                            uint rowId;
                            bool hasRowId;
                            Console.Write("Enter row update mode\n1=update existing\n2=update or add\n3=add new\n");
                            str = Console.ReadLine();
                            if (str[0] == '1')
                            {
                                updateMode = RowUpdateMode.RUM_UPDATE_EXISTING_ROW;
                                Console.Write("Updating existing row (You must enter a row ID).\n");
                            }
                            else if (str[0] == '2')
                            {
                                updateMode = RowUpdateMode.RUM_UPDATE_OR_ADD_ROW;
                                Console.Write("Updating existing row and adding\nnew row if existing row does not exist.\n");
                            }
                            else
                            {
                                updateMode = RowUpdateMode.RUM_ADD_NEW_ROW;
                                Console.Write("Adding new row.\n");
                            }

                            Console.Write("Enter row ID (enter for none): ");
                            str = Console.ReadLine();
                            if (!str.Equals(string.Empty))
                            {
                                rowId = uint.Parse(str);
                                hasRowId = true;
                            }
                            else
                            {
                                hasRowId = false;
                                rowId = 0;
                            }

                            Console.Write("Enter cells\n");
                            byte numCellUpdates;
                            DatabaseCellUpdates cellUpdates = new DatabaseCellUpdates(64);
                            for (numCellUpdates = 0; numCellUpdates < 64; numCellUpdates++)
                            {

                                Console.Write("Enter column name (Enter when done): ");
                                cellUpdates[numCellUpdates].columnName = Console.ReadLine();
                                if (cellUpdates[numCellUpdates].columnName.Equals(string.Empty))
                                    break;
                                Console.Write("Enter column type\n1=STRING\n2=NUMERIC\n3=BINARY\n");
                                str = Console.ReadLine();
                                if (str[0] == '1' || str.Equals(string.Empty))
                                {
                                    cellUpdates[numCellUpdates].columnType = Table.ColumnType.STRING;
                                    Console.Write("Enter string value: ");
                                    str = Console.ReadLine();
                                    cellUpdates[numCellUpdates].cellValue.Set(str);
                                }
                                else if (str[0] == '2')
                                {
                                    cellUpdates[numCellUpdates].columnType = Table.ColumnType.NUMERIC;
                                    Console.Write("Enter numeric value: ");
                                    str = Console.ReadLine();
                                    cellUpdates[numCellUpdates].cellValue.Set(int.Parse(str));
                                }
                                else
                                {
                                    cellUpdates[numCellUpdates].columnType = Table.ColumnType.BINARY;
                                    // TODO - Pain in the ass to write this demo code
                                    Console.Write("TODO\n");
                                }
                            }

                            databaseClient.UpdateRow(tableName, tablePassword, updateMode, hasRowId, rowId, cellUpdates, numCellUpdates, RakNetBindings.UNASSIGNED_SYSTEM_ADDRESS, true);
                        }
                        else if (_ch == 'r')
                        {
                            uint rowId;
                            Console.Write("Enter row ID to remove: ");
                            str = Console.ReadLine();
                            rowId = uint.Parse(str);
                            databaseClient.RemoveRow(tableName, tablePassword, rowId, RakNetBindings.UNASSIGNED_SYSTEM_ADDRESS, true);
                        }
                    }

                    if (_ch == 'e')
                        break;

                    _ch = '\0';
                }

                RakNetBindings.RakSleep(30);
            }

            rakPeer.Shutdown(100, 0);
            RakNetworkFactory.DestroyRakPeerInterface(rakPeer);
        }