source: branches/2.2/setup/doc/setup3.lyx @ 2

Revision 2, 36.1 KB checked in by niltonneto, 17 years ago (diff)

Removida todas as tags usadas pelo CVS ($Id, $Source).
Primeira versão no CVS externo.

  • Property svn:executable set to *
  • Property svn:mime-type set to application/octet-stream
Line 
1#LyX 1.1 created this file. For more info see http://www.lyx.org/
2\lyxformat 218
3\textclass docbook
4\begin_preamble
5<!entity header system "header.sgml">
6\end_preamble
7\language english
8\inputencoding default
9\fontscheme default
10\graphics dvips
11\paperfontsize default
12\spacing single
13\papersize Default
14\paperpackage a4
15\use_geometry 0
16\use_amsmath 0
17\paperorientation portrait
18\secnumdepth 3
19\tocdepth 3
20\paragraph_separation indent
21\defskip smallskip
22\quotes_language english
23\quotes_times 2
24\papercolumns 1
25\papersides 1
26\paperpagestyle default
27
28\layout Title
29\added_space_top vfill \added_space_bottom vfill
30eGroupWare Setup
31\layout Date
32
33June 18, 2001
34\layout Author
35
36
37\latex latex
38<firstname>Miles</firstname> <surname>Lott</surname>
39\layout Abstract
40
41A developer introduction to using the next generation setup application
42 for egroupware.
43\layout Section
44
45Introduction
46\layout Subsection
47
48Welcome
49\layout Standard
50
51
52\series medium
53Thanks for taking the time to look over this document.
54 If you are a developer who is new to egroupware, this document will be
55 invaluable to your success during the life of your application.
56 This is in addition to the other fine documentation available in the phpgwapi/d
57oc directory in your install.
58 Even long-time phpgw developers should benefit this document.
59 Herein, I will attempt to outline the critical steps required in order
60 to get along with setup3, setup-TNG, or whatever we end up calling it (Hey,
61 how about 'setup'?)
62\layout Subsection
63
64Overview
65\layout Standard
66
67
68\series medium
69With setup3, we introduce several new capabilities and technologies for
70 the developer and end user alike.
71 Michael Dean was kind enough to offer up schema_proc to form the core of
72 an abstracted and database-independent upgrade process.
73 This enables developers to write a single set of upgrades and table definitions
74, which should then work on MySQL and PostgreSQL, or any other database
75 type we might add in the future.
76\layout Standard
77
78
79\series medium
80Adding to this to control the process was a good chunk of the old setup
81 program, written by Dan Kuykendall (Seek3r).
82 Dan had everything to do with the new dependencies support and with the
83 format of the $setup_info array in setup3.
84\layout Standard
85
86
87\series medium
88Setup3 adds multi-language support for the setup application, a long missed
89 feature, I would imagine.
90\layout Standard
91
92
93\series medium
94Setup3 gives each application developer control over their application install
95 and upgrade processes, while giving them access to work within a realm
96 formerly owned by only the former core egroupware applications.
97 Yes, this is extra work for the developer.
98 But it is hoped that setup3 is also viewed as a tool that can truly enhance
99 the development process
100\series default
101.
102\layout Standard
103
104
105\series medium
106OK.
107 Let's dive right in...
108\layout Section
109
110Application setup files
111\layout Standard
112
113The files in this section are contained within each application/setup directory.
114 Every app will some of these files in order to operate with setup3.
115\layout Subsection
116
117setup.inc.php (Required)
118\layout Subsubsection
119
120Basic information
121\layout Standard
122
123
124\series bold
125The values in this section must be used by all applications.
126\layout Standard
127
128
129\series medium
130The first section of setup.inc.php defines the very basic and yet critical
131 information about the app
132\series default
133lication
134\series medium
135.
136 Take a look at the following section:
137\layout Code
138
139
140\series medium
141$setup_info['addressbook']['name'] = 'addressbook';
142\layout Code
143
144$setup_info['addressbook']['title'] = 'Addressbook';
145\layout Code
146
147$setup_info['addressbook']['version'] = '0.9.13.002';
148\layout Code
149
150$setup_info['addressbook']['app_order'] = 4;
151\layout Code
152
153$setup_info['addressbook']['enable'] = 1;
154\layout Standard
155
156
157\series medium
158'name' is used throughout egroupware, typically in $phpgw_info flags such
159 as 'currentapp' or as the 'app_name' almost everywhere else.
160\layout Standard
161
162
163\series medium
164'title' would be used in the navbar, admin, preferences, as well as in the
165 application itself.
166\layout Standard
167
168
169\series medium
170The 'version' string defines the version of the application and table code.
171 This would be incremented whenever you create a new upgrade function, and
172 typically only for table modifications.
173 If the change is significant from the last code update, you could increment
174 this here also.
175 Incrementing this version string is not trivial, so please do read the
176 rest of this document for more information about that.
177\layout Standard
178
179
180\series medium
181'app_order' determines the order of applications in the navbar.
182 If the number you set here is the same as is set for another app, the app
183 whose 'name' is first in the English alphabet would appear first.
184 Smaller numbers show closer to the top or left end of the navbar, depending
185 upon the layout.
186\layout Standard
187
188
189\series medium
190The 'enable' string is used by the egroupware API to determine whether
191 an application is disabled, enabled, or enabled but hidden from the navbar.
192 Most applications will want this set to a value of 1 (enabled).
193 The notifywindow app sets this to 2, which keeps it off the navbar.
194 An enable of 0 would disable the app by default.
195 There is one other special case, 3, which is used primarily by the API
196 itself.
197 From the perspective of setup3, the API is an application just like any
198 other application.
199 By setting the 'enable' flag to 3, the API is still enabled, but will not
200 be assignable to a user as a real application.
201 It will thereby be hidden from the admin for application and user/group
202 editing.
203\layout Subsubsection
204
205Table info
206\layout Paragraph
207
208Only applications with database tables will use entries in this section.
209\layout Standard
210
211
212\series medium
213The next section of $setup_info values is an array defining all of the applicati
214on's database tables:
215\layout Code
216
217
218\series medium
219$setup_info['addressbook']['tables'] = array(
220\layout Code
221
222   
223\series medium
224'phpgw_addressbook',
225\layout Code
226
227   
228\series medium
229'phpgw_addressbook_extra'
230\layout Code
231
232
233\series medium
234);
235\layout Standard
236
237
238\series medium
239This is a simple array, and must list accurately the current table names
240 you are using in your application.
241 This list will match a much more complex array of table specifications,
242 as you will see below.
243\layout Subsubsection
244
245Hooks
246\layout Paragraph
247
248Some applications will use this section.
249\layout Standard
250
251
252\series medium
253The hooks array part of $setup_info contains a simple list of hooks the
254 application will use:
255\layout Code
256
257
258\series medium
259$setup_info['addressbook']['hooks'][] = 'preferences';
260\layout Code
261
262
263\series medium
264$setup_info['addressbook']['hooks'][] = 'admin';
265\layout Standard
266
267
268\series medium
269Here we also note a different method of 'stuffing the array.' In any case,
270 this list of hooks will be required soon in order for your hook_admin.inc.php
271 and other files to work.
272 This is being done to cut down on the manual directory listing and file_exists
273 loops done currently to discover hook files.
274 Other than 'preferences' and 'admin', 'home', 'manual', 'after_navbar'
275 and 'navbar_end' are all valid hook entries.
276\layout Subsubsection
277
278Dependencies
279\layout Paragraph
280
281All applications will have at least one entry here.
282\layout Standard
283
284
285\series medium
286The final section, or array of data, is a listing of the other applications
287 your application requires in order to function:
288\layout Code
289
290
291\series medium
292$setup_info['addressbook']['depends'][] = array(
293\layout Code
294
295   
296\series medium
297'appname' => 'phpgwapi',
298\layout Code
299
300   
301\series medium
302'versions' => Array(
303\layout Code
304
305       
306\series medium
307'0.9.10',
308\layout Code
309
310       
311\series medium
312'0.9.11',
313\layout Code
314
315       
316\series medium
317'0.9.12',
318\layout Code
319
320       
321\series medium
322'0.9.13'
323\layout Code
324
325   
326\series medium
327)
328\layout Code
329
330
331\series medium
332);
333\layout Standard
334
335
336\series medium
337This is the standard dependency array for all egroupware applications.
338 It states that this application requires the phpgwapi, and lists the versions
339 with which versions this app is compatible.
340 This list would need to be appended upon each new API release, assuming
341 your application is compatible with this new API version.
342 You may list other applications here, e.g.
343 your app might depend upon 'email' in order to work properly.
344\layout Standard
345
346
347\series medium
348Do
349\series bold
350NOT
351\series medium
352 list applications here without considering this: If you do list an application
353 here, and your app does not really require it, your application will not
354 install unless that other application is already installed.
355 This is handled normally within the install/upgrade process loops, which
356 will install only applications whose dependencies are satisfied.
357 Using a multipass function, the applications are installed in the correct
358 order to ensure that dependencies are resolved.
359 In all cases, the API would be installed first in every new install or
360 upgrade, since all applications depend on the API.
361\layout Subsection
362
363tables_baseline.inc.php (Recommended)
364\layout Subsubsection
365
366Any application that has at least one upgrade routine will have this file.
367\layout Standard
368
369
370\series medium
371The tables_baseline file represents the earliest supported version of an
372 application's tables.
373 This file is used only in the upgrade process, and is critical to its success.
374 It contains an array of database-independent table, field, key and index
375 definitions.
376\layout Standard
377
378
379\series medium
380This array is formatted for use by the class.schema_proc_array.inc.php file
381 in setup3.
382 See the
383\series default
384tables_update
385\series medium
386 section below for more detail about schema_proc, but for now, here is a
387 simple table definition in this format:
388\layout Code
389
390
391\series medium
392$phpgw_baseline = array(
393\layout Code
394
395   
396\series medium
397'skel' => array(
398\layout Code
399
400       
401\series medium
402'fd' => array(
403\layout Code
404
405           
406\series medium
407'skel_id' => array('type' => 'auto','nullable' => false),
408\layout Code
409
410           
411\series medium
412'skel_owner' => array('type' => 'varchar','precision' => 25),
413\layout Code
414
415           
416\series medium
417'skel_access' => array('type' => 'varchar','precision' => 10),
418\layout Code
419
420           
421\series medium
422'skel_cat' => array('type' => 'int','precision' => 4),
423\layout Code
424
425           
426\series medium
427'skel_des' => array('type' => 'text'),
428\layout Code
429
430           
431\series medium
432'skel_pri' => array('type' => 'int','precision' => 4)
433\layout Code
434
435       
436\series medium
437),
438\layout Code
439
440       
441\series medium
442'pk' => array('skel_id'),
443\layout Code
444
445       
446\series medium
447'fk' => array(),
448\layout Code
449
450       
451\series medium
452'ix' => array(),
453\layout Code
454
455       
456\series medium
457'uc' => array()
458\layout Code
459
460   
461\series medium
462)
463\layout Code
464
465
466\series medium
467);
468\layout Standard
469
470
471\series medium
472This multi-dimensional array contains 1 subarray with 5 subs of its own.
473 The first array ('skel' above) defines the table name.
474 Below that are 5 sections, 'fd' for field definitions, 'pk' to define primary
475 keys, 'fk' to define foreign keys, 'ix' to define indexed fields, and 'uc'
476 to define columns that require unique values.
477 In the above example, the table 'skel' has 6 fields (skel_id, skel_owner,
478 skel_access, skel_cat, skel_des, skel_pri), and 'skel_id' is defined also
479 as the primary key for this table.
480 More information on this array is below.
481 But, this format was chosen as an available solution for defining tables
482 and fields without having to maintain seperate files for different databases.
483\layout Subsection
484
485tables_current.inc.php (Recommended)
486\layout Subsubsection
487
488All applications with tables will need this file.
489\layout Standard
490
491
492\series medium
493The tables_current file defines the current table definition that matches
494 the 'version' string in $setup_info as well as the current code.
495 This file is used only for new installs, or whenever the application is
496 removed and reinstalled.
497 The format and name of the array in this file is the same as for the tables_bas
498eline file listed above.
499 In fact, whenever it is required to change your table definitions, you
500 would start by copying the current file over to become the tables_baseline
501 file.
502 After having created your upgrade routines, you would then recreate the
503 current file to match the new table definitions.
504\layout Subsection
505
506tables_update.inc.php (Recommended)
507\layout Subsubsection
508
509Any application which requires an upgrade to a previous version's tables
510 will need this file.
511\layout Standard
512
513
514\series medium
515This file will be the most complex of all setup-oriented files with which
516 you will be working.
517 It will contain all upgrade functions capable of upgrading any possible
518 version of your egroupware app.
519 These upgrade routines roughly match the old setup program's upgrade functions,
520 but the use of objects and the methods have changed dramatically.
521 The simplest version upgrade routine would look like:
522\layout Code
523
524
525\series medium
526$test[] = "0.9.3pre10";
527\layout Code
528
529
530\series medium
531function addressbook_upgrade0_9_3pre10()
532\layout Code
533
534
535\series medium
536{
537\layout Code
538
539   
540\series medium
541global $setup_info;
542\layout Code
543
544   
545\series medium
546$setup_info['addressbook']['currentver'] = '0.9.3';
547\layout Code
548
549   
550\series medium
551return $setup_info['addressbook']['currentver'];
552\layout Code
553
554
555\series medium
556}
557\layout Standard
558
559
560\series medium
561This upgrade function merely updates the current version number.
562 Note that there is not only an upgrade function, but also the setting of
563 a value in the $test array.
564 The name 'test' is a holdover from the old setup program, and is an arbitrary
565 choice.
566 However, this name must be used for the upgrade process to work.
567 Prior to each of your upgrade functions, add the value of the previous
568 version to $test.
569\layout Standard
570
571
572\series medium
573Now look at the function name.
574 The name is important and should be structured as the application name
575 and the version from which you are intending to upgrade.
576 The '.'s in the version string are replaced with '_'.
577\layout Standard
578
579
580\series medium
581Inside the function, we global the $setup_info array.
582 Next, we alter the version number in that array, for our application.
583 Please be careful to specify YOUR application name here.
584 The very last thing we do is to return this new version to the calling
585 function.
586 The upgrade process relies on the value returned, since it uses this directly
587 to determine the new version.
588 This may appear illogical on some level, but it does work.
589 The reason for returning this value instead of a True or 1, etc.
590 has to do with variable scope and lifetime.
591 In this way, even the globaling of $setup_info inside the function may
592 have little effect on the upgrade process.
593 But, there may be values in this array you would want to use within the
594 function.
595 More on that later.
596\layout Standard
597
598
599\series medium
600There is one other variable you would need if doing any database operations
601 here.
602 If you global $phpgw_setup, you will then have access to db and schema_proc
603 objects and functions.
604 The objects of interest here are:
605\layout Itemize
606
607
608\series medium
609$phpgw_setup->oProc
610\layout Itemize
611
612
613\series medium
614$phpgw_setup->db.
615\layout Standard
616
617
618\series medium
619For most database work you should use the oProc object.
620 This also has a db object that should be used for most standard phpgw API
621 db class functions, including $db->query, next_record, num_rows, and f.
622 The use of these for standard db operations is critical to the upgrade
623 process.
624 Schema_proc has a flag that can be set to determine what mode of upgrade
625 we are in.
626 This flag is set in the setup class during the upgrade process, and should
627 not be altered locally.
628\layout Standard
629
630
631\series medium
632This flag is a decision on whether to alter the database or the schema_proc
633 array.
634 The tables_baseline file above is loaded by setup prior to running your
635 upgrade routines.
636 If the current installed version is greater than the current upgrade routine,
637 we don't need to alter the database yet.
638 But schema_proc instead alters the $phpgw_baseline array in memory.
639 The maintenance of this array is done even when we do alter the database.
640 Once our version number in the test array matches the currently installed
641 version of an application, real work on the tables begins.
642\layout Standard
643
644
645\series medium
646'Why bother modifying this array at all', you may ask.
647 The array must be maintained in order to keep current table definition
648 status.
649 This is used in some schema_proc functions when altering columns and tables.
650 This is especially critical for pgsql schema_proc functions.
651\layout Standard
652
653
654\series medium
655By using the $phpgw_setup->oProc object for basic inserts and queries, we
656 acheive the ability to run all upgrade functions in every upgrade cycle
657 without actually altering the database until we reach the current version
658 we actually want to upgrade.
659 For example:
660\layout Code
661
662
663\series medium
664$sql = "SELECT * FROM phpgw_addressbook_extra WHERE contact_name='notes'";
665\layout Code
666
667
668\series medium
669$phpgw_setup->oProc->query($sql,__LINE__,__FILE__);
670\layout Code
671
672
673\series medium
674while($phpgw_setup->oProc->next_record()) {
675\layout Standard
676
677
678\series medium
679We could have used $phpgw_setup->db or even a copy for the above activity.
680 However, using the above method ensures that an array only upgrade does
681 just that.
682 If the flag was set in setup telling schema_proc to alter the array only,
683 we do not want to touch the tables for inserts or selects yet.
684 In this case, $phpgw_setup->oProc->next_record() returns False, and the
685 loop is skipped.
686 The $phpgw_baseline array does not know about table content, only table
687 and field definitions.
688\layout Standard
689
690
691\series medium
692If the upgrade function containing this method is actually working on the
693 tables (currentver <= the upgrade function), then next_record() is returned
694 as the expected action of pulling the next row of data.
695 Inside of this while loop, you can safely use $phpgw_setup->db, or preferably
696 a copy, to do the insert/delete, etc you want to have happen here.
697\layout Code
698
699    $cid = $phpgw_setup->oProc->f('contact_id');
700\layout Code
701
702    $cvalu = $phpgw_setup->oProc->f('contact_value');
703\layout Code
704
705   
706\series medium
707$update = "UPDATE phpgw_addressbook set note='" .
708 $cvalu .
709 "' WHERE id=" .
710 $cid;
711\layout Code
712
713   
714\series medium
715$db1->query($update);
716\layout Code
717
718   
719\series medium
720$delete = "DELETE FROM phpgw_addressbook_extra WHERE contact_id=" .
721 $cid .
722 " AND contact_name='notes'";
723\layout Code
724
725   
726\series medium
727$db1->query($delete);
728\layout Code
729
730}
731\layout Standard
732
733
734\series medium
735$db1 is a copy of $phpgw_setup->db, to avoid potential conflicts with the
736 rest of setup's db activities.
737\layout Standard
738
739In addition to the basic API db class functions, schema_proc introduces
740 the following special functions:
741\layout Code
742
743function DropTable($sTableName)
744\layout Code
745
746function DropColumn($sTableName, $aTableDef, $sColumnName)
747\layout Code
748
749function RenameTable($sOldTableName, $sNewTableName)
750\layout Code
751
752function RenameColumn($sTableName, $sOldColumnName, $sNewColumnName)
753\layout Code
754
755function AlterColumn($sTableName, $sColumnName, $aColumnDef)
756\layout Code
757
758function AddColumn($sTableName, $sColumnName, $aColumnDef)
759\layout Code
760
761function CreateTable($sTableName, $aTableDef)
762\layout Standard
763
764Please use these functions where appropriate in place of standard SQL CREATE,
765 DROP, and ALTER TABLE commands.
766 This will ensure that your upgrade script works for all supported databases.
767\layout Standard
768
769Of these functions, DropTable, RenameTable, and RenameColumn are pretty
770 straightforward.
771 Pass these the table names you wish to Drop/Rename, and schema_proc will
772 handle the rest, including indexes and sequences, where applicable.
773\layout Standard
774
775The remaining functions require some explanation:
776\layout Itemize
777
778CreateTable:
779\layout Code
780
781$phpgw_setup->oProc->CreateTable(
782\layout Code
783
784    'categories', array(
785\layout Code
786
787        'fd' => array(
788\layout Code
789
790            'cat_id' => array('type' => 'auto','nullable' => false),
791\layout Code
792
793            'account_id' => array('type' => 'int','precision' => 4,'nullable'
794 => false, 'default' => 0),
795\layout Code
796
797            'app_name' => array('type' => 'varchar','precision' => 25,'nullable'
798 => false),
799\layout Code
800
801            'cat_name' => array('type' => 'varchar', 'precision' => 150,
802 'nullable' => false),
803\layout Code
804
805            'cat_description' => array('type' => 'text', 'nullable' => false)
806\layout Code
807
808        ),
809\layout Code
810
811        'pk' => array('cat_id'),
812\layout Code
813
814        'ix' => array(),
815\layout Code
816
817        'fk' => array(),
818\layout Code
819
820        'uc' => array()
821\layout Code
822
823    )
824\layout Code
825
826);
827\layout Standard
828
829Does this look familiar? The array passed to CreateTable is in the format
830 used also in tables_baseline and tables_current.
831 Note a slight difference where the table name is being passed as a seperate
832 argument.
833 The second argument to the function is the table definition array, starting
834 with 'fd'.
835\layout Itemize
836
837AddColumn:
838\layout Code
839
840$phpgw_setup->oProc->AddColumn('phpgw_categories','cat_access',array('type'
841 => 'varchar', 'precision' => 25));
842\layout Standard
843
844Here we pass the table name of an existing table, the new column name, and
845 a field definition.
846 This definition is merely a slice of the table arrays found earlier in
847 this document.
848\layout Itemize
849
850AlterColumn:
851\layout Code
852
853$phpgw_setup->oProc->AlterColumn('phpgw_sessions','session_action',array('type'
854 => 'varchar', 'precision' => '255'));
855\layout Standard
856
857The format of this function matches AddColumn.
858 It is also a simple case of passing the table name, field name, and field
859 definition.
860\layout Itemize
861
862DropColumn:
863\layout Code
864
865$newtbldef = array(
866\layout Code
867
868    "fd" => array(
869\layout Code
870
871        'acl_appname' => array('type' => 'varchar', 'precision' => 50),
872\layout Code
873
874        'acl_location' => array('type' => 'varchar', 'precision' => 255),
875\layout Code
876
877        'acl_account' => array('type' => 'int', 'precision' => 4),
878\layout Code
879
880        'acl_rights' => array('type' => 'int', 'precision' => 4)
881\layout Code
882
883    ),
884\layout Code
885
886    'pk' => array(),
887\layout Code
888
889    'ix' => array(),
890\layout Code
891
892    'fk' => array(),
893\layout Code
894
895    'uc' => array()
896\layout Code
897
898);
899\layout Code
900
901$phpgw_setup->oProc->DropColumn('phpgw_acl',$newtbldef,'acl_account_type');
902\layout Standard
903
904This is the most complicated function in schema_proc, from the user's perspectiv
905e.
906 Its complexity is necessitated by the requirement of some databases to
907 recreate a table in the case of dropping a column.
908 Note that the table definition array is being used yet again.
909 The array defined here should match the table definition you want after
910 this function has completed.
911 Here, we are dropping the column 'acl_account_type' from the table 'phpgw_acl',
912 and the table definition does not have this column defined.
913 You could copy information from your tables_current file here and edit
914 it to match the desired new table spec, less the column you wish to drop.
915\layout Standard
916
917There are additional functions within schema_proc, the majority of which
918 are not to be called directly.
919 They are used internally.
920 If you do wish to investigate further, use class.schema_proc.inc.php as your
921 guide.
922 This master file includes the class.schema_proc_DBMS.inc.php and class.schema_proc_
923array.inc.php files.
924 The DBMS files should not be used as a guide, since their functions are
925 called from the master class, and the parameters are different from what
926 you might expect relative to the master.
927\layout Standard
928
929
930\series bold
931PLEASE, DO NOT WRITE TO OR ALTER ANOTHER APPLICATION'S TABLES OR THE API
932 TABLES IN YOUR APPLICATION UPGRADE FUNCTIONS!
933\layout Subsection
934
935default_records.inc.php (Optional)
936\layout Subsubsection
937
938Any application with tables that wants to load some default data will need
939 this file.
940\layout Standard
941
942The default_records file consists of a list of SQL INSERTs using the $oProc
943 object directly:
944\layout Code
945
946$oProc->query("INSERT INTO phpgw_inv_statuslist (status_name) VALUES ('available
947')");
948\layout Code
949
950$oProc->query("INSERT INTO phpgw_inv_statuslist (status_name) VALUES ('no
951 longer available')");
952\layout Code
953
954$oProc->query("INSERT INTO phpgw_inv_statuslist (status_name) VALUES ('back
955 order')");
956\layout Standard
957
958In this case, the developer wanted to insert some status information, which
959 was then used in a select box on an html form.
960 Using the default_records file, every new install will have this data included.
961 This file should consist of queries applicable to the tables defined in
962 setup.inc.php and tables_current.inc.php.
963\layout Subsection
964
965test_data.inc.php (Optional)
966\layout Subsubsection
967
968Any developer wanting to test the full list of upgrade routines can use
969 this file.
970\layout Standard
971
972test_data.inc.php is similar to default_records above.
973 It is called only by schematoy.php and is never installed with a new install
974 or upgrade.
975 This is a developer-only file.
976 The INSERTs here should be applicable to the tables_baseline table definitions.
977\layout Subsection
978
979language files (Required)
980\layout Subsubsection
981
982All applications should have at least a file of English translations, used
983 for their application lang() calls.
984\layout Itemize
985
986Format of a lang file:
987\layout Code
988
989{phrase}{TAB}{appname}{TAB}{LANG_CODE}{TAB}{translation}
990\layout Code
991
992    e.g:
993\layout Code
994
995first name    common    en    First Name
996\layout Code
997
998first name    common    de    Vorname
999\layout Itemize
1000
1001Filenames:
1002\layout Code
1003
1004phpgw_{LANG_CODE}.lang
1005\layout Code
1006
1007  e.g.
1008\layout Code
1009
1010English: phpgw_en.lang
1011\layout Code
1012
1013German: phpgw_de.lang
1014\layout Standard
1015
1016Please see the contents of the API 'languages' table for the correct setting
1017 of the LANG_CODE.
1018\layout Section
1019
1020Developer Tools
1021\layout Subsection
1022
1023sqltoarray.php
1024\layout Subsubsection
1025
1026Displays the current schema_proc array defining an application's tables.
1027\layout Standard
1028
1029This web application reads the current table status live from the database.
1030 It then parses this information into a hopefully correct table definition
1031 array for schema_proc.
1032 Upon visiting this app, you are shown a list of currently installed application
1033s with defined tables.
1034 You may then select one app or all apps, and then submit the form.
1035 From this form you may then download a tables_current file, suitable for
1036 commission to cvs.
1037 Please do check the format to make sure the definitions are correct.
1038\layout Subsection
1039
1040schematoy.php
1041\layout Subsubsection
1042
1043Runs the full cycle of upgrades, including optional test_data.
1044\layout Standard
1045
1046This app is not beautiful, may bomb on you, and will definitely drop your
1047 application's tables.
1048 The display is similar to the user/admin tool, applications.php.
1049 You are shown a list of apps with tables.
1050 Select one app, and enter a target version.
1051 Upon submission of the form:
1052\layout Itemize
1053
1054All application tables are dropped.
1055\layout Itemize
1056
1057tables_baseline.inc.php is loaded.
1058\layout Itemize
1059
1060test_data.inc.php is loaded
1061\layout Itemize
1062
1063tables_update.inc.php is loaded.
1064\layout Itemize
1065
1066a full application upgrade test begins.
1067\layout Standard
1068
1069This will give a LOT of debugging output.
1070 Depending on your database, the process may take quite awhile.
1071 This tool should be considered as a destructive test of the full upgrade
1072 cycle.
1073 If the upgrade process is successful, you can then check the loaded test_data
1074 to see that it is still in place as expected after all the table modifications,
1075 etc.
1076 If not, it should be clear where the error has occurred.
1077 Look for the usual INVALID SQL warnings, among others.
1078\layout Subsection
1079
1080tools subdirectory
1081\layout Subsubsection
1082
1083some utilities for sql file conversion, etc.
1084\layout Standard
1085
1086In the tools directory under setup3, there should be at least a couple of
1087 hopefully handy perl or shell scripts.
1088 These are for running on the commandline only, and might apply to converting
1089 SQL files into lang files, etc.
1090 They are not expected to be perfect, but might offer some assistance or
1091 ideas for additional utilities.
1092 Use these at your own risk or benefit.
1093\layout Section
1094
1095The install/upgrade process
1096\layout Subsection
1097
1098Overview
1099\layout Subsubsection
1100
1101Setup internal upgrade functions
1102\layout Standard
1103
1104Setup uses a common set of functions for new installs and upgrades.
1105 These are implemented as multi-pass loops.
1106 For a single application install or upgrade, a single pass is done.
1107 For multiple application installs or upgrades, multiple passes are done
1108 automatically.
1109 The order of install in a mass install or upgrade is determined by application
1110 dependencies.
1111 The other determining factor is the order in which the application directories
1112 and setup.inc.php files are read from the filesystem.
1113\layout Subsection
1114
1115New installs
1116\layout Subsubsection
1117
1118Detection
1119\layout Standard
1120
1121Each run of index.php or applications.php in setup3 first runs a set of detection
1122 routines.
1123 These read the data from each setup.inc.php file, and from the 'applications'
1124 or 'phpgw_applications' table as appropriate, and only if one of these
1125 tables exists.
1126 This data is parsed into the $setup_info array.
1127 In this case, this array contains information about all applications.
1128 Based on the information gathered, a status flag is set to one of the following
1129 values:
1130\layout Itemize
1131
1132U - Upgrade required/available
1133\layout Itemize
1134
1135R - upgrade in pRogress
1136\layout Itemize
1137
1138C - upgrade Completed successfully
1139\layout Itemize
1140
1141D - Dependency failure
1142\layout Itemize
1143
1144F - upgrade Failed
1145\layout Itemize
1146
1147V - Version mismatch at end of upgrade
1148\layout Itemize
1149
1150M - Missing files at start of upgrade (Not used, proposed only)
1151\layout Standard
1152
1153Using this information, the setup logic in index.php determines what mode
1154 we are in.
1155 index.php is not capable of being selective about which application it found
1156 as being out of sync.
1157 It is designed only for 'Simple Application Management', which is Step
1158 1 of the setup process.
1159 For more selective application manipulation, use applications.php.
1160 index.php then tells the user that 1) their applications are current 2)
1161 some of their applications are out of sync 3) no db exists, etc.
1162 For a new install, all applications will be out of sync, since there is
1163 not even an 'phpgw_applications' table in the database to tell setup what
1164 the status is for any application.
1165\layout Subsubsection
1166
1167Selection
1168\layout Standard
1169
1170There is no selection for application installs in 'new install' mode.
1171 All physically present applications will be installed, or at least attempted.
1172\layout Subsubsection
1173
1174Installation
1175\layout Standard
1176
1177Once the setup user clicks the magic button to install all applications,
1178 the following occurs:
1179\layout Itemize
1180
1181The setup_info array is passed to the process_pass() function, using a method='n
1182ew'
1183\layout Itemize
1184
1185Applications whose status flag='U' (API on first pass) are then handed off
1186 to the process_current() function.
1187 This handles inclusion and installation of the application's tables_current.inc.p
1188hp file.
1189\layout Itemize
1190
1191The application is registered as a new application in the 'phpgw_applications'
1192 table.
1193 If for some reason there is old data in this table for this application,
1194 it will be updated instead.
1195 Its hooks, if any, are registered in the 'phpgw_hooks' table.
1196\layout Itemize
1197
1198Next, this array is passed to the process_default_records() function.
1199 If this file is present in the current application's setup directory, the
1200 queries here are run to install the data to the application's table(s).
1201\layout Itemize
1202
1203The above is repeated until all application status flags equal 'C'.
1204 However, if an application install failed for some reason, it will then
1205 be skipped on the next pass.
1206 This keeps the loop from running away.
1207\layout Subsection
1208
1209Upgrades
1210\layout Subsubsection
1211
1212Detection
1213\layout Standard
1214
1215Only an API version mismatch will trigger an automated request for the user
1216 to upgrade their install.
1217 Once the api is current, they can move on to applications.php for more 'Advanced
1218 Application Management', which is Step 4 of the setup process.
1219 However, if the API is out of sync, clicking 'Upgrade' in index.php will
1220 also attempt to upgrade other applications which may be out of sync, as
1221 well.
1222 As the phpgwapi continues to stabilize, it is felt that this method of
1223 upgrading will become less and less common.
1224\layout Subsubsection
1225
1226Selection
1227\layout Standard
1228
1229Within applications.php, a color-coded matrix of application status and actions
1230 is displayed.
1231 Depending on the status flag of each application, certain actions will
1232 be either enabled or disabled.
1233 These actions include 'install', 'upgrade', 'remove'.
1234 If something is very wrong with previous attempts to install or upgrade
1235 an application, another column called 'resolution' will then display a
1236 link.
1237 This link will display additional information which would be helpful for
1238 determining how to resolve the problem.
1239 Assuming all is well, the user can select applications requiring upgrade
1240 from this list.
1241 Once selected, they submit the form.
1242 This runs the follow three routines in order:
1243\layout Itemize
1244
1245remove
1246\layout Itemize
1247
1248install
1249\layout Itemize
1250
1251upgrade
1252\layout Subsubsection
1253
1254Upgrade
1255\layout Standard
1256
1257The idea here is that multiple actions can be selected and run in order
1258 in one click.
1259 In any case, once they select an application for upgrade, the following
1260 occurs:
1261\layout Itemize
1262
1263A stripped down version of the setup_info array is passed to the process_upgrade
1264() function.
1265 This array contains only the information for the selected application
1266\layout Itemize
1267
1268Within process_upgrade(), the tables_baseline.inc.php file for the application
1269 is loaded.
1270\layout Itemize
1271
1272The tables_update.inc.php file for the application is loaded
1273\layout Itemize
1274
1275The contents of the test array is used to loop through the entire list of
1276 upgrade functions for the application.
1277 The application's unique function names are rebuilt, then run.
1278\layout Itemize
1279
1280When the currentver (installed) matches the version (available), process_upgrade
1281() exits, setting the status flag for the app to 'C'.
1282\layout Itemize
1283
1284Just prior to exiting, the application and its hooks are updated into the
1285 'phpgw_applications' and 'phpgw_hooks' tables.
1286\layout Subsection
1287
1288Uninstallation/Removal
1289\layout Subsubsection
1290
1291Selection
1292\layout Standard
1293
1294Selective removal of an application is done via applications.php, in a manner
1295 similar to the method above for upgrades.
1296\layout Subsubsection
1297
1298Uninstallation
1299\layout Standard
1300
1301Once an application is selected for removal:
1302\layout Itemize
1303
1304A stripped down version of the setup_info array is passed to the process_droptab
1305les() function.
1306 This function removes all of the application's defined tables, but only
1307 after first checking to see if the tables are there.
1308 In this way, we attempt to cut down on the number of errors sent to the
1309 browser.
1310\layout Itemize
1311
1312The application's hooks are deregistered (removed from 'phpgw_hooks').
1313\layout Itemize
1314
1315The application itself is deregistered (removed from 'phpgw_applications').
1316\layout Section
1317
1318Caveats
1319\layout Subsection
1320
1321Must see info
1322\layout Subsubsection
1323
1324Auto fields
1325\layout Standard
1326
1327For auto type fields, schema_proc creates a sequence automatically based
1328 on the table name for databases that require sequences.
1329 In the case of postgresql, the limit for this name based on our tests is
1330 31 characters.
1331 The schema_proc format is:
1332\layout Code
1333
1334$sSequenceSQL = sprintf("CREATE SEQUENCE seq_%s", $sTableName);
1335\layout Standard
1336
1337This limits the maximum length for a tablename to 27 characters.
1338 Based on the tablename standard in phpgw of 'phpgw_tablename', you are
1339 further limited to 21 characters in which to describe your table.
1340 You will need to be less descriptive in some cases, e.g.
1341 use 'phpgw_widget_cats' instead of 'phpgw_widget_info_categories'.
1342\layout Standard
1343
1344To maintain compatibility with MySQL 3.22.X, please always add
1345\begin_inset Quotes eld
1346\end_inset
1347
1348'nullable' => False
1349\begin_inset Quotes erd
1350\end_inset
1351
1352 to your field spec for an auto field.
1353 This and probably older versions of MySQL require that specification within
1354 the SQL for a field that will also be an index or unique field, which for
1355 our uses should typically be true for an auto field.
1356 MySQL 3.23.X and PostgreSQL do not have this issue.
1357\layout Subsubsection
1358
1359Default 0
1360\layout Standard
1361
1362For int fields, a default of 0 is not assumed.
1363 Only some databases will set this default for you, MySQL being one.
1364 You will need to explicitly define this default in the table definition.
1365 Also, for auto fields, do not enter a default, since the resulting SQL
1366 query would fail on many RDBMS.
1367\the_end
Note: See TracBrowser for help on using the repository browser.